байт код и машинный код в чем разница
В чем разница между машинным кодом и байт-кодом
Содержание:
Ключевые области покрыты
1. Что такое машинный код
— определение, функциональность
2. Что такое байт-код
— определение, функциональность
3. Какова связь между машинным кодом и байт-кодом
— Схема ассоциации
4. В чем разница между машинным кодом и байт-кодом
— Сравнение основных различий
Основные условия
Байт-код, компилятор, интерпретатор, машинный код
Что такое машинный код
Рисунок 1: Машинный код
Компилятор сразу преобразует весь исходный код в эквивалентный машинный код. Интерпретатор построчно преобразует исходный код в эквивалентный машинный код. Поэтому язык на основе компилятора работает быстрее, чем язык на основе интерпретатора. Наконец, CPU может напрямую выполнять машинный код для выполнения определенной задачи в программе.
Что такое байт-код
Байт-код создается после компиляции исходного кода. Это промежуточный код. Байт-код является исполняемым на виртуальной машине. Кроме того, виртуальная машина преобразует байт-код в машинный код.
Рисунок 2: Java Bytecode
Java-программы в основном используют байт-коды. При компиляции исходного кода Java компилятор Java преобразует этот исходный код в байт-код. Кроме того, этот байт-код исполняется виртуальной машиной Java (JVM). JVM преобразует байт-код в машинный код. Любой компьютер с JVM может выполнить этот байт-код. Другими словами, любая платформа, состоящая из JVM, может выполнять байт-код Java.
Связь между машинным кодом и байт-кодом
Разница между машинным кодом и байт-кодом
Определение
основа
Кроме того, основное различие между машинным кодом и байт-кодом заключается в том, что процессор или процессор могут напрямую выполнять машинный код. С другой стороны, после компиляции исходного кода создается байт-код. Виртуальная машина может выполнить его.
Другое различие между машинным кодом и байт-кодом заключается в том, что машинный код является кодом низкого уровня, а байт-код является промежуточным кодом.
Заключение
Вкратце, процессор или процессор могут напрямую выполнять машинный код. Однако байт-код создается после компиляции исходного кода, и виртуальная машина может его выполнить. Таким образом, в этом главное отличие машинного кода от байт-кода.
Ссылка:
1. «Машинный код». Википедия, Фонд Викимедиа, 24 сентября 2018 г.
Разница между двоичным и байт кодом?
2 ответа 2
Небольшая историческая справка.
В самых первых компьютерах (1940-е годы) команды и данные хранились раздельно. Данные располагались в памяти, а команды задавались перемычками на лицевой панели. Из-за этого некоторые команды нельзя было реализовать в принципе. Например, нельзя было передать управление на команду, адрес которой хранится в памяти. Сейчас с помощью таких косвенных вызовов работают виртуальные методы в Java/C++/C#.
Группа инженеров под руководством Фон Неймана предложила несколько архитектурных принципов, которые помогли сделать компьютеры проще и в то же время мощнее. Один из них гласит, что и программы и данные хранятся в оперативной памяти. Поскольку компьютер не хранит ничего кроме чисел, процессор «видит» программу именно как массив чисел.
Числа хранятся в двоичном виде (ещё один принцип Фон Неймана). Минимальной единицей хранения является байт. Я читал, что существовали компьютеры с 7-битными и 9-битными словами, правда, никогда с ними не работал. Насколько я знаю, уже в конце 60-х годов победил 8-битный байт.
Вот пример машинного кода и его представления на языке Ассемблера. Я нашёл его в Google. Слева указан порядковый номер (адрес) первого байта команды. Во второй колонке мы видим байты команды, они записаны в восьмеричной системе счисления. В третьей колонке мнемоники Ассемблера, которые упрощают восприятие программы человеком. Некоторые команды занимают один байт, а некоторые два. В этом примере нет команд, которые занимают три, четыре и больше байт, но такие команды также встречаются.
Именно это и есть двоичный код, который «понимает» процессор.
Теперь о байт-коде. Основной проблемой двоичного кода является его специфичность. Два разных устройства, например, ноутбук и мобильный телефон, имеют кардинально разные процессоры и кардинально разные наборы команд и кодов.
Если мы захотим написать для них программу, нам придётся писать две программы. Традиционно проблема переносимости решается с помощью языков высокого уровня и компиляторов. Хороший компилятор это сложная программа, которую долго разрабатывать и трудно поддерживать. Если наш компилятор поддерживает пять разных архитектур, в нём пять разных оптимизаторов и кодогенераторов.
Один из способов проблемы переносимости и сложности это промежуточная виртуальная машина. Она должна иметь архитектуру низкого уровня, чтобы её можно было просто реализовать. С другой стороны, она должна включать в себя основные возможности современных процессоров, чтобы не проседать в производительности.
Виртуальный процессор работает также, как и реальный: он видит массив чисел, и воспринимает их как команды для выполнения. Байт-код внешне совершенно идентичен двоичному коду. Вот пример байт-кода виртуальной машины Java:
Единственная разница заключается в том, что двоичный код исполняет физический процессор, а байт-код — очень простая программа-интерпретатор. Впрочем, насколько я знаю, существуют физические процессоры, которые умеют выполнять байт-код Java-машины, так что разница между ними может быть и совсем условной.
Байт-код
Байт-код или байтко́д (англ. byte-code ), иногда также используется термин псевдоко́д — машинно-независимый код низкого уровня, генерируемый транслятором и исполняемый интерпретатором. Большинство инструкций байт-кода эквивалентны одной или нескольким командам ассемблера. Трансляция в байт-код занимает промежуточное положение между компиляцией в машинный код и интерпретацией.
Байт-код называется так, потому что длина каждого кода операции — один байт, но длина кода команды различна. Каждая инструкция представляет собой однобайтовый код операции от 0 до 255, за которым следуют такие параметры, как регистры или адреса памяти. Это в типичном случае, но спецификация байт-кода значительно различается в разных языках.
Программа на байт-коде обычно выполняется интерпретатором байт-кода (обычно он называется виртуальной машиной, поскольку подобен компьютеру). Преимущество — в портируемости, т. е. один и тот же байт-код может исполняться на разных платформах и архитектурах. То же самое преимущество дают интерпретируемые языки. Однако, поскольку байт-код обычно менее абстрактный, более компактный и более «компьютерный», чем исходный код, эффективность байт-кода обычно выше, чем чистая интерпретация исходного кода, предназначенного для правки человеком. По этой причине многие современные интерпретируемые языки на самом деле транслируют в байт-код и запускают интерпретатор байт-кода. К таким языкам относятся Perl, PHP, Ruby (начиная с версии 1.9) и Python. Программы на Java обычно передаются на целевую машину в виде байт-кода, который перед исполнением транслируется в машинный код «на лету» — с помощью JIT-компиляции. В стандарте открытых загрузчиков Open Firmware фирмы Sun Microsystems байт-код представляет операторы языка Forth.
В то же время возможно создание процессоров, для которых данный байт-код является непосредственно машинным кодом (такие процессоры существуют, например, для Java и Forth).
Также некоторый интерес представляет p-код (p-code), который похож на байт-код, но физически может быть менее лаконичным и сильно варьироваться по длине инструкции. Он работает на очень высоком уровне, например «напечатать строку» или «очистить экран». P-код повсеместно используется в СУБД и некоторых реализациях BASIC и Паскаля.
Языки и среды программирования, использующие байткод
См. также
Полезное
Смотреть что такое «Байт-код» в других словарях:
БАЙТ-КОД — Иногда используется термин псевдокод машинно независимый код низкого уровня, генерируемый транслятором и исполняемый интерпретатором (англ. byte code) Словарь бизнес терминов. Академик.ру. 2001 … Словарь бизнес-терминов
байт-код — Машинно независимый код, генерируемый Java компилятором. [ГОСТ Р 54456 2011] Тематики телевидение, радиовещание, видео EN byte codeJava byte code … Справочник технического переводчика
Байт-код Java — Байт код Java набор инструкций, исполняемых виртуальной машиной Java. Каждый код операции байт кода один байт. Используются не все 256 возможных значений кодов операций. 51 из них зарезервированы для использования в будущем.… … Википедия
Код (значения) — Код (фр. code, от лат. codex): В Викисловаре есть статья «код» … Википедия
Код операции — Эта статья об инструкциях; о системе команд в целом см.: Машинный код. Код операции, операционный код, опкод часть машинного языка, называемая инструкцией и определяющая операцию, которая должна быть выполнена. Определение и формат кодов… … Википедия
Байт — в запоминающих устройствах наименьшая адресуемая единица данных в памяти ЭВМ, обрабатываемая как единое целое. По умолчанию байт считается равным 8 битам. Обычно в системах кодирования данных байт представляет собой код одного печатного или… … Финансовый словарь
БАЙТ — (англ. byte) набор из стандартного числа (обычно 8) битов (двоичных единиц), используемый как единица количества информации при её передаче, хранении и обработке на ЭВМ. В международных системах кодирования данных (ASCII, EBCDIC) Б. представляет… … Юридическая энциклопедия
Байт — У этого термина существуют и другие значения, см. Byte. Байт (англ. byte) единица хранения и обработки цифровой информации; совокупность битов, обрабатываемая компьютером одномоментно. В современных вычислительных системах байт… … Википедия
Код операции (информатика) — Эта статья об инструкциях; о системе команд в целом см.: Машинный код. В комьютерной отрасли под кодом операции (также операционный код, опкод англ. operation code) понимают часть машинного языка, называемую инструкцией, определяющую операцию,… … Википедия
Промежуточный код — Байт код или байткод (англ. byte code), иногда также используется термин псевдокод машинно независимый код низкого уровня, генерируемый транслятором и исполняемый интерпретатором. Большинство инструкций байт кода эквивалентны одной или нескольким … Википедия
В чем разница между управляемым/байтовым кодом и неуправляемым/машинным кодом?
Иногда бывает трудно описать некоторые вещи, которые» американские программисты » могут считать простыми для непрограммистов и типов управления.
Как бы вы описали разницу между управляемым кодом (или байтовым кодом Java) и неуправляемым/машинным кодом для непрограммиста?
10 ответов:
Управляемый код = = «особняк с целым штатом или дворецкими, горничными, поварами и садовниками, чтобы сохранить место хорошим»
Неуправляемый код = = «где я раньше жил в университете»
Подумайте о своем столе, если вы регулярно убираете его, есть место, чтобы сидеть, что вы на самом деле работаете перед вами. если вы не уберете его, у вас закончится пространство.
Это пространство эквивалентно ресурсам компьютера, таким как ОЗУ, жесткий диск и т. д.
Я поражен тем, что получается из этой дискуссии (ну, не совсем, но риторически). Позвольте мне кое-что добавить, даже если я опоздаю.
Edit: особенно поучительно взглянуть на комментарии к этому ответу С. Лотта в свете альтернативных методов для памяти управление/безопасность / мобильность кода, на которую я указал.
Я считаю, что нетехнические люди не должны беспокоиться о технических деталях на этом уровне детализации.
Правка 2: сборка мусора-это метод управления памятью, и, как и любой метод реализации, его нужно понимать, чтобы правильно использовать. Посмотрите, как в ITA Software они обходят GC, чтобы получить хорошую производительность :
Edit 3: (чтобы избежать недоразумений) является ли GC лучше, чем возиться непосредственно с указателями? Большую часть времени, конечно, но есть альтернативы обоим. Есть ли необходимость беспокоить пользователей этими деталями? Я не вижу никаких доказательств, что это так, кроме того, что при необходимости развеивается некоторая маркетинговая шумиха.
Я почти уверен, что основная интерпретация такова:
Возможно, сравнить это с инвестированием в фондовый рынок.
Управляемый (.NET) или байт-код (Java) сэкономит вам время и деньги.
Теперь давайте сравним два:
Неуправляемый или машинный код
Вам необходимо выполнить выделение и очистку собственных ресурсов (ОЗУ / памяти). Если вы что-то забудете, вы в конечном итоге получите так называемую «утечку памяти», которая может привести к сбою компьютера. Утечка памяти-это термин, обозначающий, когда приложение начинает использовать (съедать) оперативную память/память, но не отпускает ее, чтобы компьютер мог используйте if для других приложений; в конечном итоге это приводит к сбою компьютера.
Для запуска вашего приложения на различных операционных системах (Mac OSX, Windows и т. д.) вам нужно скомпилировать свой код специально для каждой операционной системы и, возможно, изменить много кода, специфичного для операционной системы, чтобы он работал на каждой операционной системе.
Все выделение и очистка ресурсов (ОЗУ / памяти) выполняются за вас и риск возникновения «утечек памяти» сведен к минимуму. Это позволяет больше времени кодировать функции вместо того, чтобы тратить его на управление ресурсами.
Для запуска вашего приложения на различных операционных системах (Mac OSX, Windows и т. д.) вы просто компилируете один раз, и он будет работать на каждом, пока они поддерживают данную платформу, на которой вы запускаете приложение (.NET Framework / Mono или Java).
Короче Говоря
Неуправляемый код-это список инструкций, которым должен следовать компьютер. Управляемый код-это список задач для компьютера, которые компьютер может интерпретировать самостоятельно.
Большая разница заключается в управлении памятью. С машинным кодом вы должны управлять памятью самостоятельно. Это может быть трудно и является причиной большого количества ошибок и большого количества времени разработки, потраченного на отслеживание этих ошибок. С управляемым кодом у вас все еще есть проблемы, но их гораздо меньше, и их легче отследить. Обычно это означает меньшее количество ошибок в программном обеспечении и меньшее время разработки.
Есть и другие отличия, но управление памятью, вероятно, самое большое.
Если бы они были все еще интересно, что я мог бы упомянуть, как много эксплойтов от переполнения буфера и что вы не получаете этого с управляемым кодом, или что повторное использование кода теперь легко, или что нам больше не нужно иметь дело с COM (Если вам все равно повезет). Я бы, наверное, держался подальше от кома, иначе разразился бы тирадой о том, как это ужасно.
Это как разница между игрой в бильярд с бамперами и без них по краям. Если вы и все остальные игроки не всегда делаете идеальные броски, вам нужно что-то, чтобы держать шары на столе. (Игнорируйте намеренные рикошеты. )
» особый термин управляемый код особенно распространен в мире Microsoft.»
Поскольку я работаю в мире MacOS и Linux, это не тот термин, который я использую или встречаю.
В блоге Брэда Абрамса «What is Managed Code» есть определение, которое говорит такие вещи, как «.NET Framework Common Language Runtime».
Моя точка зрения такова: может быть, вообще не стоит объяснять это терминами. Если это ошибка, взлом или обход, это не очень важно. Конечно, нет. достаточно важная, чтобы составить сложное описание непрофессионалов. Он может исчезнуть со следующим выпуском некоторой партии продуктов MS.
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
Машинный код
Машинный код или машинный язык представляет собой набор инструкций, выполняемых непосредственно центральным процессором компьютера (CPU). Каждая команда выполняет очень конкретную задачу, например, загрузки (load), перехода (jump) или элементарной арифметической или логической операции для единицы данных в регистре процессора или памяти. Каждая программа выполняется непосредственно процессором и состоит из ряда таких инструкций.
Машинный код можно рассматривать как самое низкоуровневое представление скомпилированной или собранной компьютерной программы или в качестве примитивного и аппаратно-зависимого языка программирования. Писать программы непосредственно в машинном коде возможно, однако это утомительно и подвержено ошибкам, так как необходимо управлять отдельными битами и вычислять числовые адреса и константы вручную. По этой причине машинный код практически не используется для написания программ.
Почти все практические программы сегодня написаны на языках более высокого уровня или ассемблере. Исходный код затем транслируется в исполняемый машинный код с помощью таких утилит, как интерпретаторы, компиляторы, ассемблеры, и/или линкеры. [Источник 1]
Содержание
Инструкции машинного кода (ISA)
Каждый процессор или семейство процессоров имеет свой собственный набор инструкций машинного кода. Инструкции являются паттернами битов, которые в силу физического устройства соответствуют различным командам машины. Говорят, что процессор A совместим с процессором B, если процессор A полностью «понимает» машинный код процессора B. Если процессоры A и B имеют некоторое подмножество инструкций, по которым они взаимно совместимы, то говорят, что они одной архитектуры. Таким образом, набор команд является специфическим для одного класса процессоров. Новые процессоры одной архитектуры часто включают в себя все инструкции предшественника и могут включать дополнительные. Иногда новые процессоры прекращают поддержку или изменяют значение какого-либо кода команды (как правило, потому, что это необходимо для новых целей), влияя на совместимость кода до некоторой степени; даже почти полностью совместимые процессоры могут показать различное поведение для некоторых команд, но это редко является проблемой.
Системы также могут отличаться в других деталях, таких как расположение памяти, операционные системы или периферийные устройства. Поскольку программа обычно зависит от таких факторов, различные системы, как правило, не запустят один и тот же машинный код, даже если используется тот же тип процессора. [Источник 2]
Виды ISA
x86 всегда был архитектурой с инструкциями переменной длины, так что когда пришла 64-битная эра, расширения x64 не очень сильно повлияли на ISA. ARM это RISC-процессор разработанный с учетом инструкций одинаковой длины, что было некоторым преимуществом в прошлом. Так что в самом начале все инструкции ARM кодировались 4-мя байтами. Это то, что сейчас называется «режим ARM».
На самом деле, самые используемые инструкции процессора на практике могут быть закодированы c использованием меньшего количества информации. Так что была добавлена ISA с названием Thumb, где каждая инструкция кодируется всего лишь 2-мя байтами. Теперь это называется «режим Thumb». Но не все инструкции ARM могут быть закодированы в двух байтах, так что набор инструкций Thumb ограниченный. Код, скомпилированный для режима ARM и Thumb может сосуществовать в одной программе. Затем создатели ARM решили, что Thumb можно расширить: так появился Thumb-2 (в ARMv7). Thumb-2 это всё ещё двухбайтные инструкции, но некоторые новые инструкции имеют длину 4 байта. Распространено заблуждение, что Thumb-2 — это смесь ARM и Thumb. Это неверно. Режим Thumb-2 был дополнен до более полной поддержки возможностей процессора и теперь может легко конкурировать с режимом ARM. Основное количество приложений для iPod/iPhone/iPad скомпилировано для набора инструкций Thumb-2, потому что Xcode делает так по умолчанию. Потом появился 64-битный ARM. Это ISA снова с 4-байтными инструкциями, без дополнительного режима Thumb. Но 64-битные требования повлияли на ISA, так что теперь у нас 3 набора инструкций ARM: режим ARM, режим Thumb (включая Thumb-2) и ARM64. Эти наборы инструкций частично пересекаются, но можно сказать, это скорее разные наборы, нежели вариации одного. Существует ещё много RISC ISA с инструкциями фиксированной 32-битной длины — это как минимум MIPS, PowerPC и Alpha AXP. [Источник 3]
Выполнение инструкций
Компьютерная программа представляет собой последовательность команд, которые выполняются процессором. В то время как простые процессоры выполняют инструкции один за другим, суперскалярные процессоры способны выполнять несколько команд одновременно.
Программа может содержать специальные инструкций, которые передают выполнение инструкции, не идущей по порядку вслед за предыдущей. Условные переходы принимаются (выполнение продолжается по другому адресу) или нет (выполнение продолжается на следующей инструкции) в зависимости от некоторых условий.
Абсолютный и позиционно-независимый код
Позиционно-независимый код — программа, которая может быть размещена в любой области памяти, так как все ссылки на ячейки памяти в ней относительные (например, относительно счётчика команд). Такую программу можно переместить в другую область памяти в любой момент, в отличие от перемещаемой программы, которая хотя и может быть загружена в любую область памяти, но после загрузки должна оставаться на том же месте.
Возможность создания позиционно-независимого кода зависит от архитектуры и системы команд целевой платформы. Например, если во всех инструкциях перехода в системе команд должны указываться абсолютные адреса, то код, требующий переходов, практически невозможно сделать позиционно-независимым. В архитектуре x86 непосредственная адресация в инструкциях работы с данными представлена только абсолютными адресами, но поскольку адреса данных считаются относительно сегментного регистра, который можно поменять в любой момент, это позволяет создавать позиционно-независимый код со своими ячейками памяти для данных. Кроме того, некоторые ограничения набора команд могут сниматься с помощью самомодифицирующегося кода или нетривиальных последовательностей инструкций.
Хранение в памяти
Гарвардская архитектура представляет собой компьютерную архитектуру с физически разделенным хранением сигнальных путей для инструкций и данных. На сегодняшний день, в большинстве процессоров реализованы отдельные сигнальные пути для повышения производительности. Модифицированная Гарвардская архитектура поддерживает такие задачи, как загрузка исполняемой программы из дисковой памяти в качестве данных, а затем её выполнение. Гарвардская архитектура контрастирует с архитектурой фон Неймана, где данные и код хранятся в памяти вместе, и считываются процессором, позволяя компьютеру выполнять команды.
С точки зрения процесса, кодовое пространство является частью его адресного пространства, в котором код сохраняется во время исполнения. В многозадачных системах оно включает в себя сегмент кода программы и, как правило, совместно используемые библиотеки. В многопоточной среде различные потоки одного процесса используют кодовое пространство и пространство данных совместно, что повышает скорость переключения потока.
Связь с языками программирования
Ассемблерные языки
Гораздо более читаемым представлением машинного языка называется язык ассемблера, использующий мнемонические коды для обозначения инструкций машинного кода, а не с помощью числовых значений. Например, на процессоре Zilog Z80, машинный код 00000101, который дает указание процессору декрементировать регистр процессора B, будет представлен на языке ассемблера как DEC B.
Связь с микрокодом
В некоторых компьютерных архитектурах, машинный код реализуется с помощью более фундаментального базового слоя программ, называемых микропрограммами, обеспечивающими общий интерфейс машинного языка для линейки различных моделей компьютеров с самыми различными базовыми потоками данных. Это делается для облегчения портирования программ на машинном языке между различными моделями. Примером такого использования являются компьютеры IBM System/360 и их наследники. Несмотря на то, что ширина потоков данных разнится от 8 до 64 бит и более, тем не менее они представляют общую архитектуру на уровне машинного языка по всей линейке.
Использование микрокода для реализации эмулятора позволяет компьютеру симулировать совершенно другую архитектуру. Семейство System / 360 использовало это для портирования программ с более ранних машин IBM на новые семейства компьютеров, например на IBM 1401/1440/1460.
Связь с байткодом
Машинный код, как правило, отличается от байт-кода (также известного как р-код), который либо выполняется интерпретатором, или сам компилируется в машинный код для более быстрого исполнения. Исключением является ситуация, когда процессор предназначен для использования конкретного байт-кода как машинного, например, как в случае с процессорами Java. Машинный и ассемблерный код иногда называют собственным (внутренним) кодом ЭВМ, когда ссылаются на платформо-зависимые части свойств или библиотек языка. [Источник 4]
Примеры
Пример MIPS 32-bit инструкции
Набор инструкций MIPS – пример машинного кода с инструкциями фиксированной длины – 32 бита. Тип инструкции содержится в поле op (поле операции) – первые 6 бит. Например типы инструкций перехода или немедленных операций полностью определяются этим полем. Инструкции регистров включают дополнительное поле funct, для определения конкретной операции. Все поля, использущиеся в данных типах инструкций:
Rs,rt и rd – индикаторы задействования регистров, shamt – параметр сдвига,а поле address/immediate явно содержит операнд.
Пример: сложение значений в регистрах 1 и 2 и запись результата в регистр 6:
Пример: загрузка значения в регистр 8, взятое из ячейки памяти, находящейся на 68 ячеек дальше, чем адрес, находящийся в регистре 3:
Пример: переход к адресу 1024:
Пример для x86 (MS DOS) – “Hello, World!”
Программа «Hello, world!» для процессора архитектуры x86 (ОС MS-DOS, вывод при помощи BIOS прерывания int 10h) выглядит следующим образом (в шестнадцатеричном представлении):
BB 11 01 B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21
Данная программа работает при её размещении по смещению 10016. Отдельные инструкции выделены цветом: