コンパイラ作成を支援するライブラリです。ライブラリは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");