Tworzenie języka programowania JVM

Stworzyłem kompilator w C (używając lex & bison) dla dynamicznego języka programowania, który obsługuje pętle, deklaracje funkcji wewnątrz funkcji, wywołania rekurencyjne itp. Stworzyłem również maszynę Wirtualną, która uruchamia kod pośredni utworzony przez kompilator.

Myślałem, że zamiast kompilować do własnego kodu pośredniego, skompiluj go do kodu bajtowego Javy.

Widziałem, że pytanie o stworzenie języka JVM zostało już zapytał ale nie uważam odpowiedzi za zbyt pouczającą.

Oto moje pytania:

  1. wydaje mi się, że aby stworzyć język dla JVM trzeba przeczytać JVM specification książkę, jakie inne książki możesz zaproponować (oprócz oczywiście Dragon Book)? Jestem głównie zaniepokojony książkami lub samouczkami na temat tworzenia języka JVM, a nie kompilatora w ogóle.
  2. istnieje wiele bibliotek Javy do odczytu, zapisu i zmiany .pliki klas jak jclasslib , bcel, gnu bytecode , itd. Który proponujesz? Ponadto, czy wiesz o bibliotekach C, które wykonują tę samą pracę?
  3. myślałem o przyjrzeniu się może innemu językowi, który celuje w JVM, jak Clojure, Jython lub JRuby. Ale wszystkie te języki są bardzo wysoki poziom i skomplikowane (aby stworzyć dla nich kompilator). Szukałem prostszego (nie mam nic przeciwko, jeśli jest nieznany lub nieużywany) języka programowania, który jest skierowany do JVM, a jego kompilator jest open source. Jakieś pomysły?

9 answers

Polecam również ASM, ale spójrz na Jasmin , użyłem go (lub: musiałem go użyć) dla projektu uniwersyteckiego i działa całkiem dobrze, napisałem kombinację lexer / parse/analyzer/optimizer / generator dla języka programowania przy użyciu Javy i jasmin, więc generowanie kodu JVM. Wgrałem kod tutaj , ciekawą częścią powinien być sam kod źródłowy. W folderze " bytecode / InsanelyFastByteCodeCreator.java " znajdziesz pice kodu, który przekształca AST Drzewo do formatu wejściowego asemblera jasmin. Jest całkiem prosta.

Język źródłowy (który został przekształcony do AST przez Lexer+Parser+Analyzer) jest podzbiorem Javy o nazwie MiniJava. Brakuje w nim pewnych "skomplikowanych" funkcji, takich jak dziedziczenie, konstruktory, metody statyczne, prywatne pola/metody. Żadna z tych funkcji nie jest trudna do zaimplementowania, ale było inne zadanie, aby napisać backend X86 (tak, aby wygenerować machine-assembler), a te rzeczy stają się trudne, jeśli masz nie ma JVM, który obsługuje pewne rzeczy.

W przypadku, gdy zastanawiasz się nad dziwną nazwą klasy: zadaniem projektu uniwersyteckiego było przekształcenie AST w Wykres a SSA (czyli Wykres reprezentujący kod wejściowy), a następnie zoptymalizowanie wykresu, a następnie przekształcenie wykresu w kod bajtowy Javy. To było około 3/4 pracy projektu, a InsanlyFastByteCodeCreator był tylko skrótem do testowania wszystkiego.

Zajrzyj do książki "Java Virtual Machine" Jona Meyer i Troy Downing. Ta książka mocno odwołuje się do asemblera Jasmin, jest bardzo pomocna w zrozumieniu wewnętrznych elementów JVM.

 58
Author: theomega,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-03 21:58:47

W ostatnim semestrze uczestniczyłem w kursie "Budowa kompilatora". Nasz projekt był dokładnie tym, co chcesz zrobić.

Językiem, którym pisałem mój język, Była Scala . Działa na JVM, ale obsługuje wiele zaawansowanych funkcji, których Java nie ma (nadal w pełni kompatybilny z czystym java JVM).

Do wyjścia kodu bajtowego Javy użyłem Biblioteki Scala CAFEBABE. Dobrze udokumentowane i nie trzeba wnikać głęboko w klasy Javy, aby zrozumieć, co zrób.

Oprócz książki, myślę, że można znaleźć wiele informacji, przechodząc koryta laboratoria zrobiliśmy w trakcie kursu.

 10
Author: Kami,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-26 21:47:02

ASM może być rozwiązaniem do generowania kodu bajtowego. Aby rozpocząć, sprawdź tematy dotyczące generowania elementów z podręcznika .

 4
Author: h3xStream,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-01 02:46:25

Myślałem, żeby rzucić okiem na może inny język, który jest skierowany do JVM jak Clojure, Jython czy JRuby. Ale wszystkie języki te są na bardzo wysokim poziomie i skomplikowane (aby utworzyć kompilator dla nich).

Sugestia: możesz rzucić okiem na Język programowania Lua, istnieją jego implementacje JVM, takie jak LuaJ.

Lekki , szybki, Java-centric Lua interpreter napisany dla J2ME i J2SE, z bibliotekami dla basic, string, table, package, math, io, os, debug i coroutine packages, a kompilator , wiązania luajava i JSR-233 pluggable scripting engine bindings.

(nie mylić z Luajavą, która używa rodzimych libów z podejściem JNI.)

 3
Author: bakkal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-01 20:53:22

