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

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


person Ragul    schedule 02.01.2014    source источник
comment
В любом случае, в ваших определениях нет такой вещи, как «интерпретируемый» :) Когда JIT-компилятор компилируется в код машинного языка, он преобразует кучу инструкций и выполняет их оптимизацию. Интерпретатор делает это по одному (поэтому часто это происходит намного медленнее). В конце концов, все равно все должно работать на машине. (Это, конечно, упрощение, но суть вы поняли)   -  person Benjamin Gruenbaum    schedule 02.01.2014
comment
stackoverflow .com / questions / 1326071 /   -  person Supriya    schedule 15.08.2017


Ответы (7)


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

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

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

person Aniket Thakur    schedule 02.01.2014
comment
Означает ли это, что весь байт-код не всегда компилируется JIT? - person Ragul; 02.01.2014
comment
@ user3153221 JIT только выявляет горячие точки и компилирует их, выполняет оптимизацию, и есть возможные точки спасения. - person Benjamin Gruenbaum; 02.01.2014
comment
Спасибо, Аникет и Бенджамин :) - person Ragul; 02.01.2014

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

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

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

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

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

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

  • Python - это интерпретируемый язык? (CPython) или это JIT (PyPy)?
  • Интерпретируется ли Lua (старые интерпретаторы lua) или он компилируется (LuaJIT)?
  • Интерпретируется ли JavaScript (стиль IE6) или он компилируется (v8)?
person Benjamin Gruenbaum    schedule 02.01.2014
comment
Хорошая точка зрения. Почему людей это сбивает с толку, останется загадкой (во всяком случае, для меня). Это похоже на то, почему говорят, что доллары - это деньги, когда евро - это тоже деньги? - person Ingo; 02.01.2014

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

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

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

person Jorge_B    schedule 02.01.2014

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-компилятор).

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

person Premraj    schedule 30.11.2015

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

person S. Panwar    schedule 15.11.2015

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

person Chris Mantle    schedule 02.01.2014

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

person Ashwin J Chhetri    schedule 04.03.2017