Генерация кода для Java JVM / .NET CLR - PullRequest
2 голосов
/ 14 декабря 2009

Я изучаю компиляцию в колледже, и мы должны сгенерировать код для нашего изобретенного языка для любой платформы, которую мы хотим. Я думаю, что самый простой случай - это генерация кода для Java JVM или .NET CLR. Любое предложение, которое выбрать, и какие API там могут помочь мне в этой задаче? У меня уже есть весь семантический анализ, просто нужно сгенерировать код для данной программы.

Спасибо

Ответы [ 3 ]

4 голосов
/ 14 декабря 2009

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

Другое преимущество заключается в том, что вы получаете стандартный API для выдачи там байт-кода - System.Reflection.Emit - даже если он несколько ограничен для сценариев полноценного компилятора, его все же обычно достаточно для простого компилятора.

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

1 голос
/ 14 декабря 2009

Еще одна опция, с которой я столкнулся, - это библиотека, которая называется run sharp, которая может генерировать код MSIL во время выполнения с помощью emit. Но более приятным и удобным для пользователя способом, который больше похож на c #. Последнюю версию библиотеки можно найти здесь. http://code.google.com/p/runsharp/

0 голосов
/ 14 декабря 2009

В .NET вы можете использовать пространство имен Reflection.Emit для генерации кода MSIL.

См. Ссылку MSDN: http://msdn.microsoft.com/en-us/library/3y322t50.aspx

...