Создайте язык программирования JVM

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

Я теперь думал вместо того, чтобы компилировать в мой собственный промежуточный код, скомпилируйте его в байт-код Java.

Я видел, что вопрос о создании языка JVM уже задали, но я не нахожу ответ очень информативным.

Таким образом, вот мои вопросы:

  1. Я предполагаю для создания языка для JVM, необходимость должна прочитать книгу спецификации JVM, что другие книги можно предложить (кроме Книги Дракона, конечно)? Я главным образом обеспокоен книгами или учебными руководствами о том, как создать язык JVM, не компилятор в целом.
  2. Существуют многие библиотеки Java, чтобы считать, записать и изменить .class файлы как jclasslib, bcel, байт-код гну, и т.д. Какой Вы предложили бы? Кроме того, Вы знаете о библиотеках C, которые делают то же задание?
  3. Я думал о том, чтобы взглянуть на, возможно, другой язык, который предназначается для JVM как Clojure, Jython или JRuby. Но все эти языки являются очень высоким уровнем и сложный (для создания компилятора для них). Я искал более простое (я не возражаю, если это неизвестно или не использовано), язык программирования, который предназначается для JVM, и это - компилятор, открытый исходный код. Какие-либо идеи?

87
задан 19 revs, 3 users 93%functional 3 September 2017 в 06:11
поделиться

7 ответов

Я бы также порекомендовал ASM, но взгляните на Jasmin , я использовал его (или: пришлось использовать его) для университетского проекта, и он работает достаточно хорошо, я написал комбинацию лексера / синтаксического анализа / анализатора / оптимизатора / генератора для языка программирования с использованием java и jasmin, таким образом генерируя код JVM. Я загрузил код сюда , интересной частью должен быть сам исходный код . В папке «bytecode / InsanelyFastByteCodeCreator.java» вы найдете кусок кода, который преобразует дерево AST во входной формат ассемблера jasmin. Довольно прямолинейно.

Исходный язык (который был преобразован в AST с помощью Lexer + Parser + Analyzer) является подмножеством Java под названием MiniJava. В нем отсутствуют некоторые "сложные" функции, такие как наследование, конструкторы, статические методы, частные поля / методы. Ни одна из этих функций не является сложной для реализации, но была еще одна задача - написать бэкэнд для X86 (чтобы сгенерировать машинный ассемблер), и эти вещи, как правило, усложняются, если у вас нет JVM, которая обрабатывает некоторые вещи.

Если вас интересует странное имя класса: задачей университетского проекта было преобразовать AST в aa SSA Graph (то есть график, представляющий входной код), затем оптимизировать график, а затем превратить график в байт-код Java. Это было примерно 3/4 работы проекта, и InsanlyFastByteCodeCreator был всего лишь сокращением времени для тестирования всего.

Взгляните на книгу Джона Мейера и Троя Даунинга «Виртуальная машина Java». В этой книге много ссылок на Jasmin-Assembler, она очень полезна для понимания внутреннего устройства JVM.

58
ответ дан 24 November 2019 в 07:52
поделиться

ASM может быть решением для генерации байт-кода. Для начала ознакомьтесь с разделами о создании элементов в руководстве .

4
ответ дан 24 November 2019 в 07:52
поделиться

Я подумал, может быть, взглянуть другой язык, ориентированный на JVM например Clojure, Jython или JRuby. Но все эти языки очень высокого уровня и сложный (создать компилятор для них).

Предложение: Вы можете взглянуть на Язык программирования Lua , есть его реализации JVM, например LuaJ .

Легкий , быстрый, ориентированный на Java Lua интерпретатор , написанный для J2ME и J2SE, с библиотеками для базовых, строковых, таблица, пакет, математика, io, ОС, отладка и пакеты сопрограмм, компилятор , привязки luajava и JSR-233 подключаемые привязки движка сценариев.

(Не путать с LuaJava, который использует собственные библиотеки с подходом JNI.)

3
ответ дан 24 November 2019 в 07:52
поделиться

В прошлом семестре я посетил курс "Конструирование компилятора". Наш проект был именно тем, чем вы хотели заниматься.

Я писал свой язык на Scala . Он работает на JVM, но поддерживает множество дополнительных функций, которых нет в Java (по-прежнему полностью совместим с чистой Java JVM).

Для вывода байт-кода Java я использовал библиотеку Scala CAFEBABE . Хорошо документирован, и вам не нужно углубляться в классы Java, чтобы понять, что делать.

