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

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

Ответ 1

Здесь есть немного недоразумений.

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

Байт-код - это IL (I ntermediate L) для Java. Исходный код Java компилируется в Bytecode на javac. Иногда этот байтовый код снова компилируется в машинный язык, который упоминается как компиляция JIT ( J ust- I n- T ime).

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

введите описание изображения здесь

Источник

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

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

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

  • ART (интерпретатор + компилятор AOT, т.е. компиляция вовремя) A ndroid R un T ime - среда выполнения приложений, используемая операционной системой Android, заменяющая Dalvik (интерпретатор + JIT-компилятор).

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

Ответ 6

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

Ответ 7

В отличие от других языков программирования java скомпилирован и интерпретирован. Java IDE работает как компилятор, а JVM (виртуальная машина Java) ведет себя как интерпретатор. то есть когда любая программа, скажем, Hello, сохраняется после компиляции как Hello.java, и после компиляции этого файла мы получаем файл расширения Hello.Class, называемый как класс файл, байтовый код или промежуточный код. Байт-код не зависит от конкретной машины, поэтому он также называется промежуточным кодом. Чтобы преобразовать этот байт-код в машинный код или машиночитаемый формат, используется JVM, который отличается для разных операционных систем. JIT (Just in Time Compiler) входит в состав JVM, который по умолчанию компилирует байт-код в собственный машинный код, компилирующийся в "как раз вовремя".