создать синтаксический анализатор c#, дерево AST, CIL и запустить его на виртуальной машине

описание моей проблемы заключается в создании:

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

Так что в основном мне нужно написать свой собственный язык со всеми «вещами».

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

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

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

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

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

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

P.S. Мне нужно реализовать все самому

ИЗМЕНИТЬ

Я нашел это: 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

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


person luccio    schedule 17.02.2012    source источник
comment
После того, как вы создали CIL, почему вы хотите написать свою собственную виртуальную машину? Разве это не новое изобретение .net? Если вы хотите сделать это, посмотрите на источник Mono и этот ответ: stackoverflow.com/questions/3328901/   -  person James Gaunt    schedule 17.02.2012
comment
Вы смотрели на деревья выражений? msdn.microsoft.com/en-us/library/bb397951.aspx Кроме того, с какой стати вы хотите написать синтаксический анализатор C#? Есть много доступных.   -  person 3Dave    schedule 17.02.2012
comment
Привет, это домашнее задание... так что мне нужно реализовать все самому :-/   -  person luccio    schedule 17.02.2012


Ответы (2)


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

person 500 - Internal Server Error    schedule 17.02.2012
comment
Любые идеи, как начать с VM? - person luccio; 17.02.2012
comment
По сути, это будет оператор переключения в цикле с индексом указателя инструкции, перебирающий массив инструкций с байтовым кодом, каждый из которых реализует функциональность инструкции. В принципе просто :) - person 500 - Internal Server Error; 17.02.2012
comment
спасибо, что показали мне дорогу. Но где я могу найти инструкции для нативного кода? Извините за глупый вопрос... было бы неплохо использовать исходный код компилятора для собственного кода. - person luccio; 18.02.2012
comment
@luccio Вам не нужно преобразовывать в машинный (собственный) код. В основном ваша виртуальная машина будет интерпретатором - person Vagaus; 22.02.2012

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

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

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

person svick    schedule 17.02.2012