Помимо книги, я думаю, вы можете найти много информации, пройдя через лабораторные работы , которые мы сделали во время курса.

11
ответ дан 24 November 2019 в 07:52
поделиться

Последняя В выходные я задавал себе тот же вопрос, чтобы портировать свой игрушечный язык на JVM.

Я трачу всего несколько часов на поиск информации, так что относитесь к этим ссылкам с недоверием.

  • Шаблоны реализации языка . Я ненавижу antlr, но эта книга выглядит очень хорошо. Если вам тоже не нравится antlr, то по синтаксическому разбору есть очень полезные "Методы синтаксического анализа. Практическое руководство".

    Научитесь создавать программы чтения файлов конфигурации, чтения данных, генераторы кода на основе моделей, преобразователи исходного кода, анализаторы исходного кода и интерпретаторы. Вам не нужен опыт в области компьютерных наук - создатель ANTLR Теренс Парр демистифицирует языковую реализацию, разбивая ее на наиболее распространенные шаблоны проектирования. По образцу вы научитесь основным навыкам, необходимым для реализации вашего собственного компьютерного языка.

    Глава 10 покрывает 30 страниц (для поста ИМО) этой темы. Но есть и другие главы, которые, вероятно, вам будут интересны.

    • 10 Построение интерпретаторов байт-кода
      • 10.1 Программирование интерпретаторов байт-кода. .
      • 10.2 Определение синтаксиса языка ассемблера
      • 10.3 Архитектура машины с байт-кодом. . . . .
      • 10.4 Куда идти дальше. . . . . . . . . .
      • P.26. Ассемблер байт-кода. . . . . . . . . . .
      • P.27. Интерпретатор байт-кода на основе стека. . .
      • Стр.28. Интерпретатор байт-кода на основе регистров
      http: // pragprog.com / title / tpdsl / language-implementation-patterns
    • Реализация Lua 5.0 Это отличная статья о регистрах машины на основе байт-кода. Прочтите это даже ради этого.

    • Лисп в маленьких кусочках. В этой книге рассказывается, как написать 2 компилятора Schme, которые компилируются на C. Из этой книги можно извлечь много уроков. У меня есть экземпляр этой книги, и она действительно хороша для всех, кто интересуется шепелявостью, но, возможно, не для вашей чашки чая.

      Это исчерпывающий отчет о семантике и реализации всего семейства языков Lisp, а именно Lisp, Scheme и родственных диалектов. Он описывает 11 интерпретаторов и 2 компилятора ...

    http://www.amazon.com/Lisp-Small-Pieces-Christian-Queinnec/dp/0521562473

Проверьте Dalvik7 VM, виртуальную машину на основе регистров. DVM работает с байт-кодами, преобразованными из файлов классов Java, скомпилированных компилятором Java.

Существует список рассылки по этой теме, jvm-languages.

Планируете ли вы загрузить код куда-нибудь? Я бы хотел посмотреть.

2
ответ дан 24 November 2019 в 07:52
поделиться

Сначала я бы отступил, изменил свой компилятор для вывода фактической Java вместо байтовых кодов Java (что означает создание большего количества транслятора, чем компилятора) и скомпилировал вывод Java с любой средой Java. удобно (который, вероятно, генерирует лучший объектный код, чем мой собственный компилятор).

Вы можете использовать ту же технику (например, скомпилировать в C #) для генерации байтовых кодов CLI или скомпилировать в Pascal для генерации P-кода и т. Д.

Непонятно, почему вы рассматриваете Java-коды вместо использования ваша собственная виртуальная машина, но если это для производительности, вам, конечно, также следует подумать о компиляции в реальный машинный код.

0
ответ дан 24 November 2019 в 07:52
поделиться

Я бы порекомендовал вам сначала узнать, как работает сборка JVM, если вы этого еще не знаете.

Многие инструкции имеют вид ? Name , где ? равно i , если инструкция работает с целочисленным типом, и a если он работает со ссылочным типом.

По сути, JVM - это стековая машина без регистров, поэтому все инструкции работают с данными непосредственно в стеке. Вы можете отправлять / извлекать данные с помощью ? Push /? Pop и перемещать данные между локальными переменными (местоположениями стека, на которые ссылаются смещения) и вершиной стека с помощью ? Store /? Load . Некоторые другие важные инструкции: invoke ??? и if _ ??? .

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

Вот ссылка на инструкции для старой версии JVM, которая может содержать меньше инструкций, чем новая.

1
ответ дан 24 November 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: