Что такое байт-коды и как работает JVM

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

Java Bytecode

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

Ответ 5

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

Ответ 6

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

Ответ 7

Oracle jdk

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

Bytecode - это скомпилированный формат для Java-программ. Когда программа Java была преобразована в байт-код, она может быть передана по сети и выполнена виртуальной машиной Java (JVM). Файлы байтов обычно имеют расширение .class.