Java компилируется в промежуточный «байт-код» во время компиляции. Это в отличие от языка, подобного C, который компилируется в машинный язык во время компиляции. Байт-код Java не может быть напрямую выполнен на оборудовании так, как скомпилированный C-код. Вместо этого байт-код должен быть интерпретирован JVM (виртуальной машиной Java) во время выполнения для выполнения. Основным недостатком такого языка, как C, является то, что при его компиляции этот двоичный файл будет работать только на одной конкретной архитектуре (например, x86).
Интерпретируемые языки, такие как PHP, эффективно независимы от системы и зависят от интерпретатора, специфичного для системы и архитектуры. Это приводит к гораздо большей переносимости (одни и те же PHP-скрипты работают на машинах Windows, Linux и т. Д.). Однако такая интерпретация приводит к значительному снижению производительности. Языки высокого уровня, такие как PHP, требуют больше времени для интерпретации, чем машинно-специфические инструкции, которые могут быть выполнены аппаратным обеспечением.
Java стремится найти компромисс между чисто скомпилированным языком (без переносимости) и чисто интерпретируемым языком (который значительно медленнее). Это достигается путем компиляции кода в форму, которая ближе к машинному языку (фактически, байт-код Java является машинным языком, просто для виртуальной машины Java), но все же может легко переноситься между архитектурами. Поскольку для выполнения Java все еще требуется программный уровень (JVM), это интерпретируемый язык. Однако интерпретатор (JVM) работает в промежуточной форме, известной как байт-код, а не в необработанных исходных файлах. Этот байт-код генерируется во время компиляции компилятором Java. Поэтому Java также является скомпилированным языком. Работая таким образом, Java получает некоторые преимущества скомпилированных языков, а также некоторые преимущества интерпретируемых языков. Тем не менее, он также наследует некоторые ограничения от обоих этих языков.
Как указывает Божо, существуют некоторые стратегии для повышения производительности кода Java (и других языков байтового кода, таких как .Net) за счет использования компиляции Just in Time (JIT). Фактический процесс варьируется от реализации к реализации в зависимости от требований, но конечный результат заключается в том, что исходный код компилируется в байт-код во время компиляции, но затем он запускается через компилятор во время выполнения до его выполнения. Делая это, код может быть выполнен с почти родной скоростью. Некоторые платформы (я полагаю, что .Net делает это) сохраняют результат компиляции JIT, заменяя байтовый код. При этом все последующие исполнения программы будут выполняться так, как если бы программа была изначально скомпилирована.