Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 3

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

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

Ответ 5

Я посмотрел на Maxine на прошлой неделе и задавался вопросом:)

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

1 Создание образа загрузки

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

2 Запуск Maxine

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

В классической книге 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

Ответ 9

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

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

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

Ответ 10

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

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

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