Были ли первые ассемблеры написаны в машинном коде?

42

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

Тем не менее, это заставило меня задуматься. Использование языка высокого уровня для написания моего ассемблера, безусловно, удобно, но для самого первого ассемблера, когда-либо написанного (т.е. в истории), не нужно ли его писать машинным кодом, поскольку это все, что существовало в то время?

И связанный вопрос ... как насчет сегодня? Если выйдет новая архитектура процессора с новым набором команд и новым синтаксисом сборки, как будет построен ассемблер? Я предполагаю, что вы все еще можете использовать существующий язык высокого уровня для генерации двоичных файлов для программы на ассемблере, поскольку, если вы знаете синтаксис языков ассемблера и машинного языка для вашей новой платформы, тогда задача написания ассемблера - это просто задача анализа текста, которая по своей природе не связана с этой платформой (т. е. должна быть написана на машинном языке этой платформы) ... что является той самой причиной, по которой я могу «обманывать», когда пишу свой Hack-ассемблер в 2012 году, и использовать некоторые существующие ранее язык высокого уровня, чтобы помочь мне.

The111
источник
17
Вы всегда можете написать кросс-компилятор и использовать его для создания кода для нового оборудования в настоящее время.
Kerrek SB
@PersonalNexus Спасибо за это, редактировать snafu с моей стороны.
Яннис
1
@YannisRizos Нет проблем, случается с лучшими из нас :)
PersonalNexus
8
Вполне возможно, что первый ассемблер мог быть написан в сборке на листе бумаги. Преобразование в машинный код могло тогда быть выполнено все еще на бумаге и записано в какое-то ПЗУ с переключателями, по одному слову за раз.
Mouviciel
Моим первым компьютером был ZX81 с 1 КБ ОЗУ, поэтому мои программы (машинно короткие) с машинным кодом были фактически переведены вручную.
user281377

Ответы:

37

для самого первого ассемблера, когда-либо написанного (т. е. в истории), не нужно ли его писать в машинном коде

Не обязательно. Конечно, самая первая версия ассемблера v0.00 должна быть написана на машинном коде, но она не будет достаточно мощной, чтобы называться ассемблером. Он не будет поддерживать даже половину возможностей «настоящего» ассемблера, но будет достаточно написать следующую версию самого себя. Затем вы можете переписать v0.00 в подмножестве языка ассемблера, назвать его v0.01, использовать его для построения следующего набора функций вашего ассемблера v0.02, затем использовать v0.02 для сборки v0.03 и и так до тех пор, пока вы не доберетесь до v1.00. В результате в машинном коде будет только первая версия; первая выпущенная версия будет на языке ассемблера.

Я загрузил разработку компилятора языка шаблонов с помощью этого трюка. В моей первоначальной версии использовались printfоператоры, но первой версией, которую я использовал в своей компании, был тот самый процессор шаблонов, который он обрабатывал. Фаза начальной загрузки длилась менее четырех часов: как только мой процессор смог выдать едва полезный вывод, я переписал его на своем родном языке, скомпилировал и выбросил версию без шаблонов.

dasblinkenlight
источник
4
У вас все еще есть все фазы? Я хотел бы увидеть их и сравнить друг с другом. Просто чтобы почувствовать процесс, через который вы прошли.
Марьян Венема
3
@MarjanVenema Нет, у меня их больше нет - я построил их в 1998 году и продолжал использовать их до 2005 года, когда обнаружил StringTemplate . Я переписывал предыдущий этап следующим, пока я работал над первоначальной версией, которую можно было использовать. Мой цикл разработки состоял из написания нового материала, запуска генератора кода для создания себя в отдельном каталоге, работы diffс текущим генератором кода, чтобы увидеть, что сгенерированная часть кода не изменилась неожиданным образом, заменив код на месте, и запустить его еще раз, чтобы закончить цикл.
dasblinkenlight
Жаль, но понятно :) Спасибо за описание, что вы сделали (и за ссылку).
Марьян Венема
3
Я думаю, вам нужно сохранить какую-то цепочку начальной загрузки. Машинный код => Ограниченный ASM => Полный ASM => Некоторый язык. В противном случае, если вы потеряете свой бинарный файл на каком-то шаге по пути, вы облажаетесь. (В качестве альтернативы у вас может быть кросс-скомпилированная версия C, поскольку реально не все двоичные файлы компилятора C исчезнут сразу.)
edA-qa mort-ora-y
3
Единственная «особенность», которой ассемблер должен быть для «настоящего» ассемблера, - это сборка.
Майлз Рут
23

