Что такое байт-коды и как их обрабатывает JVM - PullRequest
18 голосов
/ 05 февраля 2010

Я много раз слышал, что Java реализует JIT-компиляцию (точно по времени), и ее байт-коды, которые переносимы на разные платформы, «интерпретируются» JVM. Однако я не знаю, что такое байт-коды и что на самом деле означает JVM в архитектуре языка Java; Я хотел бы узнать о них больше.

Ответы [ 6 ]

45 голосов
/ 05 февраля 2010

JVM (виртуальная машина Java) имеет набор команд, аналогичный реальной машине. Имя, данное этому набору инструкций, - Java Bytecode. Это описано в Спецификации виртуальной машины Java . Другие языки перед выполнением переводятся в байт-код, например, ruby ​​и python. Байт-код Java находится на довольно низком уровне, в то время как у Python гораздо более высокий уровень.

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

Интерпретация обычно быстро запускается, но медленная во время выполнения, в то время как JIT имеет больше накладных расходов при запуске, но впоследствии выполняется быстрее Современные JVM используют комбинацию методов интерпретации и JIT, чтобы получить выгоду от обоих. Байт-код сначала интерпретируется, когда JIT переводит его в фоновом режиме. После завершения JIT-компиляции JVM переключается на использование этого кода вместо интерпретатора. Иногда JIT-компиляция может дать лучшие результаты, чем преждевременная компиляция, используемая для C и C ++, потому что она более динамична. JVM может отслеживать, как часто вызывается код, и каковы типичные пути в коде, и использовать эту информацию для генерации более эффективного кода во время работы программы. JVM может переключиться на этот новый код, как при первоначальном переключении с интерпретатора на код JIT.

Точно так же, как есть другие языки, которые компилируются в нативный код, такие как C, C ++, Fortran; есть компиляторы для других языков, которые выводят байт-код JVM. Одним из примеров является язык скала. Я считаю, что groovy и jruby также могут конвертировать в байт-код Java.

13 голосов
/ 05 февраля 2010

Байт-код - это шаг между вашим исходным кодом и фактическим машинным кодом. JVM - это то, что берет байт-код и переводит его в машинный код.

JIT относится к тому факту, что JVM выполняет этот перевод на лету, когда программа выполняется, а не за один шаг (как в традиционно скомпилированном / связанном языке, таком как C или C ++)

Смысл байт-кода в том, что вы получаете лучшую производительность, чем строго интерпретируемый язык (например, PHP), потому что байт-код уже частично скомпилирован и оптимизирован. Кроме того, поскольку байт-код не требует прямой интерпретации ЦП, его не нужно привязывать к какой-либо конкретной архитектуре ЦП, что делает его более переносимым.

Недостатком, конечно же, является то, что оно, как правило, будет немного медленнее, чем приложение, скомпилированное собственноручно, поскольку JVM еще предстоит выполнить некоторую работу по переводу байт-кода в машинный код.

1 голос
/ 05 февраля 2010

Когда вы компилируете что-то в Java, компилятор генерирует байт-код. Это нативный код для виртуальной машины Java. Затем JVM преобразует байт-код в собственный код для вашего процессора / архитектуры, где и происходит JIT. Без JIT JVM переводит программу по одной инструкции за раз, что очень медленно.

0 голосов
/ 13 сентября 2017

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

0 голосов
/ 05 февраля 2010

Байт-код является эквивалентом инструкций машинного языка в JVM.

0 голосов
/ 05 февраля 2010

jcyang уже предоставил ссылку на википедию, но эта лучше соответствует вашему вопросу:

Java Bytecode

Компилятор Java компилирует исходный код Java в файлы классов. Методы класса переводятся в байт-код, а виртуальная машина Java (JVM) интерпретирует этот байт-код. Компилятор Just In Time (JIT) может использоваться для преобразования байтового кода в машинный код для ускорения выполнения методов класса.

...