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.