Question

J'essaie d'écrire mon propre jouet Mon langage de jouet - > Compilateur MSIL afin de mieux comprendre le fonctionnement des compilateurs. J'ai réussi à analyser et à analyser le langage, j'ai construit les arbres d'expression et, à l'aide de l'API de l'arbre d'expression System.Linq.Expressions, j'ai un interpréteur fonctionnel. Maintenant, j'aimerais émettre de vrais assemblages MSIL.

Le problème est que je ne vois pas comment construire ces assemblages. La classe MethodBuilder n'accepte que les corps de méthode MSIL bruts , donc je dois obtenir le MSIL brut de mon arbre d’expression. L'appel de Expression.Compile () renvoie un délégué actif, mais je ne le suis pas. capable d'obtenir son MSIL sous-jacent. L'appel à MethodInfo.GetMethodBody () génère une InvalidOperationException. car il n'est pas implémenté dans cette classe spécifique.

Comment puis-je associer ce délégué à un nouvel assemblage?

Était-ce utile?

La solution

Je viens de le trouver. La version DLR de LambdaExpression expose une méthode CompileToMethod qui fait exactement ce dont j'ai besoin.

lambdaExpression.CompileToMethod(myMethodBuilder);

Autres conseils

Pour émettre une IL brute, vous devez définir votre propre AST. Vous devez obtenir AssemblyBuilder, puis ModuleBuilder, puis définir une méthode au niveau du module ou obtenir un nouveau TypeBuilder et désormais, MethodBuilder pour définir une méthode au niveau de la classe.

Vous avez dit que vous avez déjà lexer et l’analyseur. cela signifie que vous êtes capable de construire AST. Il suffit donc de parcourir les expressions analysées et d’émettre votre IL.

Même si vous obtenez un code généré (par compilation), vous ne pourrez rien y faire d’utile, car le code généré dépend de l’infrastructure. Par exemple, si vous devez compiler des fermetures, vous devez créer une classe ou un autre magasin de variables lexicales, etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top