2013-07-07 5 views
0

Является ли байтовый код промежуточной формой кода между кодом сборки и машинным кодом? И является ли байт-код таким же, как объектный?Что такое байт-код?

Это то, что я думаю - высокого уровня Язык-> Сборка language-> код Машинный код/​​Object (0s и 1s различны для разных процессоров.)

Является ли это так? Язык высокого уровня-> Язык ассемблера-> Байт-код (позаботится о виртуальной машине, которая преобразует его в машинный код) -> Код машины

Я читал это - SO- bytecode vs assembly language code, но нужно понимать это лучше

+0

Говоря в целом (значение термина часто зависит от конкретной среды разработки/исполнения, которую вы обсуждаете), «объектный код» относится к коду, который был скомпилирован и находится в «объектном модуле», - файл, содержащий оба машинная инструкция и другие «поддерживающие» данные, такие как информация о перемещении и отладочная информация. «Машинный код», OTOH, относится к машинным инструкциям, которые были «загружены» (предположительно из «объектного модуля») в подходящее место для их выполнения. –

+0

Возможный дубликат [В чем разница между кодом сборки и байт-кодом?] (Https://stackoverflow.com/questions/1782415/what-is-the-difference-between-assembly-code-and-bytecode) – roottraveller

ответ

4

Bytecode - это не что иное, как набор инструкций для виртуальной машины. Реализация этого может включать или не включать JIT в машинный код. Часто это не так. Например, официальная реализация Lua интерпретирует байт-код, а не преобразует его в машинный код. Реализации .NET и Java почти всегда компилируют «горячие пути» в машинный код для более эффективного выполнения. В конечном счете, это деталь реализации виртуальной машины и не имеет ничего общего с самим байт-кодом, что является просто инструкцией для виртуальной машины.

Код объекта, AFAIK, всегда является машинным кодом.

-1

Да, Bytecode - код перед машиной; который, в свою очередь, заботится о виртуальной среде выполнения и преобразуется в машинный код (в 0/1). В случае java это bytecode, а в случае .NET - IL/CIL.

Взятые из Here

ByteCode, также известный как р-код (портативный код), является одной из форм набора инструкций предназначены для эффективного исполнения программного переводчика. В отличие от читаемого человеком исходного кода, байт-коды являются компактными числовыми кодами, константами и ссылками (обычно числовые адреса) , которые кодируют результат синтаксического анализа и семантического анализа вещей как тип, область охвата и глубины вложенности программных объектов. Поэтому они обеспечивают гораздо лучшую производительность, чем прямая интерпретация исходного кода .

+0

Имеет ли Qbasic есть что-то? Потому что это переводчик? –

+0

человек, который его подавил - подумайте, почему? –

+0

Не был ли я (хотя я был известен как downvote, потому что кто-то спрашивает, почему downvote). Однако не всегда верно, что байт-код преобразуется в машинный код. –

1

Java Платформа: язык высокого уровня -> Байт-код код Byte выполняется VM, такие как JVM

платформа .Net: Высокий уровень языка -> CIL (Common Intermediate Language) --- Как раз вовремя скомпилированного (JIT) ---> Native машинный код

Родной сборник: высокий уровень языка -> код объекта (нативный машинный код) --- связан -> исполняемый файл (родной машинный код) Linking позаботится об исправлении адресных ссылок переменных среди r вещей.

1

Официально, нет такой вещи, как «байт-код» (по крайней мере, не на Java) - это просто «код». (Вы не найдете «байт-код» в любом месте спецификации виртуальной машины Java.)

Но неофициально это термин, применяемый к «инструкциям» виртуальной машины в атрибуте «Код» определения метода Java внутри Java. файл класса. И этот термин также применяется (возможно, не более «строгости») к инструкциям виртуальной машины нескольких других языков, таких как C++.

Концепция виртуальных машин обычно согласована с «p-кодом» UCSD Pascal и несколькими связанными с ней ранними языковыми реализациями на языке Pascal. В принципе, это форма компилятора «intermediate language», которая может быть интерпретирована непосредственно «virtual machine», а также требует дополнительного этапа компиляции для преобразования в собственный машинный код. Как правило, набор инструкций виртуальной машины предназначен (насколько это возможно) быть «независимым от машины» и не является специфическим для какой-либо конкретной операционной системы или набора аппаратных команд.

Инструкции для байткода, как правило, простые действия на «stack architecture». Архитектура стека удобна, поскольку ее легко компилировать, позволяет «инструкции» быть очень простыми, легко интерпретировать и является удобным «источником» для последующей оптимизации и шагов генерации кода в обычном сценарии компиляции. (Примечательным исключением является виртуальная машина Android Dalvik с набором команд, который не является архитектурой стека, а скорее представляет собой архитектуру на основе регистров.)

В Java это наиболее распространено для Java-программы изначально " интерпретируется ", причем байт-коды" исполняются "интерпретатором JVM. Затем, если и когда отдельные методы определяются как «горячие» (очень используемые), отдельные методы скомпилируются с использованием компилятора «точно в момент времени» (JITC) в набор команд «целевого» оборудования. Другие языковые реализации могут оставаться полностью интерпретированными или могут немедленно перевести на машинные инструкции.

Смежные вопросы