W ostatni weekend zadałem sobie to samo pytanie, aby przenieść mój język zabawek do JVM.

Spędzam tylko kilka godzin szukając informacji, więc weź te odniesienia z przymrużeniem oka.

  • Wzorce Implementacji Języka . Nienawidzę antlr, ale ta książka wygląda bardzo dobrze. Jeśli nie lubisz antlr ani, jest bardzo dobry o parsing " techniki parsowania. Praktyczny Przewodnik."

    Naucz się budować czytniki plików konfiguracyjnych, czytniki danych, generatory kodu oparte na modelach, Tłumacze źródłowe, analizatory źródeł i interpretery. Nie potrzebujesz doświadczenia w informatyce-twórca ANTLR Terence Parr demystify implementuje język, dzieląc go na najpopularniejsze wzorce projektowe. Wzorek po wzorcu, nauczysz się kluczowych umiejętności potrzebnych do wdrożenia własnych języków komputerowych.

    Rozdział 10 obejmuje 30 stron (aby szybko IMO) tych tematów. Ale są inne rozdziały, które prawdopodobnie będziesz zainteresowany.

    • 10 Building Bytecode Interpreters
      • 10.1 Programowanie Interpreterów Bajtowych . .
      • 10.2 Definiowanie składni języka asemblera
      • 10.3 Bajtowa Architektura Maszyny . . . . .
      • 10.4 dokąd iść stąd . . . . . . . . . .
      • P. 26. Bytecode Assembler . . . . . . . . . . .
      • P. 27. Interpreter Kodu Bajtowego Oparty Na Stosie . . .
      • P. 28. Interpreter Bajtowy Oparty Na Rejestrze
      http://pragprog.com/titles/tpdsl/language-implementation-patterns
    • Implementacja Lua 5.0 jest to świetny artykuł o rejestrze- oparte maszyny bajtowe. Idź i przeczytaj to nawet ze względu na to.

    • Lisp w małych kawałkach. Ta książka uczy jak napisać 2 Kompilatory schme, które kompilują się do C. z tej książki można się wiele nauczyć. Posiadam kopię tej książki i jest ona naprawdę dobra dla każdego interesujące jest lisp, ale może nie twoja filiżanka herbaty.

      Jest to obszerny opis semantyki i implementacji całej rodziny języków Lisp, a mianowicie Lisp, Scheme i pokrewnych dialektów. Opisuje 11 interpreterów i 2 Kompilatory ...

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

Sprawdź maszynę wirtualną Dalvik7, maszynę wirtualną opartą na rejestrze. DVM działa na bajtodach, które są przekształcony z plików klasy Java skompilowanych przez kompilator Java.

Istnieje lista dyskusyjna na temat JVM-languages.

Czy planujesz wgrać kod do dowolnego miejsca? Chciałbym rzucić okiem.

 2
Author: Pedro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-04 19:08:22

Polecam najpierw dowiedzieć się, jak działa montaż JVM, jeśli jeszcze tego nie wiesz.

Wiele instrukcji ma postać ?name, gdzie ? jest i jeśli instrukcja działa z typem integer I a jeśli działa z typem odniesienia.

Zasadniczo JVM jest maszyną stosu bez rejestrów, więc wszystkie instrukcje działają z danymi bezpośrednio na stosie. Możesz przesuwać / popować dane za pomocą ?push/?pop i przenosić dane między zmiennymi lokalnymi (lokalizacje stosu odwołujące się do offsetów) i wierzchołek stosu za pomocą ?store/?load. Inne ważne instrukcje to invoke??? i if_???.

Na mój kurs kompilatora Uniwersytetu użyliśmy Jasmin do montażu programów. Nie wiem, czy to najlepszy sposób, ale przynajmniej łatwo zacząć.

Poniżej znajduje się instrukcja dla starej wersji JVM, która może zawierać mniej instrukcji niż nowa.

 1
Author: Jørgen Fogh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-03 17:36:26

Najlepszym źródłem na początek może być Prezentacja Oli Bini. Weź też slajdy.

 1
Author: lisak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-13 07:54:43

Najpierw się wycofałem, zmodyfikowałem mój kompilator tak, aby generował rzeczywisty kod Javy zamiast kodu bajtowego Javy (co oznacza tworzenie bardziej tłumacza niż kompilatora) i skompilowałem wyjście Javy za pomocą wygodnego środowiska Javy (które prawdopodobnie generowałoby lepszy kod obiektowy niż mój własny kompilator).

Możesz użyć tej samej techniki (np. skompilować do C#) do generowania kodu bajtowego CLI lub skompilować do Pascala do generowania kodu P, itp.

Nie jest jasne, dlaczego rozważasz kody Java zamiast używać własnej maszyny wirtualnej, ale jeśli chodzi o wydajność, należy oczywiście rozważyć kompilację do rzeczywistego kodu maszynowego.

 0
Author: joe snyder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-04 20:28:04

Oczywiście kiedyś można było użyć Javy do napisania nowego języka. Dzięki Java reflection-API możesz uzyskać llot. Jeśli prędkość nie ma zbyt dużego znaczenia, dałbym Javie pierwszeństwo zamiast ASM. Programowanie jest łatwiejsze i mniej podatne na błędy w Javie (IMHO) . Spójrz na język RPN 7th . Jest w całości napisany w Javie.

 0
Author: Kaplan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-09 20:46:27