Согласно Wikipedia, первый в мире язык ассемблера / ассемблера был реализован для IBM 701 Натаниэлем Рочестером . (Даты немного неопределенны из статьи в Википедии. В ней говорится, что Рочестер присоединился к IBM в 1948 году, но на другой странице Википедии говорится, что 701 был публично объявлен в 1952 году. И эта страница IBM гласит, что «реальный дизайн начался в феврале 1, 1951 и был завершен через год » .)

Однако «Ассемблеры и загрузчики» Дэвида Саломона (на странице 7) утверждают, что у EDSAC также был ассемблер:

«Одним из первых сохраненных программных компьютеров был EDSAC (электронный автоматический калькулятор хранения с задержкой), разработанный в Кембриджском университете в 1949 году Морисом Уилксом и В. Ренвиком. С первых дней работы в EDSAC был ассемблер, который назывался Initial Orders. Он был реализован в постоянной памяти, сформированной из набора поворотных телефонных селекторов, и она принимала символические инструкции. Каждая инструкция состояла из однобуквенной мнемоники, десятичного адреса и третьего поля, являющегося буквой. Третье поле вызвало одно из 12 константы, заданные программистом для добавления к адресу во время сборки. " (Ссылки опущены ... см. Оригинал.)

Предполагая, что мы принимаем, что «Начальные заказы» имеют приоритет, у нас есть четкое доказательство того, что первый ассемблер был реализован в машинном коде.

Этот шаблон (запись начальных ассемблеров в машинном коде) был бы нормой еще в 1950-х годах. Однако, согласно Википедии , «[s] сборщики были первыми языковыми инструментами, которые загрузили себя». См. Также этот раздел, в котором объясняется, каким образом изначально написанный машинный код на ассемблере использовался для начальной загрузки более продвинутого ассемблера, который был написан на ассемблере.

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

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

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

Стивен С
источник
Голосовали за то, что на самом деле отвечали, а не просто гадали. Это действительно интересное чтение!
JacquesB
14

Я предполагаю, что первые ассемблеры были написаны в машинном коде, потому что, как вы говорите, ничего другого тогда не было доступно.

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

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

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

Майк Накис
источник
12

Сначала «сборка» была написана на бумаге, а затем вручную «скомпилирована» на перфокартах.

Мой дедушка работал с ZRA1 (извините, страница существует только на немецком языке, но перевод Google вполне подходит для того момента, когда вы действительно сможете подобрать наиболее важные факты: D).
Модус операнди заключался в том, чтобы записать ваш код на бумаге на некоем языке ассемблера, и секретарь фактически выполнил бы транскрипцию перфокарт, а затем передал бы их оператору, и результат будет возвращен на следующее утро.

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

back2dos
источник
3
Когда я учился в университете, у них все еще были бумажные блоки, используемые для написания машинного кода. Вы пишете программу справа, слева есть столбцы для перевода инструкций в шестнадцатеричное. И столбец для текущего адреса. Первые сборщики были на самом деле людьми.
Флориан Ф
9

Трудно быть уверенным в самом первом ассемблере (трудно даже определить, что это было). Несколько лет назад, когда я написал несколько ассемблеров для машин, в которых не было ассемблеров, я все еще писал код на языке ассемблера. Затем, после того как у меня был достаточно законченный раздел кода, я вручную перевел его в машинный код. Это были две совершенно разные фазы: когда я писал код, я вообще не работал и не думал на уровне машинного кода.

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

Джерри Гроб
источник
8

Вам не нужен ассемблер для ручной сборки кода на ассемблере в машинный код. Так же, как вам не нужен редактор для написания кода на ассемблере.

Историческая перспектива

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

Даже в самые первые дни вычислений программисты писали программы в виде символической записи и переводили их в машинный код, прежде чем вводить их в свой компьютер. В случае Augusta Ada King, она пришлось бы перевести их в перфокарт для Бэббиджа «s Analytical Engine , но , увы , он никогда не был построен.

Личный опыт

Первым моим компьютером был Sinclair ZX81 (Timex 1000 в США). В конце руководства была вся информация, необходимая для перевода языка ассемблера Z80 в машинный код (даже включая все странные коды операций режима индекса, которые имелись в Z80).

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

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

