Какие пути существует для генерации MSIL из неуправляемого кода

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

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

6
задан Sergey Antonov 11 July 2010 в 08:09
поделиться

4 ответа

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

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

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

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

5
ответ дан 9 December 2019 в 20:39
поделиться

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

Даже если вы сможете найти что-нибудь для переноса неуправляемого кода, и даже если это сработает - это точно не будет использовать фреймворк. И это не совсем 1: 1 между неуправляемым и управляемым.

3
ответ дан 9 December 2019 в 20:39
поделиться

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

2
ответ дан 9 December 2019 в 20:39
поделиться

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

Вы захотите ознакомиться с набором инструкций CIL .

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

2
ответ дан 9 December 2019 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: