создайте парсер c #, дерево AST, CIL и запустите его на виртуальной машине - PullRequest
0 голосов
/ 17 февраля 2012

Описание моей проблемы - создать:

  1. C # parser
  2. создать дерево AST из проанализированного входного файла .cs
  3. создать CIL / представление байт-кода программы
  4. создание ВМ
  5. выполнение кода, хранящегося в виде "байт-кода" - заставить анализируемую программу работать

Так что в принципе мне нужно написать свой собственный язык со всеми "вещами" вокруг.

Я напишу пример программы, которую я хочу запустить.Я знаю, как создать C # парсер для обработки этой программы и составить дерево AST.

Я также нашел ссылку на CIL http://en.csharp -online.net / CIL_Instruction_Set , чтобы я мог сохранить свой ASTкак код CIL (надеюсь, не будет никаких проблем).Но мой вопрос: как я могу проверить этот CIL, прежде чем у меня будет моя виртуальная машина?Могу ли я использовать C # CLR?И как?

Как создать виртуальную машину, выполняющую инструкции CIL в C #?Могу ли я "заставить" программу на C # запускать инструкции CIL?

Верны ли мои идеи, шаги?Следует ли мне избегать записи AST в байт-код, используя инструкции CIL?

Мои идеи были вдохновлены .NET http://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/CLR_diag.svg/400px-CLR_diag.svg.png

Спасибо за любые ответы, которые помогут мне найти правильный способ решения этой проблемы.проблема.

PS Мне нужно все реализовать самостоятельно

РЕДАКТИРОВАТЬ

Я нашел это: http://msdn.microsoft.com/en-us/magazine/cc136756.aspx

http://www.codeproject.com/Articles/3778/Introduction-to-IL-Assembly-Language

http://www.codeguru.com/csharp/.net/net_general/il/article.php/c4635#Array1

Это может решить мою проблему.Я попробую.

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Я бы выполнил задачи из вашего списка не по порядку: сначала я бы написал простую виртуальную машину (интерпретатор CIL) на C #. Я бы протестировал это с небольшими последовательностями CIL, созданными «вручную». Как только у меня это заработало, я бы собрал небольшой компилятор, который выдает крошечное подмножество CIL, соответствующее тому, что поддерживает виртуальная машина, и протестировал это. Тогда я буду постепенно улучшать это, пока не получу желаемую поддержку.

0 голосов
/ 18 февраля 2012

Если вы уже написали синтаксический анализатор C # и эмиттер кода IL (что само по себе немаловажно, посмотрите, какова длительность спецификации C #), нормальным способом выполнения кода будет создание сборки: или .dll-файл, содержащий код IL вместе с необходимыми метаданными. Затем вы можете использовать это так же, как и любую другую сборку .Net.

Чтобы создать сборку в C #, вы можете использовать System.Reflection.Emit. Конкретно, начните с AppDomain.DefineDynamicAssembly().

Другой вариант, если вы не хотите создавать целую сборку, а только один метод, это использовать DynamicMethod.

...