Domanda

Sto cercando di scrivere il mio giocattolo My Toy Language - > Compilatore MSIL per comprendere meglio come funzionano i compilatori. Ho fatto funzionare l'analisi e il lexing, ho creato gli alberi delle espressioni e usando l'API dell'albero delle espressioni System.Linq.Expressions, ho un interprete funzionante. Ora vorrei emettere alcuni veri assemblaggi MSIL.

Il problema è che non riesco a capire come costruire effettivamente questi assembly. La classe MethodBuilder accetta solo corpi del metodo MSIL non elaborati , quindi devo ottenere il file MSIL non elaborato del mio albero delle espressioni. La chiamata di Expression.Compile () restituisce un delegato funzionante ma non lo sono in grado di ottenere il suo MSIL sottostante. La chiamata di MethodInfo.GetMethodBody () genera una InvalidOperationException poiché non è implementato in quella specifica classe figlio.

Come posso collegare quel delegato in un nuovo assembly?

È stato utile?

Soluzione

L'ho appena trovato. La versione DLR di LambdaExpression espone un metodo CompileToMethod che fa esattamente ciò di cui ho bisogno.

lambdaExpression.CompileToMethod(myMethodBuilder);

Altri suggerimenti

Per emettere IL grezzi è necessario definire il proprio AST. È necessario ottenere AssemblyBuilder quindi ModuleBuilder e quindi è possibile definire il metodo a livello di modulo o ottenere un nuovo TypeBuilder e ora MethodBuilder per definire il metodo a livello di classe.

Hai detto che hai già lexer e parser. ciò significa che sei in grado di costruire AST. Quindi cammina attraverso le espressioni analizzate ed emetti il ??tuo IL.

Anche se ricevi il codice generato (dalla compilazione) non sarai in grado di fare qualcosa di utile poiché il codice generato dipende dall'infrastruttura. Ad esempio, se è necessario compilare chiusure, è necessario creare una classe o un altro archivio per variabili lessicali e così via (come il trasferimento di controllo non lessicale che richiede l'uso di Eccezioni in .net)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top