Техническая путаница между компиляцией и интерпретацией

Я прочитал много определений и заявлений о "интерпретации"и " компиляции". Но я все еще очень смущен.

Технически говоря, в чем на самом деле разница между интерпретацией и компиляцией под капотом? Позвольте мне уточнить (пожалуйста, исправьте любую неправильную концепцию, которую я мог бы иметь):

в java исходный код " компилируется "в байт-код, который затем" интерпретируется "и/или" точно вовремя компилируется " в машинный код. Но какая разница между своевременной компиляцией и интерпретацией? Я имею в виду, в конце концов, насколько я догадываюсь, процессор хоста будет запускать только машинный код. Таким образом, в интерпретации также инструкции преобразуются в машинный код, который может быть понят процессором. Итак, где мы проводим границу между компиляцией и интерпретацией точно в срок?

P. S. Это мое видение. Это может быть совершенно неправильно. В таком случае, прошу извинить мою глупость и исправить мне.

спасибо.

5 ответов


1. откровенно говоря идея, что java имеет как компилятор, так и интерпретатор-это миф, его поведение его, что отмечено как компиляция и переводчик.

2. Компилятора Java компилирует читаемый человеком код в байтовый код. Который затем преобразуется JIT (как раз вовремя компилятор) во время выполнения на уровне машинного кода.

3. во время выполнения JIT идентифицирует интенсивную часть кода во время выполнения, а затем преобразует ее в исполняемый код машинного уровня,эта часть кода называется Hot-Spot, и поэтому JIT называется компилятором горячих точек.

4. JIT использует Таблица Виртуальной Памяти ( V-таблицы), который является указателем на метод в классе. код горячей точки после этого преобразован к своему исполняемому коду уровня машины, свой адрес хранится здесь, и когда эта часть вызывается снова, то ее непосредственно извлекают по этому сохраненному адресу. This behavior of JIT to keep compiling small amount of code during Run time is assumed to be Интерпретировали Поведение и the JIT behaviour of storing this for later use is assumed as сборник.

5. таблица виртуальной памяти также имеет таблицу, в которой хранится адрес байтового кода, который можно использовать при необходимости.


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

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

JIT в Java-это гибридная технология. Первый байт-код понял, каждая инструкция байт-кода исполняется переводчиком. Однако в какой-то момент времени (и при некоторых условиях) байт-код переводится в машинный код и отправляется непосредственно в CPU для повышения производительности. Такой подход приносит лучшее из обоих миров - переносимость промежуточного кода и скорость машинный код. Более того, JIT знает гораздо больше о поведении вашего кода во время выполнения (сколько раз данный цикл вызывается в среднем? Является ли этот метод действительно виртуальным?), поэтому машинный код может быть еще быстрее, чем тот, который генерируется обычный компилятор (!)


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

just-in-time compilation-это комбинация обоих, где JIT-компилятор по-прежнему требуется для запуска программы, а код компилируется на время выполнения.

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


интерпретаторы интерпретируют код строка за строкой, и решает машинный код во время выполнения;

компилятор потребляет код по частям и решает машинный код во время компиляции;

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


интерпретируемая среда включает инструкции, выполняемые сразу после синтаксического анализа, где как синтаксический анализ, так и выполнение выполняются интерпретатором. Это означает, что машина, на которой вы запускаете код, должна иметь интерпретатор для запуска программы.1

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