Какие существуют способы для создания MSIL из неуправляемого кода - PullRequest
6 голосов
/ 11 июля 2010

Я пытаюсь создать бэкэнд моего языка для платформы .NET. Внешний интерфейс и интерпретатор написаны на Delphi. Неуправляемый API позволяет только определения типов, но не отправляет MSIL.

Какие существуют способы создания MSIL из неуправляемого кода? Без использования Reflection.Emit и ILasm для достижения этой цели? Спасибо.

Ответы [ 4 ]

5 голосов
/ 13 июля 2010

Генератор кода .NET Delphi выдает IL в виде байт-кода непосредственно в память, во многом как генерация кода x86, хотя и с соответствующими заголовками и т. Д. То есть генератор кода напрямую генерирует байты, таблицы исключений и т. Д., Соответствующие кодированному формату IL.Это не делается с помощью API, а скорее по старинке: пишите код по байтам за раз.

Позже встроенный компоновщик Delphi работает с IMetaDataEmit и т. Д. Для генерации метаданных.и IMetaDataEmit::SetRVA, чтобы сообщить метаданным, где будет находиться код в исполняемом файле.Метаданные копируются с помощью IMetaDataEmit::SaveToMemory, а затем копируются в PE, созданный компоновщиком, с соответствующим исправлением заголовка CLR, указывающего на начало метаданных.

Это большой код, некоторыеиз этого, так как он в значительной степени пронизан через существующий компоновщик x86 в Delphi, который выполняет такие вещи, как оптимизация веток и удаление неиспользуемого кода (умные ссылки), что, строго говоря, обычно не требуется для .NET.

Если бы нам пришлось делать все это снова, мы вполне могли бы избегать .NET API для создания метаданных и генерировать все это прямо из спецификации.API оказались «черным ящиком» для оптимизации и добавили значительное время компиляции.

3 голосов
/ 11 июля 2010

С неуправляемый код?TBH, лучшее предложение, которое у меня есть, это либо «использовать P / Invoke», либо «выяснить, что он должен делать, и заново его реализовать».найти что-то для переноса неуправляемого кода, и даже если он работает - это не совсем то, что нужно для использования инфраструктуры.И это не точно 1: 1 между неуправляемым и управляемым.

2 голосов
/ 11 июля 2010

MSIL или CIL - это, по сути, .Net эквивалент машинного кода . Когда вы анализируете язык и переводите его в машинный код, вы получаете компилятор . Ранние компиляторы на любом языке обычно генерируют свой машинный код вручную. То есть для каждого вида команды или выражения на исходном языке напишите «шаблон» инструкций ассемблера для его перевода. Когда вы работаете с промежуточным представлением программы, выберите соответствующий шаблон, заполните подробные сведения о программе и создайте CIL. Для основанного на стеке языка, такого как CIL, должно быть довольно легко объединить шаблоны из нескольких операторов; стек вывода одного оператора является стеком ввода следующего.

Возможно, вы захотите ознакомиться с набором команд CIL .

Тот факт, что ваш компилятор является неуправляемым кодом, не имеет значения. Вы можете генерировать текст CIL из любой программы, которую вы хотите. Когда он будет готов, отправьте его через ilasm, чтобы создать из него сборку.

2 голосов
/ 11 июля 2010

Ты усложняешь.Библиотеки инфраструктуры Irony и Common Compiler Infrastructure, доступные на Codeplex.com, отсутствуют, они предназначены для компиляторов, реализованных в управляемом коде.Следующая опция использует интерфейсы неуправляемых метаданных, такие как IMetaDataAssemblyEmit, IMetaDataAssemblyImport, IMetaDataEmit2.Однако эти COM-интерфейсы объявлены в заголовочном файле cor.h SDK, который подходит только для использования программой на C / C ++.Для них нет библиотеки типов.За исключением кропотливого копирования объявлений интерфейса, вам понадобится какой-то инструмент для преобразования их в объявления Delphi.Не уверен, что это существует.

...