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

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

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

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

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

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

Ответ 1

Я бы также рекомендовал ASM, но посмотрите Jasmin, я использовал его (или: должен был его использовать) для университет-проект, и он работает достаточно хорошо, я написал комбинацию lexer/parse/analyzer/optimizer/generator для языка программирования с использованием java и jasmin, поэтому генерация JVM-кода. Я загрузил код здесь, интересной частью должен быть исходный код. В папке "bytecode/InsanelyFastByteCodeCreator.java" вы найдете код кода, который преобразует дерево AST во входной формат ассемблера jasmin. Совершенно прямо.

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

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

    Глава 10 охватывает 30 страниц (для быстрой IMO). Но есть и другая глава, которая, вероятно, вас заинтересует.

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

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

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

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

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

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

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

Ответ 6

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

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

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

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

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

Ответ 7

Лучшим ресурсом для начала может быть презентация Ola Bini. Также возьмите слайды.

Ответ 8

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

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

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