2012-02-17 17 views
0

記述が作成する仮想マシンで実行します:CILを作成C#のパーサ、ASTツリー、CILを作成し、私の問題の

  • 解析された入力は.csファイルから

    1. C#のパーサ
    2. コンASTツリープログラム
    3. の/バイトコード表現
    4. VMを作成し、「バイトコード」として記憶されているコードを実行 -
    解析されたプログラムを動作させます10

    基本的に私はすべての "もの"で自分の言語を書く必要があります。

    実行したいサンプルプログラムを作成します。私はこのプログラムを処理し、ASTツリーを作成するためにC#パーサーを作成する方法を知っています。

    またCILリファレンスhttp://en.csharp-online.net/CIL_Instruction_Setが見つかりましたので、ASTをCILコードとして保存できます(うまくいけば問題ありません)。 私の疑問は、仮想マシンを使用する前に、このCILをどのようにテストできますか? C#CLRを使用できますか?そしてどうやって?

    C#でCIL命令を実行するバーチャルマシンを作成するにはどうすればよいですか? C#プログラムを強制的にCIL命令を実行させることができますか?

    私の考えは、正しいですか? CIL命令を使用してバイトコードにASTを書き込むのは避ける必要がありますか?

    私のアイデアは、.NET http://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/CLR_diag.svg/400px-CLR_diag.svg.png

    に触発されたが、この問題を解決するための正しい方法を見つけるために私を助ける任意の回答をいただき、ありがとうございます。

    P.S. 自分

    EDITは

    私はこれを見つけたことで、私はすべてを実装する必要があります。http://msdn.microsoft.com/en-us/magazine/cc136756.aspx

    http://www.codeproject.com/Articles/3778/Introduction-to-IL-Assembly-Language

    http://www.codeguru.com/csharp/.net/net_general/il/article.php/c4635#Array1

    は、それは私の問題を解決する可能性があります。私はそれを試してみましょう。

    +2

    CILを作成したら、なぜ自分のVMを作成したいのですか?それはちょうどネットを改革していないのですか? Monoソースとこの答えを見たいと思ったら:http://stackoverflow.com/questions/3328901/how-to-insert-cil-code-to-c-sharp –

    +0

    あなたは式を見ましたか?木? http://msdn.microsoft.com/en-us/library/bb397951.aspxまた、なぜC#パーサーを記述したいのですか?利用可能なものがたくさんあります。 –

    +0

    こんにちは、それは宿題なので...私はすべてを自分で実装する必要があります: -/ – luccio

    答えて

    1

    あなたのリストから順番にタスクを実行します:まず、C#で単純なVM(CILインタープリタ)を作成します。私は、手作業で作成されたCILシーケンスはほとんど試されませんでした。私がその作業をしたら、VMがサポートしているものに対応するCILの小さなサブセットを生成し、それをテストする小さなコンパイラを構築します。それから私は、私が望むサポートがあるまで、徐々にこれを洗練します。

    +0

    VMから始めるにはどのようなアイディアがありますか? – luccio

    +0

    これは基本的にはループ内のswitch文で、命令ポインタのインデックスを持ち、バイトコード化された命令の配列を繰り返します。それぞれの場合、命令の機能が実装されています。原則としてシンプル: –

    +0

    私に道を見せてくれてありがとう。しかし、ネイティブコードの指示はどこで見つけることができますか?申し訳ありませんが疑わしい質問...コンパイラのいくつかのソースコードネイティブコードには素晴らしいだろう。 – luccio

    0

    C#パーサーとILコードエミッタ(それ自体は小さなタスクではなく、C#仕様の長さを見てください)を書いていると仮定すると、コードを実行する通常の方法はアセンブリを作成することです。必要なメタデータと一緒にILコードを含むexeファイルまたは.dllファイル。その後、他の.NETアセンブリと同じ方法で使用できます。

    C#でアセンブリを作成するには、System.Reflection.Emitを使用します。具体的には、AppDomain.DefineDynamicAssembly()で始まります。

    もう1つの方法として、アセンブリ全体を作成したくない場合は、ただ1つの方法をDynamicMethodとします。