По своему опыту я могу сказать, что отладку вашего кода намного проще, если он написан на языке ассемблера, чем на машинном коде - отсюда и популярность дизассемблеров. Даже если у вас нет ассемблера, ручная сборка менее подвержена ошибкам, чем попытка написать машинный код напрямую, хотя я думаю, что настоящий программист, такой как Мел, может не согласиться. * 8' )

Марк Бут
источник
5

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

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

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

Первые вычислительные машины не были машинами общего назначения, из которых можно было создавать ассемблеры и компиляторы. Вы запрограммировали их, перемещая некоторые провода между выходом предыдущего alu и входом следующего. В конце концов у вас был процессор общего назначения, такой, что вы могли написать ассемблер в сборке, собрать его вручную, передать его как машинный код, затем использовать его для анализа ebcdic, ascii и т. Д., А затем самостоятельно разместить. сохраните двоичный файл на некотором носителе, который вы могли бы позже прочитать / загрузить, без необходимости переключать переключатели на машинный код ручной подачи.

Подумайте о перфокартах и ​​бумажной ленте. Вместо того, чтобы переключать переключатели, вы, безусловно, могли бы сделать полностью механическую машину, экономящее трудозатраты устройство, которое создавало бы носитель, который будет читать компьютер. Вместо того, чтобы вводить биты машинного кода с помощью переключателей, таких как altair, вы могли бы вместо этого подавать бумажную ленту или перфокарты (используя что-то механическое, не управляемое процессором, которое питало память или процессор, ИЛИ используя небольшой машинный код, написанный загрузчиком). Это была неплохая идея, потому что вы могли сделать что-то, управляемое компьютером, которое также могло бы механически производить бумажные ленты или перфокарты, а затем подать их обратно. Два источника перфокарт, некомпьютерное механическое устройство для экономии труда и компьютер, управляемый машиной. оба создают «двоичные файлы» для компьютера.

Старожил
источник
1
+1 за комментарий "ассемблер, ты". Легко привязаться к одному определению слова (например, ассемблер = программное обеспечение), но ваш комментарий действительно возвращает очевидное в перспективу ... что "процесс сборки" - это просто система / рутина, которую легко можно выполнить человеческий ассемблер.
The111
1
Кроме того, люди продолжают зацикливаться на идее, что на ранних компьютерах были наборы инструкций. Ранние компьютеры были женщинами с хорошими математическими навыками с карандашом и бумагой, и так их называли - компьютеры. затем эти женщины (или одна, в частности) запрограммировали eniac, подключив провода, не используя набор инструкций. Программирование с набором инструкций было хорошо в будущем. Да, очень легко увязнуть в использовании слова или термина, таких как ассемблер или компьютер, или рано.
old_timer
4

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

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

Сложность написания машинного кода напрямую и чтения программ из дампа памяти во многом зависит от машинного языка, некоторые из них относительно просты (самое сложное - отслеживание адресов), x86 - один из худших.

AProgrammer
источник
У pdp-11 даже не было роскоши ручек. Вы можете изменить память, введя двоичный адрес на 8 тумблерах, а затем значение на 16 тумблерах и нажать кнопку. Я на самом деле видел, как кто-то исправляет циклическую программу таким образом!
Джеймс Андерсон
2

Я построил компьютер в 1975 году. Он был очень продвинутым по сравнению с его современным Altair, потому что он имел «монитор», который позволял мне вводить программы, вводя машинный код в шестнадцатеричном формате и просматривая этот код на видеомониторе, где, как и в случае с Альтаир каждую машинную инструкцию нужно было вводить по очереди, используя ряд переключателей.

Так что да, в первые дни компьютеров, а затем снова в первые дни персональных компьютеров люди писали приложения в машинном коде.

Джим в Техасе
источник
2

Анекдот:

Когда я изучал ассемблер на Apple] [, в ПЗУ была включена программа под названием микро-ассемблер. Он сделал немедленный перевод инструкции по сборке в байты, как вы их ввели. Это означает, что меток не было - если вы хотите прыгнуть или загрузить, вам нужно было самостоятельно рассчитать смещения. Это было намного проще, чем искать схемы команд и вводить шестнадцатеричные значения.

Без сомнения, настоящие ассемблеры были впервые написаны с использованием микро-ассемблера или какой-то другой не совсем полной среды.

Шон Макмиллан
источник