Я читал, что исходный код java компилируется в «байт-код», затем он снова «компилируется» JIT в «машинный код». То есть исходный код сначала компилируется в независимый от платформы байт-код, а затем снова компилируется в машинно-зависимый код. Тогда почему он называется одновременно интерпретируемым и компилируемым языком? Где происходит интерпретация?
Почему Java является одновременно компилируемым и интерпретируемым языком, когда JIT также компилирует байт-код?
Ответы (7)
Здесь есть небольшое недоразумение.
В обычных условиях компилятор Java (javac
) компилирует код Java в байт-коды, а интерпретатор Java (java
) интерпретирует эти байт-коды (построчно), конвертирует его в машинный язык и выполняет.
JIT(Just in time)
компилятор - это немного другая концепция. JVM поддерживает количество выполнений функции. Если он превышает предел, тогда появляется JIT. java-код напрямую компилируется в машинный язык и используется для выполнения этой функции.
Java - это язык программирования.
У него есть спецификация (JLS), которая определяет, как должны действовать Java-программы.
Как сам язык, он не определяет, как он должен выполняться на разных платформах. То, как он работает, с JIT или без JIT, полностью зависит от реализации.
Если я завтра напишу среду выполнения Java, которая вообще не выполняет JIT-компиляцию, я могу назвать Java интерпретируемой.
Если я возьму машину Java (и люди серьезно ее сделали), которая использует байт-код Java в качестве сборки, я могу назвать Java строго скомпилированной .
Это делают многие другие языки:
- Python - это интерпретируемый язык? (CPython) или это JIT (PyPy)?
- Интерпретируется ли Lua (старые интерпретаторы lua) или он компилируется (LuaJIT)?
- Интерпретируется ли JavaScript (стиль IE6) или он компилируется (v8)?
Для точности давайте проясним, что это не вопрос языка программирования Java, а функция JVM.
В первых реализациях JVM JIT не существовало, и байт-код всегда интерпретировался. Это было связано с дизайнерским решением сделать скомпилированный код независимым от физической машины и ОС, на которых запущена java, и остается актуальным и сегодня.
В качестве более позднего уточнения JIT был введен в реализацию JVM для более быстрого выполнения, но байт-код должен оставаться действительным и проходить все проверки перед преобразованием в двоичный. Таким образом вы сохраните независимость платформы, все проверки работоспособности и безопасности, а также повысите производительность.
Java - это гибридный язык, то есть он компилируется (работа выполняется заранее) и интерпретируется (работа выполняется на приемной стороне).
Байт-код - это IL (I промежуточный язык L) для Java. Исходный код Java компилируется в байт-код с помощью javac
. Иногда этот байт-код снова компилируется в машинный язык, который называется JIT (J ust- I n- T ime) компиляцией.
JIT-компиляция - это способ выполнения компьютерного кода, который включает компиляцию во время выполнения программы - во время выполнения - а не до выполнения. исходный код
JVM (без JIT) интерпретирует байтовый код промежуточного языка Java в собственный машинный язык следующим образом:
JVM - абстрактная вычислительная машина, она имеет несколько реализаций:
HotSpot (интерпретатор + JIT-компилятор): основная эталонная реализация виртуальной машины Java. Используется как Oracle Java, так и OpenJDK.
JamVM (интерпретатор) Создана как очень маленькая виртуальная машина по сравнению с другими. Разработан для использования пути к классам GNU. Поддерживает несколько архитектур. GPL.
ART (интерпретатор + компилятор AOT, т. е. предварительная компиляция) A ndroid R un T ime - это среда выполнения приложения, используемая операционной системой Android, заменяющая Dalvik (интерпретатор + JIT-компилятор).
javac - это компилятор, который преобразует java-код в байт-код (см. байт-код), который легко запустить на любой машине, если у нас есть JVM (виртуальная машина java). а интерпретатор преобразует байт-код Java в машинный код.
Он служит двум целям. Первый - убедиться, что код синтаксически и семантически правильный. Во-вторых, в процессе компиляции создается байт-код. Как вы заметили, это не зависящий от архитектуры промежуточный язык, который может быть интерпретирован или оперативно скомпилирован в собственный код JVM для конкретной архитектуры машины. При компиляции в байтовый код большая часть накладных расходов, связанных с компиляцией, может быть выполнена заранее, оставляя JVM для генерации собственного кода или интерпретации байтового кода, который был тщательно и тщательно проверен заранее.
В отличие от других языков программирования, java является компилируемым и интерпретируемым языком. Java IDE действует как компилятор, а JVM (виртуальная машина java) ведет себя как интерпретатор. т.е. когда любая программа, скажем Hello, сохраняется после компиляции как Hello.java, а после компиляции этого файла мы получаем Hello. Файл расширения класса вызывается как файл класса, байт-код или промежуточный код. Байт-код не зависит от какой-либо конкретной машины, поэтому он также называется промежуточным кодом. Для преобразования этого байт-кода в машинный код или машинно-понятный формат используется JVM, который отличается для разных операционных систем. JIT (Just in Time Compiler) - это часть JVM, которая по умолчанию включена, компилирует байт-код в собственный машинный код, компилируясь «точно вовремя».