Почему Java компилируется и интерпретируется, когда JIT также компилирует байт-код?

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

7 ответов


здесь есть небольшое недоразумение.

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

JIT(Just in time) компилятор-это немного разные понятия. JVM поддерживает количество раз, когда функция выполняется. Если он превышает предел, то JIT входит в картину. код java непосредственно компилируется на машинный язык и там это используется для выполнения этой функции.


Java-это программирование язык.

Он имеет спецификацию (JLS), которая определяет, как должны действовать программы Java.

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

  • если я напишу Java runtime завтра, который не делает компиляцию JIT вообще, я могу вызвать Java интерпретированный.

  • если я возьму Java-машину (и люди серьезно сделали это), которая использует байт-код Java в качестве сборки, я могу назвать Java строго составлен.

многие другие языки делают это:

  • является ли python интерпретируемым языком? (CPython) или это JITed (PyPy)?
  • интерпретируется ли Lua (старые интерпретаторы lua) или он скомпилирован (LuaJIT)?
  • интерпретируется JavaScript (IE6 style) или он скомпилирован (v8)?

ради точности, давайте проясним, что это не вопрос языка программирования Java, а функция JVM.

в первых реализациях JVM JIT не существовал, и байт-код всегда интерпретировался. Это было связано с дизайнерским решением сделать скомпилированный код независимым от физической машины и ОС под управлением java и по-прежнему действует сегодня.

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


javac-это компилятор, и он преобразует java-код в байт-код (см. байт-код), который легко запустить на любой машине, если у нас есть JVM (виртуальная машина java). и интерпретатор преобразует байт-код java в машинный код.


Java-гибридный язык, т. е. он скомпилирован (работа выполнена заранее) и интерпретирован(работа выполнена на приемном конце).

байтовый код-это IL (Яntermediate Language) на Java. Исходный код Java компилируется в байт-код с помощью javac. Иногда этот байтовый код снова компилируется на машинный язык, который называется JIT (JУсть-Яn -Time) компиляция.

JVM (без JIT) осмысляет байтовый код промежуточного языка java для родного машинного языка выглядит следующим образом:

enter image description here

источник

JVM-абстрактная вычислительная машина, она имеет несколько реализаций:

  • HotSpot (интерпретатор + JIT-компилятор): основная ссылка на реализацию Java VM. Используется как Oracle Java, так и OpenJDK.

  • JamVM (Интерпретатор) разработан как чрезвычайно маленькая виртуальная машина по сравнению с другими. Предназначен для использования GNU Classpath. Поддерживает несколько архитектур. лицензия GPL.

  • искусство (интерпретатор + компилятор AOT, т. е. досрочная компиляция)Android RunTime-это среда выполнения приложения, используемая операционной системой Android для замены Далвик (интерпретатор + JIT-компилятор).

список виртуальных машин Java


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


в отличие от других языков программирования Java компилируется и интерпретируется язык. Java IDE действует как компилятор, а JVM (виртуальная машина java) ведет себя как интерпретатор. т. е. когда любая программа позволяет поздороваться, сохраняется после компиляции как Hello.java и после компиляции этого файла мы получаем Hello.Файл расширения класса называется class-file, byte-code или intermediate code. Байт-код не зависит от какой-либо конкретной машины, поэтому он также называется промежуточным кодом. Чтобы преобразовать байт-код в используется машинный код или понятный формат JVM, который отличается для разных операционных систем. JIT (Just In Time Compiler) является частью JVM, которая включена по умолчанию, компилирует байт-код в компиляцию машинного кода в "just In time".