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

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

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


person user997112    schedule 21.04.2012    source источник


Ответы (3)


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

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

person Louis Wasserman    schedule 21.04.2012
comment
Так в чем же польза от стадии интерпретации? Чтобы интерпретируемый код, который был выполнен на виртуальной машине, можно было затем оптимизировать и ЗАТЕМ скомпилировать в собственный код? - person user997112; 22.04.2012
comment
Код, который не запускается очень часто, на самом деле не требует больших затрат производительности, а время, необходимое для компиляции кода, может быть больше, чем время, которое вы сэкономили бы, используя скомпилированный код. Интерпретация кода не потребляет память с новым скомпилированным кодом, а байт-код является кроссплатформенным, а скомпилированный код - нет. - person Louis Wasserman; 22.04.2012
comment
@Loius Что такое tight inner loop код? Не могли бы вы уточнить пожалуйста? - person Geek; 08.09.2013

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

person MByD    schedule 21.04.2012
comment
как? как это интерпретируется на JVM? - person Koray Tugay; 25.01.2015

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

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

person SJuan76    schedule 21.04.2012