Интерпретация JVM против JIT-компиляции. Разве JVM не компилирует байт-код для машинного чтения?

У меня есть вопрос о JVM (виртуальная машина Java) и JIT (Just-in-Time). Насколько я знаю, JVM принимает в качестве входных данных байт-код (из файла расширения .class) и интерпретирует этот байт-код. Вопросы:

  1. Когда мы говорим интерпретировать, это означает перевод этого байт-кода в машиночитаемый код (иначе компиляция)?
  2. Итак, если JVM «компилирует» байт-код в машиночитаемый код, а JIT делает в основном одно и то же (преобразует байт-код в машиночитаемый код (компилирует в противном случае)), каковы преимущества использования JIT?

Спасибо за ответ.


person RickSanch3z    schedule 01.08.2017    source источник
comment
Вы искали в Интернете преимущества Java JIT или аналогичные?   -  person yshavit    schedule 01.08.2017
comment
@SergeiSirik Я читал аналогичный вопрос. Но ответов не нашел.   -  person RickSanch3z    schedule 01.08.2017
comment
@SergeiSirik, с другой стороны, может быть.   -  person RickSanch3z    schedule 01.08.2017
comment
@EJP да. Это.   -  person RickSanch3z    schedule 01.08.2017


Ответы (1)


Когда мы говорим интерпретировать, это означает перевод этого байт-кода в машиночитаемый код (иначе компиляция)?

Нет, это означает интерпретировать. Подумайте о гигантском операторе switch, включающем сам код операции, где каждый case извлекает требуемые операнды, если таковые имеются, из байт-кода, а затем непосредственно выполняет код, необходимый для реализации каждого кода операции. Например, рассмотрим iadd< /а>:

case IADD:
    push(pop()+pop());
    break;

Итак, если JVM «скомпилирует» байт-код в машиночитаемый код

Это не так.

и JIT делают в основном одно и то же (преобразование байт-кода в машиночитаемый код (компиляция в противном случае)), каковы преимущества использования JIT?

Во-первых, термин JIT устарел с версии Java 1.3. Теперь у нас есть HotSpot JVM, своего рода высокооптимизирующий JIT, который выборочно преобразует горячие точки в байтовом коде в машинный код, используя технологию, обычно присутствующую только в высокооптимизирующем компиляторе. , тогда как ранние JIT (а) были сторонними продуктами и (б) разбрызгивали машинный код для любого байтового кода, который встречался без разбора.

Во-вторых, интерпретация != компиляция, как отмечалось выше. Если HotSpot заметит, что определенный фрагмент байт-кода выполняется большую часть времени, он скомпилирует его в машинный код, чтобы он мог выполняться напрямую без интерпретации.

person user207421    schedule 01.08.2017
comment
поэтому, когда вы говорите где каждый случай извлекает требуемые операнды, если они есть, из байт-кода, а затем напрямую выполняет код, необходимый для реализации каждого кода операции. как выполняется JVM? Я думал, что JVM должна взаимодействовать с аппаратным обеспечением или базовой ОС. Спасибо. - person RickSanch3z; 01.08.2017
comment
Он просто запускает код, как и вы. Вызовы функций, системные вызовы, циклы, присваивания, что угодно. Вы знаете, это сам код, он уже связан с оборудованием и ОС. Здесь нет тайны. - person user207421; 01.08.2017
comment
Насколько я знаю, для каждой платформы есть специально написанная JVM. С другой стороны, у нас есть уникальный байт-код, который можно передавать между платформами. Не означает ли этот факт, что JVM должна преобразовывать байт-код в машиночитаемый код? Например, код операции преобразования 134 (0x86) i2f внутри платформы Java. Мне трудно понять. Нужно перечитать на свежую голову или углубиться в эту тему. - person RickSanch3z; 01.08.2017
comment
Нет, это не значит. Я все объяснил и привел пример. См. редактирование. - person user207421; 01.08.2017