Создание языка программирования JVM
Я создал компилятор на C (используя lex & bison) для динамического типизированного языка программирования, который поддерживает циклы, объявления функций внутри функций, рекурсивные вызовы и т. д. Я также создал виртуальную машину, которая выполняет промежуточный код, созданный компилятором.
теперь я думал вместо компиляции в свой собственный промежуточный код, скомпилировать его в байтовый код java.
Я видел, что вопрос о создании языка JVM уже есть меня спрашивали, но я не нахожу ответ очень информативным.
Так вот мои вопросы:
- Я думаю, чтобы создать язык для JVM, нужно прочитать спецификация JVM книга, какие еще книги вы можете предложить (кроме книги Дракона, конечно)? Меня больше всего волнуют книги или учебники о том, как создать язык JVM, а не компилятор в целом.
- есть много библиотек Java для чтения, записи и изменения .файлы классов как jclasslib,bcel,байт-код gnu и т. д. Какой из них вы бы предложили? Кроме того, вы знаете о библиотеках C, которые выполняют ту же работу?
- Я думал о том, чтобы взглянуть на, возможно, другой язык, который нацелен на JVM, такой как Clojure, Jython или JRuby. Но все эти языки очень высокого уровня и сложны (чтобы создать компилятор для них). Я искал более простой (я не возражаю, если он неизвестен или не используется) язык программирования, который цели JVM и это компилятор с открытым исходным кодом. Есть идеи?
9 ответов:
Я бы также рекомендовал ASM, но посмотрите на Жасмин, я использовал его (или: должен был использовать его) для университетского проекта, и он работает довольно хорошо, я написал комбинацию lexer/parse/analyzer/optimizer/generator для языка программирования с использованием java и jasmin, поэтому генерирую код JVM. Я загрузил код здесь самая интересная часть должна быть источник-код. В папке " bytecode / InsanelyFastByteCodeCreator.java " вы находите кусочек кода который преобразует дерево AST во входной формат ассемблера jasmin. Это довольно прямолинейно.
исходный язык (который был преобразован в AST с помощью Lexer+Parser+Analyzer) является подмножеством Java, называемым MiniJava. Ему не хватает некоторых "сложных" функций, таких как наследование, конструкторы, статические методы, частные поля/методы. Ни одна из этих функций не является трудной для реализации, но была еще одна задача написать бэкэнд X86 (чтобы создать машинный ассемблер), и эти вещи как правило, становится трудно, если у вас нет JVM, который обрабатывает некоторые вещи.
в случае, если вы задаетесь вопросом о странном названии класса: задача университетского проекта состояла в том, чтобы преобразовать АСТ в a SSA график (таким образом, график, представляющий входной код), затем оптимизируйте график, а затем превратите график в байтовый код java. Это было около 3/4 работы проекта, и InsanlyFastByteCodeCreator был просто коротким путем для тестирования всё.
взгляните на книгу "виртуальная машина Java" от Джона Мейера и Троя Даунинга. Эта книга сильно ссылается на Jasmin-ассемблер, это очень полезно для понимания внутренних компонентов JVM.
в прошлом семестре я посещал курс "построение компилятора". Наш проект был именно тем, что вы хотите сделать.
язык, который я использовал, чтобы написать мой язык был Скала. Он работает на JVM, но поддерживает множество дополнительных функций, которые Java не делает (по-прежнему полностью совместим с чистым java JVM).
для вывода байт-кода java я использовал библиотека Scala CAFEBABE. Хорошо документировано, и вам не нужно углубляться в классы java, чтобы понять, что нужно делать.
рядом с книгой, я думаю, вы можете найти много информации, идя через лаборатории мы сделали во время курса.
ASM может быть решением для генерации байткода. Для начала проверьте темы на генерацию элементов С инструкцию.
Я думал посмотреть может другой язык, предназначенный для JVM как Clojure, Jython или JRuby. Но все эти языки очень высокого уровня и сложный (для создания компилятора для них.)
предложение: вы могли бы взглянуть на Язык Программирования Lua, есть JVM реализации его как LuaJ.
легкий, быстрый, Java-ориентированный Lua переводчик написано для J2ME и J2SE, с библиотеками для basic, string, таблица, пакет, математика, io, os, отладка и пакеты coroutine, a компилятор, привязки luajava, и JSR-233 подключаемые привязки скриптового движка.
(не путать с LuaJava, который использует родной libs с подходом JNI.)
в прошлые выходные я задавал себе тот же вопрос, чтобы перенести свой игрушечный язык в JVM.
Я трачу всего несколько часов на поиск информации,поэтому возьмите эти ссылки с солью.
Шаблоны Реализации Языка. Я ненавижу antlr, но эта книга выглядит очень хорошо. Если вам не нравится antlr ни, есть очень хорошо о разборе " методы разбора. практическое руководство."
научиться строить средства чтения файлов конфигурации, средства чтения данных, генераторы кода на основе моделей, переводчики от источника к источнику, анализаторы источников и интерпретаторы. Вам не нужен опыт работы в области компьютерных наук-создатель ANTLR Теренс Парр демистифицирует языковую реализацию, разбивая ее на наиболее распространенные шаблоны проектирования. Шаблон за шаблоном, вы узнаете ключевые навыки, необходимые для реализации собственных компьютерных языков.
Глава 10 охватывает 30 страниц (для быстрого ИМО) этой темы. Но там есть и другие главы, которые, вероятно, вас заинтересуют.
- 10 Интерпретаторов Байт-Кода Здания
http://pragprog.com/titles/tpdsl/language-implementation-patterns
- 10.1 Программирование Интерпретаторов Байт-Кода . .
- 10.2 определение синтаксиса языка ассемблера
- 10.3 Архитектура Байт-Кода Машины . . . . .
- 10.4, куда идти отсюда . . . . . . . . . .
- P. 26. Байт-Код Ассемблера . . . . . . . . . . .
- P. 27. Байт-Код На Основе Стека Переводчик. . .
- P. 28. Интерпретатор Байт-Кода На Основе Регистра
реализация Lua 5.0 это отличная статья о регистре- основанные машины байт-кода. Пойдите и прочитайте его даже ради этого.
шепелявить на мелкие кусочки. эта книга научит, как написать 2 компиляторы schme, которые компилируют в C. Так много уроков можно извлечь из этой книги. У меня есть копия этой книги, и она действительно хороша для всех, кто интересно шепелявит, но, возможно, не ваша чашка чая.
это всеобъемлющий отчет о семантике и реализации всего семейства языков Lisp, а именно Lisp, Scheme и связанных с ними диалектов. Он описывает 11 интерпретаторов и 2 компилятора ...
http://www.amazon.com/Lisp-Small-Pieces-Christian-Queinnec/dp/0521562473
Проверьте виртуальную машину Dalvik7, основанную на Регистре. DVM работает с байт-кодами, которые преобразуются из файлов классов Java, скомпилированных компилятором Java.
существует список рассылки по теме, jvm-languages.
вы планируете загрузить код в любом месте? Я хотел бы взять смотреть.
Я бы рекомендовал вам сначала узнать, как работает сборка JVM, если вы еще этого не знаете.
многие инструкции имеют форму
?name
, где?
иi
если инструкция работает с типом integer иa
если он работает с ссылочным типом.в принципе, JVM-это машина стека без регистров, поэтому все инструкции работают с данными непосредственно в стеке. Вы можете нажать / pop данные с
?push/?pop
и перемещать данные между локальными переменными (стек местоположения, на которые ссылаются смещения) и верхней части стека с помощью?store/?load
. Некоторые другие важные инструкцииinvoke???
иif_???
.на курс компилятора моего университета мы Жасмин для сборки программ. Я не знаю, является ли это лучшим способом, но, по крайней мере, это простое место для начала.
вот ссылка на инструкцию для старой версии JVM, которая может содержать меньше инструкций, чем новый один.
лучшим ресурсом для начала может быть презентация Олы Бини. Возьмите слайды, а также.
сначала я бы отступил, изменил свой компилятор, чтобы вывести фактический Java вместо байтовых кодов Java (что означает создание большего количества переводчика, чем компилятор), и скомпилировал вывод Java с любой удобной средой Java (которая, вероятно, будет генерировать лучший объектный код, чем мой собственный компилятор).
вы можете использовать тот же метод (например, компилировать в C#) для генерации байтовых кодов CLI или компилировать в Pascal для генерации P-кода и т. д.
непонятно, почему ты рассматривая Java-коды вместо использования собственной виртуальной машины, но если это для производительности, то, конечно, вы также должны рассмотреть возможность компиляции в фактический машинный код.
конечно, когда-то можно было использовать Java для написания нового языка. С помощью Java reflection-API вы можете достичь llot. Если скорость не имеет большого значения, я бы отдал предпочтение Java вместо ASM. Программирование проще и менее подвержено ошибкам в Java (ИМХО). Взгляните на язык RPN 7-й. Он полностью написан на Java.