Я создал компилятор на C (используя Lex & Bison) для языка программирования с динамической типизацией, который поддерживает циклы, объявления функций внутри функций, рекурсивные вызовы и т. Д. Я также создал виртуальную машину, которая запускает промежуточный код, созданный компилятором.
Я думал о компиляции его в байт-код Java вместо моего собственного промежуточного кода.
Я видел, что вопрос о создании языка JVM уже задан , но я не считаю ответ очень информативным.
Итак, вот мои вопросы:
- Думаю, чтобы создать язык для JVM, необходимо прочитать книгу спецификаций JVM , какие еще книги вы можете предложить (кроме, конечно, Dragon Book)? Меня больше беспокоят книги или учебники по созданию языка JVM, а не компилятор в целом.
- Существует множество библиотек Java для чтения, записи и изменения
.class
файлов, таких как jclasslib , bcel , байт-код gnu и т. Д. Какую из них вы бы посоветовали? Кроме того, знаете ли вы о библиотеках C, которые выполняют ту же работу? - Я думал о том, чтобы взглянуть на, возможно, другой язык, ориентированный на JVM, например Clojure, Jython или JRuby. Но все эти языки очень высокоуровневые и сложные (создать для них компилятор). Я искал более простой (не возражаю, если он неизвестен или не используется) язык программирования, ориентированный на JVM, и его компилятор имеет открытый исходный код. Любые идеи?
В прошлом семестре я прошел курс «Конструирование компиляторов». Наш проект был именно тем, чем вы хотели заниматься.
Для написания своего языка я использовал Scala . Он работает на JVM, но поддерживает множество дополнительных функций, которых нет в Java (по-прежнему полностью совместим с чистой Java JVM).
Для вывода байт-кода Java я использовал библиотеку Scala CAFEBABE . Хорошо документирован, и вам не нужно углубляться в классы Java, чтобы понять, что делать.
Помимо книги, я думаю, вы можете найти много информации, пройдя лабораторные работы, которые мы сделали во время курса.
источник
ASM может быть решением для генерации байт-кода. Для начала, проверьте темы на генерирование элементов из ручных .
источник
Предложение: вы можете взглянуть на язык программирования Lua , есть его реализации для JVM, такие как LuaJ .
(Не путать с LuaJava, который использует собственные библиотеки с подходом JNI.)
источник
На прошлых выходных я задавал себе тот же вопрос, чтобы перенести свой игрушечный язык на JVM.
Я трачу всего несколько часов на поиск информации, так что относитесь к этим ссылкам с недоверием.
Шаблоны языковой реализации . Я ненавижу antlr, но эта книга выглядит очень хорошо. Если вам тоже не нравится antlr, то по синтаксическому разбору есть очень полезные "Методы синтаксического анализа. Практическое руководство".
Глава 10 покрывает на 30 страницах (для быстрого ИМО) эту тему. Но есть и другие главы, которые, вероятно, вам будут интересны.
Реализация Lua 5.0 Это отличная статья о машинах с байт-кодом на основе регистров. Прочтите это даже ради этого.
Лисп мелкими кусочками. В этой книге рассказывается, как написать 2 компилятора schme, которые компилируются на C. Из этой книги можно извлечь много уроков. У меня есть экземпляр этой книги, и она действительно хороша для всех, кто интересуется шепелявостью, но, возможно, не для вашей чашки чая.
http://www.amazon.com/Lisp-Small-Pieces-Christian-Queinnec/dp/0521562473
Проверьте виртуальную машину Dalvik7, виртуальную машину на основе регистров. DVM работает с байт-кодами, которые преобразованы из файлов классов Java, скомпилированных компилятором Java.
По этой теме есть список рассылки jvm-languages.
Планируете ли вы загрузить код куда-нибудь? Я бы хотел взглянуть.
источник
Are you planning to upload the code to anyplace?
Я не горжусь этим кодом :( ... Возможно, я бы все это переписал. В любом случае, если я это сделаю, я дам вам знать. Большое спасибо за ваши предложения.Я бы порекомендовал вам сначала узнать, как работает сборка JVM, если вы еще этого не знаете.
Многие инструкции имеют форму
?name
, где?
находится,i
если инструкция работает с целочисленным типом иa
если она работает со ссылочным типом.По сути, JVM - это стековая машина без регистров, поэтому все инструкции работают с данными непосредственно в стеке. Вы можете отправлять / извлекать данные с помощью
?push/?pop
и перемещать данные между локальными переменными (местоположения стека, на которые ссылаются смещения) и вершиной стека, используя?store/?load
. Некоторые другие важные инструкции:invoke???
иif_???
.Для моего университетского курса компилятора мы использовали Jasmin для сборки программ. Я не знаю, лучший ли это способ, но, по крайней мере, с него легко начать.
Вот ссылка на инструкцию для старой версии JVM, которая может содержать меньше инструкций, чем новая.
источник
Сначала я отступил, изменил свой компилятор для вывода фактической Java вместо байтовых кодов Java (что означает создание большего количества переводчика, чем компилятора) и скомпилировал вывод Java с любой удобной средой Java (что, вероятно, сгенерировало бы лучший объектный код чем мой собственный компилятор).
Вы можете использовать ту же технику (например, скомпилировать в C #) для генерации байтовых кодов CLI или скомпилировать в Pascal для генерации P-кода и т. Д.
Непонятно, почему вы рассматриваете коды Java вместо использования собственной виртуальной машины, но если это необходимо для повышения производительности, то, конечно, вам также следует рассмотреть возможность компиляции в реальный машинный код.
источник
Конечно, когда-то можно было использовать Java для написания нового языка. С помощью API-интерфейса отражения Java вы можете получить много информации. Если скорость не имеет большого значения, я бы отдал предпочтение Java вместо ASM. Программирование на Java проще и менее подвержено ошибкам (IMHO) . Взгляните на 7-й язык РПН . Он полностью написан на Java.
источник