Интерпретация байт-кода против компиляции байт-кода?

Я столкнулся с несколькими ссылками на JVM/JIT-активность, где, как представляется, делается различие между компиляцией байт-кода и интерпретацией байт-кода. Конкретный комментарий, указанный байт-код, интерпретируется для первых 10000 прогонов и скомпилирован после этого.

В чем разница между "компиляцией" и "интерпретацией" байт-кода?

Ответ 1

Интерпретация байтового кода в основном считывает байт-код по строкам, не делает никакой оптимизации или что-то еще, и анализирует его и выполняет его в режиме реального времени. Это особенно неэффективно по ряду причин, включая проблему, с которой байт-код Java не предназначен для быстрого интерпретации.

Когда метод компилируется, JIT загружает весь метод и генерирует собственный код для запуска непосредственно на ЦП, а не чтение и интерпретацию байтового кода по строкам. После того, как метод скомпилирован один раз, сгенерированный собственный код используется напрямую при каждом вызове метода. Это астрономически быстрее, но накладывает некоторые накладные расходы при компиляции метода; среди прочего, JVM отвечает только за компиляцию часто называемых методов, чтобы минимизировать накладные расходы, одновременно увеличивая производительность кода "жесткого внутреннего цикла", который вызывается очень часто.

Ответ 2

Когда байт-код взаимодействует, он выполняется через интерпретатор JVM, а не непосредственно на процессоре, когда он компилируется, он скомпилирован на собственный машинный язык и выполняется непосредственно на CPU.

Ответ 3

JVM имеет Just In Time (JIT-компилятор); части кода, которые достаточно повторяются, могут быть скомпилированы в собственный код ассемблера, чтобы ускорить его.

Обратите внимание, что изменение выполняется только в JVM, файлы класса (jar/war) не изменяются и остаются в качестве байт-кода.