Байт-код Java — набор инструкций, исполняемых виртуальной машиной Java. Каждый код операции байт-кода — один байт. Используются не все 256 возможных значений кодов операций. 51 из них зарезервированы для использования в будущем.
Для программирования на языке Java или других JVM-совместимых языках, знание особенностей байт-кода не обязательно. Однако, как следует из публикации в журнале IBM developerWorks, «понимание байт-кода и понимание механизмов его генерации компилятором Java помогает Java-программисту так же, как и знание языка ассемблера помогает программисту, пишущему на Си или C++»
У одного байта существует 256 возможных значений, поэтому всего 256 возможных кодов операций в байт-коде. Код CA16 зарезервирован для использования отладчиком и не используется языком, как и коды FE16 и FF16, которые зарезервированы для использования виртуальной машиной и отладчиками. Коды в диапазоне CB16—FD16 в текущей версии JVM не используются и зарезервированы для будущих дополнений.
Инструкции можно разделить на несколько групп: загрузка и сохранение (например, ALOAD_0, ISTORE), арифметические и логические операции (например, IADD, FCMPL), преобразование типов (например, I2B, D2I), создание и преобразование объекта (например, NEW, PUTFIELD), управление стеком (например, DUP, POP), операторы перехода (например, GOTO, IFEQ), вызовы методов и возврат (например, INVOKESTATIC, IRETURN).
Также есть несколько инструкций, выполняющих специфические задачи, такие как выбрасывание исключений, синхронизация и т. д.
Многие инструкции имеют префиксы или суффиксы, соответствующие их операндам:Префикс или суффикс Тип операнда I integer L long S short B byte C character F float D double A reference
Например, операция IADD — сложение двух целых чисел, в то время как FADD — сложение чисел с плавающей точкой.
Рассмотрим следующий пример кода на языке Java. outer: for (int i = 2; i < 1000; i++) { for (int j = 2; j < i; j++) { if (i % j == 0) continue outer; } System.out.println (i); }
В большинстве случаев байт-код Java генерируется для исполнения на виртуальной машине Java из исходного кода на языке Java. Единственный оригинальный компилятор, преобразующий код на языке Java в байт-кода Java — это Javac, созданный компанией Sun Microsystems. Но поскольку все спецификации байт-кода Java доступны, существуют и сторонние компиляторы, генерирующие этот байт-код. Примеры таких компиляторов: Jikes(англ.)русск. — компилирует код на Java в Java байт-код (разработан IBM, написан на C++), Espresso — компилирует код на Java в Java байт-код (для версии Java 1.0), GCJ (GNU Compiler for Java) — компилирует код на Java в Java байт-код, также способен компилировать в нативный машинный код. Является частью GNU Compiler Collection.
Для некоторых проектов существуют компиляторы, позволяющие генерировать байт-код для JVM из исходного кода на другом языке программирования. Среди этих проектов: ColdFusion, JRuby и Jython (для Ruby и Python соответственно), Groovy (скриптовый язык, основанный на Java), Scala, Kotlin, JGNAT и AppletMagic, компиляторы с языка Си в Java байт-код, Clojure, MIDletPascal, JavaFX Script.
Байт-код Java разработан для исполнения на виртуальной машине Java (JVM, Java Virtual Machine) компании Sun. На сегодняшний день также доступны различные реализации JVM, как свободные, так и коммерческие.
Если выполнение байт-кода на JVM нежелательно, исходный код на языке Java или Java байт-код может быть скомпилирован напрямую в нативный машинный код с помощью, например, GNU компилятора для Java. Некоторые процессоры могут непосредственно исполнять байт-код Java.
Виртуальная машина Java имеет поддержку языков с динамической типизацией. Большинство существующих инструкций JVM имеют статическую типизацию. Сигнатуры методов в местах их вызова проверяются во время компиляции. Механизм переноса этой проверки на время выполнения отсутствует.