В чем разница между байт-кодом и микрокодом?

Я читал в Википедии о машинном коде, микрокоде и байт-коде.
Кажется, что микрокоды являются чем-то более низким уровнем, чем машинный код, в то время как байт-коды кажутся более высокоуровневыми.
Я действительно не понимал, как что-то может быть более низкоуровневым, чем машинный код, и в целом, как они оба относятся к машинному коду.

0 ответов

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

   0:   66 b8 05 00             mov    ax,0x5

Не все процессоры имеют микрокодирование, меньше, чем вы думаете, почти нет. Это скорее вещь риска, чем риска, AFAIK, некоторые риски были использованы. Когда вы думаете, что микрокодирование в основном думает о x86.

Нечто вроде переноса немедленного в регистр общего назначения не кажется проблемой, но затем посмотрите на некоторые другие инструкции, которые позволяют вам иметь операнды памяти, такие как

   0:   66 b8 05 00             mov    ax,0x5
   4:   66 67 8b 07             mov    ax,WORD PTR [bx]
   8:   66 67 8b 47 05          mov    ax,WORD PTR [bx+0x5]

взять третий

Считайте содержимое bx из файла регистра. Добавьте 5 к этому значению, выполните загрузку по размеру слова из памяти, используя этот адрес, сохраните это значение по оси в файле регистра.

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

add r3,r2,#5
load r4,[r3]
mov r1,r4

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

Нет никаких оснований ожидать, и мы почти уверены, что это тот случай, когда от одного поколения x86 к другому менялись базовые микро-двигатели, возможно, полная замена или, возможно, нет.

Думайте об этом как EBCDIC против ASCII против Unicode и т. Д. Основной алфавит заглавные AZ строчные буквы AZ и 0-9 плюс некоторые другие, мы можем представить их в цифровом виде, используя различные схемы кодирования, и только некоторые люди должны знать схему остальных из нас просто введите эти символы в поле для редактирования на веб-странице и не нужно знать, как это работает.

Процессоры, которые пережили несколько поколений, могут быть легко перепроектированы, сохраняя совместимость с прошлым. если вы возьмете 100 программистов и напишете подробное описание проблемы программирования, вы получите от 1 до 100 различных решений, которые все выполняют одну и ту же задачу. Некоторые могут быть лучше, чем другие. Если предположить, что все без ошибок, то все они являются действительными решениями. Возьмите 100 инженеров RTL, дайте им набор инструкций и спецификацию шины процессора, и вы получите от 1 до 100 различных решений, любое из которых технически может быть использовано для реализации этого процессора. Нет причин, по которым после нескольких лет использования одного дизайна может потребоваться совершенно новый дизайн. Или вы могли бы заняться Intel, команда A собирает все остальные процессоры, а команда B строит все остальные (они могут или не могут делать это сейчас, но делали это в течение некоторого периода), поэтому все остальные могут основываться на усовершенствованиях предыдущего проекта, но один за другим может быть совершенно другим под ним. И это не имеет ничего общего с микрокодированием или нет.

Вы, безусловно, можете сделать x86 без микрокодирования, а также сделать MIPS. Посмотрите LC-3 - очень очень простой набор инструкций, который может быть реализован примерно на странице verilog, но у создателей университета есть, по крайней мере, одно микрокодированное решение, которое является огромным для демонстрационных и образовательных целей. Исторически так же, как и сегодня, для создания чипа требуется много работы, каждое вращение стоит дорого (от десятков миллионов долларов за вращение) при меньшем числе вращений, необходимых для получения чего-то, что вы можете продать, тем лучше. Если бы я хотел сказать, скажем, контроллер стиральной машины и для экономии средств массового производства, я хотел бы столько, сколько я могу получить в одном чипе на плате контроллера. Я могу сделать все логичным, а не программируемым. Но если есть какие-то ошибки или особенности, которые должны быть изменены после того, как чип будет запущен в производство, это будет чипом, и мы бросим процессоры с предыдущей микросхемой. Если мы сделаем какой-то процент программируемого, а некоторые не смогут добавить какие-либо функции или исправить ошибки, и нам не придется ни вспоминать, ни бросать продукт на полках, это приведет к снижению. Иногда его даже дешевле производить. Программируемое решение не всегда должно быть больше непрограммируемого, оно зависит от решаемой проблемы. Опыт в этой области направляет эти решения. Чтобы заплатить за создание собственного чипа для такого продукта, вы должны получить окупаемость, потратить сотни тысяч на миллионы на производство чипа контроллера, так что каждый чип стоит на пару долларов дешевле, чем сборка платы с микроконтроллер и несколько других чипов.

Процессоры старшего поколения, такие как 6502, 8086 и предшественники, пытались сделать больше за команду, как показано выше. Наборы инструкций эволюционировали (или они смотрят на pdp8 и думают о ваших вопросах, а также о CISC, RISC и других). Таким образом, вы получаете микрокодирование в качестве баланса к возможности получить продукт, который вы можете продать без слишком большого количества вращений чипа, но имея все эти функции является действительным компромиссом. Но затем вы начали видеть RISC, VLIW и другие решения, в которых вы на самом деле не рассматривали микроинженер, используемый в качестве процессора общего назначения, но вы смотрели на проекты, в которых использовалось больше инструкций, но инструкции были проще в реализации и могли выполняться быстрее. Таким образом, есть выбор дизайна, плюсы и минусы, и, как мы знаем, оба решения способны к вычислениям общего назначения или вычислениям специального назначения. Некоторые из этих проектов и компаний не обязательно из-за того, что их набор инструкций лучше или хуже, некоторые из них занимаются маркетингом, некоторые находятся в нужном месте в нужное время, чтобы захватить рынок и контролировать его так, чтобы другие не могли проникнуть в него и т. Д. Мы видели, как некоторые из них пережили несколько поколений.

