Top / CompilerLib

コンパイラ作成を支援するライブラリです。ライブラリはC#のマネージドコードですが、出力するのはネイティブバイナリです。

コンパイラの内部処理用ライブラリを想定しているため、言語処理系を含んでいません。テキストではなくオブジェクトを渡します。コードをコードで組み立てて出力するというイメージです。

以下のC言語のソースと同等のものを作成するとします。

#include <windows.h>

int main()
{
    HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE);
    const char* hello = "Hello, World!\r\n";
    DWORD dummy;
    WriteConsole(stdout, hello, strlen(hello), &dummy, NULL);
    return 0;
}

CompilerLibを利用したコードは以下のようになります。

   Module module = new Module();
   List<OpCode> c = new List<OpCode>();
   const int STD_OUTPUT_HANDLE = -11;
   Function GetStdHandle = module.GetFunction(CallType.Std, "kernel32.dll", "GetStdHandle");
   Function WriteConsole = module.GetFunction(CallType.Std, "kernel32.dll", "WriteConsoleW");
   Function ExitProcess = module.GetFunction(CallType.Std, "kernel32.dll", "ExitProcess");
   // HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE);
   IntAddr32 stdout = new IntAddr32(module.GetInt32("stdout"));
   c.AddRange(GetStdHandle.Invoke(STD_OUTPUT_HANDLE));
   c.Add(I386.Mov(stdout, Reg32.EAX));
   Ref<uint> dummy = module.GetInt32("dummy");
   string hello = "Hello, World!\r\n";
   c.AddRange(WriteConsole.Invoke(stdout, hello, hello.Length, dummy, 0));
   c.AddRange(ExitProcess.Invoke(0));
   module.Text.OpCodes = c.ToArray();
   module.Link("output.exe");

コメント



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS