2009-11-23 2 views
15

Хотя при поиске различных различий в значениях исходного кода, байт-кода, кода сборки, машинного кода, компиляторов, компоновщиков, интерпретаторов, сборщиков и всего остального, я только путался с различием между байтовым кодом и кодом сборки.В чем разница между кодом сборки и байт-кодом?

В частности, введение этого wikipedia article для описания CIL меня смутило, поскольку он, как представляется, использует оба термина (код сборки и байт-код), что заставляет меня думать, что они могут означать точно то же самое.

+0

Если у вас есть доступ к книге «Структурированная компьютерная организация Эндрю Таненбаума», у него будет технически корректное определение этих двух терминов. –

+0

См. Также, например. [этот ответ] (http://stackoverflow.com/a/2203296/874188) к аналогичному вопросу о Java. – tripleee

+0

См. Также http://stackoverflow.com/questions/17511931/what-exactly-is-bytecode – tripleee

ответ

2

Assembly code обычно используется для обозначения кода, который после компиляции до Machine Code может выполняться процессором, а bytecode - в виртуальной машине.

Источник путаницы над CIL может быть связан с тем фактом, что machine code для процессора X может быть интерпретирован виртуальной машиной, работающей на процессоре Y (например).

Примечание что виртуальная реализация машины может быть сделана, чтобы интерпретировать любой машинный код и/или байткод: он остается разработчикам и их стремление (и время на их руках) ;-)

+0

Еще раз: код сборки не выполняется реальным процессором. Выполняется «Машинный код». Код сборки - это читаемая человеком форма машинного кода (или в некоторых случаях: байтовый код). – Juergen

+0

да ... извините ... – jldupont

-1

Код сборки (представляет) собственный код для процессора, который вы программируете.

Bytecode - это термин для двоичной версии «команд», которые скомпилированы для выполнения интерпретатором или виртуальной машиной.

В сущности, байт-коды определяют коды операций для виртуального процессора, а сборка состоит из кодов операций физического процессора. (мы будем игнорировать микрокод внутри CPU на данный момент :-))

+2

Не совсем правильно. Код сборки - это читаемая человеком форма машинного кода. Машинный код - это собственный код для процессора. – Juergen

+0

@Juergen, вы смешиваете форму и контент, это вопрос детализации или контекста, который решает между терминологией, как «cpu opcodes», «машинный язык», «ассемблер». В контексте вопроса ОП они эквивалентны имхо. – rsp

+0

ИМХО, вы смешиваете вещи, так как ИТ-люди часто слабы в своей формулировке, все становится запутанным. Язык ассемблера является понятным для человека представлением некоторого машинного языка (также может быть периодом виртуальной машины - например, байт-кода). См. Статью Википедии, которую я связал в своем ответе. – Juergen

0

ассемблер - это макроязык. Это набор инструкций, используемых для указания процессора или другого устройства. Он переведен в машинный код, который является читаемым инструкциям CPU.

Байт-код - это инструкции для интерпретации виртуальной машины и все же необходимо перевести ее в машинный код перед выполнением.

+0

Ассемблер не обязательно является макроязыком. Ассемблер в базовой форме - это просто читаемая человеком форма машинного кода. – Juergen

11

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

Почему путаница тогда? Таким образом, вы не можете сравнивать язык ассемблера с байт-кодом. Конечно, байт-код может также иметь код сборки - это означает его читаемую человеком форму, потому что «язык ассемблера» не обязательно означает, что он предназначен для реальной машины, - но это читаемая человеком форма какого-либо родного языка - для процессоров этот родной язык - это машинный код, но вы также можете иметь ассемблерный код псевдо-(интерпретируемой) машины, такой как Bytecode.

Смотрите также: Assembly Language

Далее дистресс приходит, конечно, - как вы можете видеть все обсуждения здесь - потому что люди (и я), как правило, слабым в формулировках. «Язык ассемблера» часто используется при описании машинного кода. Это, конечно, не совсем правильно, потому что язык ассемблера - это только читаемая человеком форма кода некоторых машин.

+0

Что ИТ-люди (надеюсь) должны абстрагироваться от формы. Отображение между машинным кодом и сборкой выполняется для оптимизации для целевой аудитории, процессора или человека. – rsp

0

Скомпонованный код запускается на процессоре с определенным набором команд, тогда как байт-код может быть выполнен на виртуальной машине (например, время выполнения Java) на любом CPU, который может запускать виртуальную машину.

+0

«Собранный код» также называется «машинный код» - только для уточнения. См. Ссылку в моем ответе. – Juergen

+0

Если вы имеете в виду «код сборки», это, конечно, не машинный код, так как он должен быть «собран» ассемблером в первую очередь - результатом является машинный код. – Juergen

1

Я помню, что с самого начала микроконтроллеров и микропроцессоров слово Assembly использовалось для обозначения машинного кода в удобном для восприятия человеком виде. Мне кажется, что Microsoft вызвала путаницу, используя одно и то же слово «Assembly», чтобы назвать, какой будет ByteCode, созданный их компиляторами dotNET Framework. Итак, в этом случае я бы сказал, что то, что «Bytecode» означает для среды выполнения Java, похоже на то, что это новое использование слова «Assembly» означает среду Microsoft dotNET runTime. Я ошибаюсь, чтобы предположить это?

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