Официально, нет такой вещи, как «байт-код» (по крайней мере, не на Java) - это просто «код». (Вы не найдете «байт-код» в любом месте спецификации виртуальной машины Java.)
Но неофициально это термин, применяемый к «инструкциям» виртуальной машины в атрибуте «Код» определения метода Java внутри Java. файл класса. И этот термин также применяется (возможно, не более «строгости») к инструкциям виртуальной машины нескольких других языков, таких как C++.
Концепция виртуальных машин обычно согласована с «p-кодом» UCSD Pascal и несколькими связанными с ней ранними языковыми реализациями на языке Pascal. В принципе, это форма компилятора «intermediate language», которая может быть интерпретирована непосредственно «virtual machine», а также требует дополнительного этапа компиляции для преобразования в собственный машинный код. Как правило, набор инструкций виртуальной машины предназначен (насколько это возможно) быть «независимым от машины» и не является специфическим для какой-либо конкретной операционной системы или набора аппаратных команд.
Инструкции для байткода, как правило, простые действия на «stack architecture». Архитектура стека удобна, поскольку ее легко компилировать, позволяет «инструкции» быть очень простыми, легко интерпретировать и является удобным «источником» для последующей оптимизации и шагов генерации кода в обычном сценарии компиляции. (Примечательным исключением является виртуальная машина Android Dalvik с набором команд, который не является архитектурой стека, а скорее представляет собой архитектуру на основе регистров.)
В Java это наиболее распространено для Java-программы изначально " интерпретируется ", причем байт-коды" исполняются "интерпретатором JVM. Затем, если и когда отдельные методы определяются как «горячие» (очень используемые), отдельные методы скомпилируются с использованием компилятора «точно в момент времени» (JITC) в набор команд «целевого» оборудования. Другие языковые реализации могут оставаться полностью интерпретированными или могут немедленно перевести на машинные инструкции.
Говоря в целом (значение термина часто зависит от конкретной среды разработки/исполнения, которую вы обсуждаете), «объектный код» относится к коду, который был скомпилирован и находится в «объектном модуле», - файл, содержащий оба машинная инструкция и другие «поддерживающие» данные, такие как информация о перемещении и отладочная информация. «Машинный код», OTOH, относится к машинным инструкциям, которые были «загружены» (предположительно из «объектного модуля») в подходящее место для их выполнения. –
Возможный дубликат [В чем разница между кодом сборки и байт-кодом?] (Https://stackoverflow.com/questions/1782415/what-is-the-difference-between-assembly-code-and-bytecode) – roottraveller