#topicpath

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

- ソース: &ref(CompilerLib-20070108.zip);
-- 備考: 簡単なEXEを出力
- ライセンス: パブリックドメイン

#include(:VCS2005Exp,notitle)

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

以下の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");


** コメント [#m2d815ec]

#comment(below)

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