Створіть мову програмування JVM


91

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

Зараз я думав, замість того, щоб компілювати свій власний проміжний код, скомпілювати його в байт-код Java.

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

Тож ось мої запитання:

  1. Я думаю, щоб створити мову для JVM обов’язково - це прочитати специфікацію JVM , які ще книги ви можете запропонувати (крім, звичайно, Книги драконів)? Мене здебільшого турбують книги чи навчальні посібники про те, як створити мову JVM, а не компілятор загалом.
  2. Є багато бібліотек Java для читання, запису та зміни файлів .class , таких як jclasslib , bcel , gnu bytecode тощо. Яку з них ви б запропонували? Крім того, чи знаєте ви про бібліотеки C, які виконують ту саму роботу?
  3. Я думав про те, щоб поглянути на іншу мову, націлену на JVM, таку як Clojure, Jython чи JRuby. Але всі ці мови дуже високі і складні (створити для них компілятор). Я шукав простішу (я не заперечую, якщо вона невідома чи невикористана) мови програмування, яка націлена на JVM, а її компілятор є відкритим кодом. Будь-які ідеї?

Відповіді:


61

Я б також порекомендував ASM, але подивіться на Jasmin , я використав його (або: довелося його використовувати) для університетського проекту, і він працює досить добре, я написав комбінацію lexer / parse / analyzer / optimizer / generator мова програмування, що використовує 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.


Дякую за вашу відповідь, я погляну на Жасмін. А також я був би радий, якщо б ви могли завантажити джерело, щоб я міг поглянути. Про книгу, яку ви запропонували, видається цікавою, але вона вже надрукована і досить стара :(.

Книга, однак, дуже дешева вживана. Я знайшов копію за кілька доларів.
намін

Погляньте на мою редакцію вище, якщо у вас виникнуть запитання, я буду радий допомогти.
theomega

Посилання на "сам вихідний код" порушено. Хоча, гадаю, цього слід очікувати через 8 років.
Llew Vallis

@LlewVallis, якщо я правильно інтерпретую всю інформацію, код здається тут: github.com/replimoc/compiler .
U880D

14

В минулому семестрі я відвідував курс "Будівництво компіляторів". Наш проект був саме тим, що ви хочете зробити.

Мовою, якою я писав свою мову, була Scala . Він працює на JVM, але підтримує безліч розширених функцій, яких Java не підтримує (все ще повністю сумісний із чистою Java JVM).

Для виведення байт-коду Java я використав бібліотеку Scala CAFEBABE . Добре задокументовано, і вам не потрібно заглиблюватися в класи Java, щоб зрозуміти, що робити.

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


Це звучить як чудовий курс. Не могли б ви поділитися своїми нотатками чи кодом?
Педро

1
Немає проблем, я перевірю, де знаходяться мої резервні копії, і розміщу тут посилання, щоб ви могли завантажити його якомога швидше.
Камі

1
Охайно, я шукав практичний курс компілятора, який націлений на JVM з усіма матеріалами в Інтернеті для самостійного вивчення.
namin

5

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


4

Я думав поглянути, можливо, на іншу мову, націлену на JVM, таку як Clojure, Jython чи JRuby. Але всі ці мови дуже високі і складні (створити для них компілятор).

Пропозиція: Ви можете поглянути на мову програмування Lua , є такі реалізації JVM, як LuaJ .

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

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


Дякую. Я подивлюсь

3

Минулих вихідних я задавав собі те саме питання, щоб перенести свою мову іграшок на JVM.

Я витрачаю лише кілька годин на пошук інформації, тому сприймайте ці посилання з певною солею.

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

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

    Розділ 10 охоплює 30 сторінок (для швидкого IMO) цих тем. Але є й інший розділ, який, мабуть, вам буде цікавий.

    • 10 Побудова інтерпретаторів байт-кодів
      • 10.1 Програмування інтерпретаторів байт-кодів. .
      • 10.2 Визначення синтаксису мови збірки
      • 10.3 Архітектура машини байт-коду. . . . .
      • 10.4 Куди піти звідси. . . . . . . . . .
      • С.26. Асемблер байт-кодів. . . . . . . . . . .
      • С.27. Інтерпретатор байт-кодів на основі стеку. . .
      • С.28. Інтерпретатор байт-кодів на основі реєстру
      http://pragprog.com/titles/tpdsl/language-implementation-patterns
    • Впровадження Lua 5.0 Це чудова стаття про машини байт-кодів на основі реєстру. Прочитайте його навіть заради цього.

    • Лиска маленькими шматками. У цій книзі навчають, як писати 2-шме-компілятори, які складаються на C. Так багато уроків можна отримати з цієї книги. У мене є примірник цієї книги, і це дійсно добре для тих, хто цікавить, це шепелявість, але, можливо, не ваша чашка чаю.

      Це вичерпний звіт про семантику та реалізацію всієї родини мов Лісп, а саме Лісп, Схема та суміжні діалекти. У ньому описано 11 перекладачів та 2 компілятори ...

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

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

Існує список розсилки про тему, jvm-мови.

Чи плануєте ви завантажити код куди завгодно? Я хотів би поглянути.


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

0

Звичайно, колись я міг використовувати Java для написання нової мови. За допомогою API відображення Java ви можете отримати багато. Якщо швидкість не має великого значення, я віддав би перевагу Java замість ASM. Програмування простіше і менш схильне до помилок в Java (IMHO) . Погляньте на мову RPN 7-го . Він повністю написаний на Java.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.