6

コンパイラがどのように機能するかをよりよく理解するために、自分のおもちゃ My Toy Language -> MSIL コンパイラを作成しようとしています。構文解析と字句解析が機能し、式ツリーを構築し、System.Linq.Expressions 式ツリー API を使用して、機能するインタープリターを取得しました。ここで、実際の MSIL アセンブリを出力したいと思います。

問題は、これらのアセンブリを実際に構築する方法がわからないことです。MethodBuilderクラスは生の MSIL メソッド本体のみを受け入れるため、式ツリーの生の MSIL を取得する必要があります。Expression.Compile()を呼び出すと、作業デリゲートが返されますが、基になる MSIL を取得できません。MethodInfo.GetMethodBody()を呼び出すと、その特定の子クラスに実装されていないため、InvalidOperationException がスローされます。

そのデリゲートを新しいアセンブリにリンクするにはどうすればよいですか?

4

2 に答える 2

4

ちょうどそれを見つけました。LambdaExpression の DLR バージョンは、私がまさに必要としている CompileToMethod メソッドを公開します。

lambdaExpression.CompileToMethod(myMethodBuilder);
于 2009-10-24T22:48:45.847 に答える
0

生の IL を発行するには、独自の AST を定義する必要があります。AssemblyBuilder を取得してから ModuleBuilder を取得する必要があります。次に、モジュール レベルのメソッドを定義するか、新しい TypeBuilder を取得してから MethodBuilder を取得して、クラス レベルのメソッドを定義します。

あなたはすでにレクサーとパーサーを持っていると言いました。つまり、AST をビルドできるということです。したがって、解析された式を調べて、IL を出力するだけです。

(コンパイルによって) 生成されたコードを取得したとしても、生成されたコードはインフラストラクチャに依存するため、それを使用して何か有用なことを行うことはできません。たとえば、クロージャーをコンパイルする必要がある場合は、レキシカル変数などのクラスまたはその他のストアを作成する必要があります(.netで例外を使用する必要がある非レキシカル制御転送のように)

于 2009-10-24T18:36:33.613 に答える