Как подойти к созданию языка программирования JVM?

93

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

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

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

Итак, вот мои вопросы:

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

Ответы:

63

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

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

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

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

Theomega
источник
Спасибо за ответ, посмотрю на Жасмин. А еще я был бы рад, если бы вы могли загрузить исходник, чтобы я мог посмотреть. О книге, которую вы предложили, она кажется интересной, но она больше не издается и довольно старая :(.
Однако книга очень дешевая подержанная. Я нашел копию за несколько долларов.
namin 03
Взгляните на мою правку выше, если у вас есть вопросы, я буду рад помочь.
theomega 03 авг.10
Ссылка на "сам исходный код" не работает. Хотя, думаю, этого можно ожидать через 8 лет.
Llew Vallis
@LlewVallis, если я правильно интерпретирую всю информацию, код вроде бы здесь: github.com/replimoc/compiler .
U880D
15

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

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

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

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

Ками
источник
Звучит как отличный курс. Не могли бы вы поделиться своими заметками или кодом?
Педро
1
Нет проблем, я проверю, где находятся мои резервные копии, и опубликую ссылку здесь, чтобы вы могли скачать их как можно скорее.
Ками
1
Отлично, я искал практический курс компилятора, ориентированный на JVM, со всеми материалами онлайн для самостоятельного изучения.
namin 03
5

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

h3xStream
источник
4

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

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

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

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

Баккал
источник
Спасибо. Я посмотрю
4

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

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

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

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

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

    • 10 Построение интерпретаторов байт-кода
      • 10.1 Программирование интерпретаторов байт-кода. .
      • 10.2 Определение синтаксиса языка ассемблера
      • 10.3 Архитектура машины с байт-кодом. . . . .
      • 10.4. Куда идти дальше. . . . . . . . . .
      • С.26. Ассемблер байт-кода. . . . . . . . . . .
      • С. 27. Интерпретатор байт-кода на основе стека. . .
      • С.28. Интерпретатор байт-кода на основе регистров
      http://pragprog.com/titles/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, виртуальную машину на основе регистров. DVM работает с байт-кодами, которые преобразованы из файлов классов Java, скомпилированных компилятором Java.

По этой теме есть список рассылки jvm-languages.

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

Педро
источник
Are you planning to upload the code to anyplace?Я не горжусь этим кодом :( ... Возможно, я бы все это переписал. В любом случае, если я это сделаю, я дам вам знать. Большое спасибо за ваши предложения.
2

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

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

По сути, JVM - это стековая машина без регистров, поэтому все инструкции работают с данными непосредственно в стеке. Вы можете отправлять / извлекать данные с помощью ?push/?popи перемещать данные между локальными переменными (местоположения стека, на которые ссылаются смещения) и вершиной стека, используя ?store/?load. Некоторые другие важные инструкции: invoke???и if_???.

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

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

Йорген Фог
источник
0

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

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

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

Джо Снайдер
источник
Компиляция для JVM позволит использовать код более широко, чем при компиляции в собственный код. Кроме того, компиляция в байт-код позволит коду делать некоторые вещи, которые невозможны в самом языке Java.
supercat 07
0

Конечно, когда-то можно было использовать Java для написания нового языка. С помощью API-интерфейса отражения Java вы можете получить много информации. Если скорость не имеет большого значения, я бы отдал предпочтение Java вместо ASM. Программирование на Java проще и менее подвержено ошибкам (IMHO) . Взгляните на 7-й язык РПН . Он полностью написан на Java.

Каплан
источник