Вопрос

Я пытаюсь написать свою собственную игрушку My Toy Language - > Компилятор MSIL, чтобы лучше понять, как работают компиляторы. Я получил синтаксический анализ и лексинг, я построил деревья выражений и, используя API дерева выражений System.Linq.Expressions, у меня есть рабочий интерпретатор. Теперь я хотел бы выпустить несколько реальных сборок MSIL.

Проблема в том, что я не могу понять, как на самом деле собрать эти сборки. MethodBuilder только принимает необработанные тела методов MSIL так что я должен получить сырой MSIL моего дерева выражений. Вызов Expression.Compile () возвращает работающего делегата, но я не в состоянии получить его основной MSIL. Вызов MethodInfo.GetMethodBody () вызывает исключение InvalidOperationException так как он не реализован в этом конкретном дочернем классе.

Как я могу связать этого делегата в новую сборку?

Это было полезно?

Решение

Просто нашел это. Версия LambdaExpression для DLR предоставляет метод CompileToMethod, который делает именно то, что мне нужно.

lambdaExpression.CompileToMethod(myMethodBuilder);

Другие советы

Чтобы испускать сырой IL, вам нужно определить свой собственный AST. Вам нужно получить AssemblyBuilder, затем ModuleBuilder, а затем вы можете определить метод уровня модуля или получить новый TypeBuilder и теперь MethodBuilder для определения метода уровня класса.

Вы сказали, что у вас уже есть лексер и парсер. это означает, что вы можете построить АСТ. Так что просто пройдитесь по разобранным выражениям и испустите свой IL.

Даже если вы получите сгенерированный (путем компиляции) код, вы не сможете сделать что-то полезное с ним, поскольку сгенерированный код зависит от инфраструктуры. Например, если вам нужно скомпилировать замыкания, вы должны создать класс или другое хранилище для лексических переменных и т. Д. (Например, не лексическая передача управления, которая требует использования исключений в .net)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top