перейдите на страницу visual6502 и посмотрите, о чем они там говорили. процессор был спроектирован вокруг rom, считайте его конечным автоматом на основе rom, ваш код операции по сути является указателем на rom, rom содержит подкоманды, которые управляют конечным автоматом или микродвигателем, если хотите. Возможно, микрокод и разбиение инструкции машинного кода на более мелкие шаги будут иметь смысл. У AMD был процессор под названием AMD 29000, в какой-то степени этот процессор стал микро-двигателем, стоящим за первыми / ранними клонами AMD x86. Transmeta выбрала другой подход: во время выполнения она преобразовывала код x86 в код VLIW, поэтому они просто не продавали его как процессор VLIW, я не знаю... Их цель - сделать клон x86, а не какой-то новый процессор, я полагаю...

Такие языки, как C, должны были решить проблему того, чтобы различные процессорные системы на arpanet могли общаться друг с другом. Приходится каждый раз переписывать код связи (хорошо писать с нуля в спецификации), чтобы они могли разговаривать. Что если вы могли бы создать язык более высокого уровня, для которого вы внедрили бы бэкэнд, но программы высокого уровня можно запускать на каждой цели. Хотя C по-прежнему очень актуален по очевидным причинам, появились Паскаль, Java, Python и другие, у которых появилось еще более интересное понятие, если взять язык высокого уровня, скомпилировать его в машинный код, но машинный код, который вы затем пишете для конкретного целевого объекта. виртуальная машина для. как правило, это решение на основе стека, которое большинство процессоров может реализовать легко, не обязательно эффективно, но имеет хорошие шансы на успех при создании виртуальной машины для каждой целевой платформы. Вам не нужно нести исходный код, если вы не хотите больше, вы можете нести байт-код. Уже скомпилировано. Не так много отличий от симулятора набора команд, так что вы можете запускать программы ARM, например, на аркадных играх x86 или 6502, таких как Asteroids, на своем армейском телефоне или ноутбуке на базе x86, за исключением того, что набор инструкций байт-кода несколько разработан для этого эмулятора / виртуального машина и не обязательно оформлена как настоящий машинный язык.

Например, способ создания байт-кода JAVA заключается в том, что вы можете создать собственную справочную таблицу для каждой инструкции байт-кода и реализовать ее в собственных инструкциях (где это возможно, для некоторых инструкций требуются / требуются системные вызовы, которые вы все еще можете выполнять в собственном коде). конечно). Здесь снова подумайте о 6502, 8080/z80, 8086, у вас были коды операций, которые были байтом, сам байт не обязательно отображал логически таким образом, чтобы вы могли разделить его и увидеть операнды, это был байт, который вы использовали против таблицы поиска, Вы смотрите на MIPS, ARM, RISC-V и другие, у вас действительно нет кода операции (попытка mips и riscv, но если вы действительно выглядите его неполным), у вас есть намного большие инструкции, где части этой инструкции приводят в действие конечный автомат (подробнее) напрямую (в идеале). На основе кода операции создается код операции, который ищется или отображается в таблице, которая косвенно управляет конечным автоматом из битов кода операции / инструкции. да, между этими RISC есть некоторые размытые биты кода операции, у CISC могут быть некоторые биты, которые можно использовать более напрямую.

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

Как и в случае сравнения RISC и CISC, которое я обобщаю, вы, безусловно, можете скомпилировать JAVA в целевой код, также вы можете создать компилятор / набор инструментов C, который выводит байт-код для одной из этих виртуальных машин.


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

микрокод, некоторые конструкции процессоров реализуют машинный код, в основном эмулируя инструкции машинного кода, используя другой, в идеале более простой, набор команд. микрокод работает на микродвигателе.

байт-код, идеально общий набор команд, который можно эмулировать на виртуальной машине, чтобы скомпилированная программа могла доставляться и использоваться в несовместимых системах. Нужно только один раз разработать программу для ВМ и доставить ее, тот же двоичный файл. Не нужно разрабатывать версию для каждой целевой операционной системы / набора инструкций. Этот термин также используется как способ абстрагирования откомпилированных языковых интерфейсов от возможных целевых серверных частей в цепочке инструментов.

См. Веб-страницу Википедии для любого из этих терминов, в правом столбце написано:

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

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

Одной из аналогий является то, что машинный код сообщает процессору, какой микрокод (подпрограммы) использовать.

Почти полвека назад я знал наизусть Intel 8080, он был читаем для некоторых людей. Современные процессоры имеют гораздо больший набор команд, и я думаю, будет справедливо сказать, что большинство людей, даже не некоторые, знакомы со всем набором команд машинного кода своего любимого на сегодняшний день процессора.

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

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

Вышеприведенное описание предназначено для простого понимания, щелкнув по ссылкам выше, вы получите более точное и подробное объяснение.

Другие вопросы по тегам