JVM - это компилятор или интерпретатор?

85

У меня очень простой вопрос о JVM: это компилятор или интерпретатор?

Если это интерпретатор, то как насчет JIT-компилятора, который существует внутри JVM?
Если нет, то что такое JVM? (Мне не нужно базовое определение jVM преобразования байтового кода в машинный код и т. Д.)

sns
источник
17
JVM - это виртуальная машина. Байт-код входит, наблюдаемые эффекты программы происходят. Все остальное - детали реализации.
1
Да, нет "JVM", есть несколько реализаций спецификации.
paxdiablo
@delnan, напишите, пожалуйста, это в качестве ответа. Очень хочу поддержать такой ответ.
aioobe 06
@aioobe: Я не буду. Я не думаю, что он отвечает на заданный здесь вопрос - это очень полезная перспектива, но вопрос (четко сформулированный в заголовке и в сообщении) явно требует этих деталей реализации.
Справедливо. Я бы сказал , что это ответ на «Если ни, то , что именно не является в виртуальную машину Java?» часть хотя. (Поскольку виртуальная машина Java - это скорее спецификация, чем реализация.)
aioobe

Ответы:

172

Во-первых, давайте разберемся со следующими терминами

Javacэто Java Compiler - компилирует ваш Java-код в байт-код

JVMвиртуальная машина Java - запускает / интерпретирует / переводит байт-код в собственный машинный код

JITis Just In Time Compiler - компилирует заданную последовательность инструкций байт-кода в машинный код во время выполнения перед ее выполнением изначально. Его основная цель - сильно оптимизировать производительность.

Итак, давайте найдем ответы на ваши вопросы ..

1) JVM: is it a compiler or an interpreter? - Ответ: переводчик

2) what about JIT compiler that exist inside the JVM? - Ответ : Если вы прочитали этот ответ полностью, то, вероятно, теперь знаете его.

3) what exactly is the JVM? - Ответ:

  • JVM - это виртуальная платформа, которая находится в вашей оперативной памяти.
  • Его компонент, загрузчик классов, загружает .classфайл в ОЗУ.
  • Компонент Byte code Verifier в JVM проверяет, есть ли в вашем коде какие-либо нарушения ограничения доступа. (Это одна из основных причин, почему Java безопасна)
  • Затем компонент Execution Engine преобразует байт-код в исполняемый машинный код.

Надеюсь, это вам помогло ..

Шрикантх Бандару
источник
Вы говорите, что JVM переводит байт-код в собственный машинный код. Я не уверен, что термин «перевод» здесь правильный.
Корай Тугай
Высоко оценен. вы почти развеяли мои сомнения относительно разницы между компиляцией и интерпретацией, байтовым кодом и кодом m / c. ваш ответ сказал мне, что байт-код преобразуется в машинный код интерпретатором, а компилятор преобразует исходный код в байт-код.
Alwaysalearner
2
Не могли бы вы также сказать мне, что такое нативный код? Означает ли это машинный код? Я пытаюсь изучить весь этот процесс компиляции и интерпретации, но эти промежуточные термины очень сбивают с толку.
Alwaysalearner
7
Итак, как JVM, так и JIT преобразуют байтовый код в машинный код, специфичный для платформы. Итак, в чем разница между ними? вы можете объяснить это широко?
Адитья
6
«Запускает / интерпретирует / переводит байт-код в собственный машинный код» - это ерунда. Он либо «запускает / интерпретирует», либо «переводит байт-код в собственный машинный код». Не оба одновременно.
user207421 01
32

Это немного того и другого, но ни того, ни другого в традиционном смысле.

Современные JVM принимают байт-код и при первой необходимости компилируют его в машинный код. «JIT» в этом контексте означает «точно в срок». Он действует как интерпретатор извне, но на самом деле за кулисами он компилируется в машинный код.

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

Марк Питерс
источник
8
@NaeemShah: Мне приятно, что вам понравился этот ответ настолько, что вы почти дословно скопировали его в сообщение в блоге под своим именем. И у вас есть право сделать это, но в соответствии со схемой лицензирования StackOverflow вы по закону обязаны указать здесь указание авторства, и вы должны лицензировать свой пост в блоге под той же лицензией. См. Нижний колонтитул этого веб-сайта, где есть ссылка на следующую лицензию: creativecommons.org/licenses/by-sa/3.0 . См. Также это сообщение в блоге: blog.stackoverflow.com/2009/06/attribution-required
Марк Петерс
8

Как @delnan уже сказал в разделе комментариев, это ни то, ни другое .

JVM - это абстрактная машина, на которой работает байт-код Java .

JVM имеет несколько реализаций:

  • HotSpot (интерпретатор + JIT- компилятор)
  • Dalvik (интерпретатор + JIT-компилятор)
  • ART ( компилятор AOT + компилятор JIT)
  • GCJ (компилятор AOT)
  • JamVM (переводчик)

... и многие другие .

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

cubuspl42
источник
1
ART также является интерпретатором: «Android может фактически запускать .dexкод напрямую через интерпретацию или JIT-компиляцию ...» ( source.android.com/devices/tech/ota/ab/… )
Ирфан Латиф
5

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

Пол Кейджер
источник
Вы, вероятно, имеете в виду HotSpot
cubuspl42
5

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

Мат
источник
0

Как говорили другие, это и то, и другое! Если вы хотите сослаться на это подробно, то можете увидеть: Это описание IBM

DDC
источник
0

Javac - это компилятор, но не традиционный компилятор. Компилятор обычно преобразует исходный код в язык машинного уровня для выполнения, и это делается за один раз, т.е. весь код берется и конвертируется в язык машинного уровня ОДИН РАЗ. (подробнее об этом ниже). В то время как JavaC преобразует его в байт-код вместо языка машинного уровня.

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

Это мое понимание после прочтения нескольких онлайн-ответов, блогов и т. Д. Если у кого-то есть предложения по улучшению этого понимания, пожалуйста, не стесняйтесь предлагать.

Сарт
источник
-5

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

Пример: напишите и скомпилируйте программу, и она будет работать в Windows. Переместите файл .class в другую ОС (Unix), и он будет работать благодаря интерпретатору, который преобразует байт-код в машинно-понятный код.

М САНЕДИП КУМАР
источник
1
Вы забыли отключить
колпачки
7
Неправильно, вы сначала компилируете исходный код в байт-код (не имеет ничего общего с JVM), затем JVM интерпретирует байт-код и компилирует его в собственный код (но, возможно, не каждую часть).
The_Fox 01