Создать язык программирования JVM - PullRequest
87 голосов
/ 01 августа 2010

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

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

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

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

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

Ответы [ 9 ]

58 голосов
/ 02 августа 2010

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

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

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

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

11 голосов
/ 03 августа 2010

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

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

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

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

4 голосов
/ 01 августа 2010

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

3 голосов
/ 02 августа 2010

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

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

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

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

2 голосов
/ 03 августа 2010

В прошлые выходные я задавал себе тот же вопрос, чтобы перенести мой игрушечный язык в 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.

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

1 голос
/ 13 октября 2011

Лучшим ресурсом для начала может быть презентация Олы Бини . Возьмите слайды.

1 голос
/ 03 августа 2010

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

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

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

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

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

0 голосов
/ 09 июля 2018

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

0 голосов
/ 05 августа 2010

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

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

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

...