Как можно написать JVM на Java - PullRequest
       12

Как можно написать JVM на Java

37 голосов
/ 17 февраля 2010

Я кратко читал о Maxine , который является реализацией JVM с открытым исходным кодом, написанной на Java. Это звучит круто для меня. Если для работы java требуется виртуальная машина, как сама виртуальная машина может быть написана на Java (не будет ли для кода виртуальной машины требоваться виртуальная машина для запуска и т. Д.).

Редактировать : Хорошо, я вижу, что упустил из виду тот факт, что Java не должна работать в виртуальной машине. Как тогда объяснить, как компилятор LISP может быть написан на LISP? Или это вообще новый вопрос?

Ответы [ 10 ]

15 голосов
/ 17 февраля 2010

Ваше предположение, что Java требует виртуальную машину неверно для начала с .

13 голосов
/ 17 февраля 2010

Вы спрашиваете о курице и яйце.

Чтение: http://en.wikipedia.org/wiki/Bootstrapping_%28compilers%29

7 голосов
/ 17 февраля 2010

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

Кроме того, Maxine содержит код на C, который, я думаю, составляет минимальную среду выполнения, которая используется для запуска остальной части Maxine. Я полагаю, что интересные фрагменты (JIT-компилятор, сборщик мусора) полностью реализуются в Java.

3 голосов
/ 17 февраля 2010
2 голосов
/ 17 февраля 2010

Я посмотрел на Максину на прошлой неделе и удивлялся тому же :)

Из документации Maxine :

1 Сборка загрузочного образа

Теперь давайте создадим [загрузочный образ]. В на этом шаге Maxine работает на хосте JVM настроить прототип, затем компилирует свой собственный код и данные для создать исполняемую программу для целевая платформа.

2 Бег Максин

Теперь, когда Максин скомпилировала себя, мы можем запустить его как стандартную Java VM. Команда max vm обрабатывает детали путей классов и библиотек и обеспечивает интерфейс, похожий на стандартная команда запуска Java.

2 голосов
/ 17 февраля 2010

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

0 голосов
/ 08 августа 2012

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

Начальная загрузка самостоятельной исследовательской виртуальной машины для JavaScript: отчет об опыте

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

0 голосов
/ 08 августа 2012

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

Интересно, все ли здесь упускают смысл? Вы можете написать практически любой тип компилятора, интерпретатора или виртуальной машины практически на любом языке. При использовании C для написания C-компилятора C-компилятор необходим для компиляции нового компилятора. Тем не менее, выходные данные представляют собой собственный код, который выполняется на назначенной платформе. Тот факт, что JVM написана на языке, который работает на JVM, не означает, что вывод должен привести к коду, который выполняется на JVM. Например, вы можете написать C, Basic, Pascal Compilers или даже ассемблеры на Java. В этом случае вам понадобится JVM для создания компилятора или ассемблера, но после создания вам может больше не понадобиться JVM, если исходный код привел к собственному коду. Другой подход заключается в написании переводчика, который берет язык ввода и преобразует его в собственный машинный язык, так что вы пишете свою программу на языке A, который компилируется в язык B, который затем компилируется в машинный код. В мире микроконтроллеров вы часто это видите. Кто-то хочет писать программы на Basic или Java, поэтому они пишут компилятор Basic / Java для создания кода C для существующего компилятора C. Затем полученный C-код компилируется в машинный язык, предоставляя нативный компилятор Basic / Java. Такой подход обычно проще, чем написание базового / Java-компилятора непосредственно в машинном коде.

Много лет назад я написал программы BasicA и GWBasic, которые создавали ассемблерный код для микросхем 6800 и Z80. Моя точка зрения заключается в том, что выходные данные не должны быть такими же, как вход или цель. И.Е. То, что вы пишете JVM на Java, не означает, что конечный результат должен выполняться под Java JVM.

0 голосов
/ 17 февраля 2010

Это своего рода "ооооооооооооо, как это может работать ???" - но я думаю, что вы описываете явление, известное как «хостинг»:

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

В классической книге AWK есть замечательный пример, который представляет программу AWK, которая может анализировать (сокращенную версию в том виде, в каком она происходит) другие программы AWK: см. Ссылку ниже.

В книге «Красивый код» есть еще один пример, в котором есть программа Javascript, которая может анализировать Javascript.

Я думаю, что следует помнить об этом - если у вас есть, скажем, JVM, написанная на Java, которая может выполнять Java-байт-код: JVM, которая запускает саму Java JVM, должна быть размещена изначально (возможно, эта JVM написана в 'C', а затем скомпилирован в машинный код): это верно в любом случае для программы, размещающей сам себя, в конце концов - где-то вдоль линии.

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

Это своего рода эквивалент способности описывать английский (и т. Д.) Язык, используя сам английский язык .... возможно ...

http://www.amazon.co.uk/AWK-Programming-Language-Alfred-Aho/dp/020107981X/ref=sr_1_fkmr0_3?ie=UTF8&qid=1266397076&sr=8-3-fkmr0

http://www.amazon.co.uk/gp/search/ref=a9_sc_1?rh=i%3Astripbooks%2Ck%3Abeautiful+code&keywords=beautiful+code&ie=UTF8&qid=1266397435

http://en.wikipedia.org/wiki/Self-hosting

0 голосов
/ 17 февраля 2010

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

...