Чи були перші асемблери написані в машинному коді?


41

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

Це сказало, що мене змусило задуматися. Використовувати мову високого рівня для написання мого асемблера, безумовно, зручно, але для самого першого асемблера, коли-небудь написаного (тобто в історії), чи не потрібно було б це писати в машинному коді, оскільки це все, що існувало на той час?

І співвіднесене питання ... а як сьогодні? Якщо вийде абсолютно нова архітектура процесора з абсолютно новим набором інструкцій та абсолютно новим синтаксисом збірки, як би побудувати асемблер? Я припускаю, що ви все ще можете використовувати існуючу мову високого рівня для генерування бінарних файлів для програми асемблера, оскільки якщо ви знаєте синтаксис як мов збірки, так і машинних мов для вашої нової платформи, то завдання написання асемблера справді просто Завдання аналізу тексту і не пов'язане з цією платформою (тобто потрібно писати машинною мовою цієї платформи) ... саме тому я можу "обдурити" під час написання свого асемблера Hack у 2012 році та використовувати деякий попередній мова високого рівня, щоб допомогти мені.


17
Ви завжди можете написати крос-компілятор і використовувати його для створення коду для нового обладнання сьогодні.
Керрек СБ

@PersonalNexus Дякую за це, сніфу редагувати з мого боку.
Янніс

1
@YannisRizos Немає проблем, трапляється з найкращими з нас :)
PersonalNexus

8
Можливо, що перший асемблер, можливо, був написаний у складі на аркуші паперу. Перетворення в машинний код тоді може бути здійснено ще на папері і записане на якийсь ПЗУ з перемикачами, по одному слову.
mouviciel

Першим моїм комп'ютером був ZX81, що має 1 КБ оперативної пам’яті, тому мої (адміністративно короткі) програми машинного коду насправді були перекладені вручну.
користувач281377

Відповіді:


36

для першого першого асемблера, який коли-небудь написано (тобто в історії), чи не потрібно це писати в машинному коді

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

У мене завантажена розробка компілятора мови шаблонів за допомогою цього фокусу. У моїй початковій версії використовувались printfзаяви, але перша версія, яку я застосував у своїй компанії, використовувала той самий процесор шаблону, який він обробляв. Етап завантаження тривав менше чотирьох годин: як тільки мій процесор міг дати ледве корисний вихід, я переписав його своєю мовою, склав і викинув не шаблоновану версію.


4
У вас все-таки є всі етапи? Я хотів би бачити їх і порівнювати їх з іншими. Просто, щоб відчути процес, який ви пройшли.
Мар'ян Венема

3
@MarjanVenema Ні, у мене їх більше немає - я створив його в 1998 році і продовжував використовувати його до 2005 року, коли відкрив StringTemplate . Я перезаписував попередній етап на наступний, коли працював над початковою версією, що використовується. Мій цикл розробки складався з кодування нових речей, запуску генератора коду для побудови себе в окремій директорії, diffпротистояння поточному генератору коду, щоб побачити, що створена частина коду не змінилася несподівано, замінивши код на місці, і запустивши його ще раз, щоб закінчити цикл.
dasblinkenlight

Шкода, але зрозуміло :) Дякую за опис того, що ти зробив (і за посилання).
Мар'ян Венема

3
Я думаю, вам потрібно тримати якийсь ланцюг завантаження. Код машини => Обмежений ASM => Повний ASM => Деяка мова. В іншому випадку, якщо ви втратите свій двійковий будь-який крок по дорозі, ви будете накручені. (По черзі у вас може бути версія з компільованою версією C, оскільки реально не всі двійкові файли компілятора C зникнуть одразу.)
edA-qa mort-ora-y

3
Єдині "особливості", яким асемблер повинен бути "справжнім" асемблером, - це зібрати.
Майлз Рут

23

Згідно з Вікіпедією, перша в мові асемблера / складання була реалізована для IBM 701 Натаніелем Рочестером . (Дати є трохи невизначеними зі статті Вікіпедії. У ньому йдеться про те, що Рочестер приєднався до IBM у 1948 р., Але на іншій сторінці Вікіпедії зазначено, що 701 рік був публічно оголошений у 1952 р. І ця сторінка IBM зазначає, що «[a] віртуальний дизайн розпочався в лютому 1, 1951 р. І було закінчено через рік " .)

Однак "збирачі та навантажувачі" Девіда Саломона стверджують (на стор. 7), що EDSAC також мав асемблер:

"Одним з перших комп'ютерів, що зберігаються в програмі, був EDSAC (Electronic Calculator Automatic Automation Calculator), розроблений в Кембриджському університеті в 1949 році Морісом Уілксом і У. Ренвіком. З перших днів його існування в EDSAC був асемблер під назвою" Початкові замовлення ". в пам'яті для читання, сформованій із набору поворотних селекторів телефону, і вона приймала символічні вказівки. Кожна інструкція складалася з одномовної літери, десяткової адреси та третього поля, яке було буквою. Третє поле викликало одне з 12 константи, задані програмістом, які будуть додані до адреси під час монтажу. " (Список літератури пропущено ... див. Оригінал.)

Припускаючи, що ми приймаємо, що "Початкові замовлення" мають перевагу, ми маємо чіткі докази того, що перший асемблер був реалізований в машинному коді.

Ця закономірність (написання початкових асемблерів у машинному коді) була б нормою ще в 50-х роках. Однак, згідно з Вікіпедією , "[a] матроси були першими мовними інструментами для завантаження". Дивіться також цей розділ, де пояснюється, як написаний машинний код первинного асемблера використовувався для завантаження більш досконалого асемблера, який був закодований мовою складання.

У цей час асемблери та компілятори пишуться мовами вищого рівня, а асемблер або компілятор для нової машинної архітектури, як правило, розробляється на іншій архітектурі та крос-компільований.

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

Цю сторінку Вікіпедії про компілятори та збирачі завантажувачів варто прочитати ... якщо це все для вас бентежить.


Запропоновано реально відповідати, а не просто здогадуватися. Це справді цікаве читання!
ЖакБ

14

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

Однак сьогодні, коли виходить абсолютно нова архітектура процесора, ми використовуємо те, що відомо як Cross-Compiler , що є компілятором, який виробляє машинний код не для архітектури, на якій він працює, а для іншої архітектури.

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

Отже, сьогодні навіть можна (принаймні теоретично) створити абсолютно нову архітектуру та мати компілятори мови високого рівня, які в ній спочатку працюють (компілюються в інших архітектурах за допомогою крос-компіляторів), перш ніж у вас навіть з’явиться асемблер для цієї архітектури.


12

Спочатку "збірка" була написана на папері, а потім "складена" вручну на перфокарти.

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

Все це було по суті, перш ніж програмісти мали розкіш введення даних через клавіатуру та перегляду їх на екрані.


3
Коли я навчався в університеті, у них ще були паперові блоки, які використовувались для написання машинного коду. Ви пишете програму праворуч, ліворуч є стовпці для перекладу інструкцій у шістнадцятковий. І стовпець для поточної адреси. Перші збирачі були насправді людьми.
Флоріан Ф

9

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

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


8

Вам не потрібен асемблер, щоб передати код мови збірки в машинний код. Так само, як вам не потрібен редактор, щоб написати код мови збірки.

Історична перспектива

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

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

Особистий досвід

Першим комп’ютером, яким я володів, був Sinclair ZX81 (Timex 1000 у США). Задня частина керівництва було вся інформації , що вам необхідно перевести Z80 мову асемблера в машинний код (навіть inclusing всіх дивних індексного режиму опкодов Z80 були).

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

Якби це не спрацювало, я би двічі перевірив складання руки, і якщо будь-який переклад був неправильним, я б проклеїв байти, завантажені зі стрічки, перед тим як повторно зберегти її та ще раз спробувати запустити програму.

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


5

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

Якщо у вашому користувальницькому інтерфейсі до першого чи наступного нового набору інструкцій були лише олівець і папір, а також деякі комутатори або перфокарти, ви використовували один або всі доступні вам елементи. Ви могли б дуже добре записати мову складання на папері, а потім скористаєтеся асемблером, щоб перетворити його в машинний код, можливо, в восьмеричний, а потім в якийсь момент, який перейшов в інтерфейс до машини.

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

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

Придумайте перфокарти та паперову стрічку. Замість перемикачів ви точно можете зробити повністю механічну машину, пристрій для економії праці, який створив носій, на якому комп'ютер читатиме. Замість того, щоб вводити шматочки машинного коду перемикачами, як altair, ви могли замість цього подавати паперову стрічку або перфокарти (використовуючи щось механічне, не кероване процесором, що живило пам'ять чи процесор, АБО за допомогою невеликого машинного коду, написаного завантажувачем). Це була не погана ідея, оскільки ви могли щось зробити за допомогою комп’ютера, який також міг механічно виготовляти паперові стрічки або перфокарти, а потім подавати їх назад. Два джерела перфокарт, не комп'ютерний пристрій для економії праці на комп'ютері , і машина, керована комп'ютером. обидва виробляють "двійкові файли" для комп'ютера.


1
+1 для коментаря "асемблер, ти". Легко приєднатись до одного визначення слова (тобто асамблер = програмне забезпечення), але ваш коментар дійсно повертає очевидний погляд у перспективу ... що "процес складання" - це лише система / рутина, яку легко можна здійснити людський асемблер.
The111

1
Також люди продовжують зациклюватися на цій ідеї, що на ранніх комп'ютерах були набори інструкцій. Ранні комп’ютери були жінками з хорошими математичними навичками з олівцем і папером, і саме так їх називали - комп'ютери. тоді ці жінки (або одна зокрема) запрограмували еніак, підключаючи дроти, не використовуючи набір інструкцій. Програмування з набором інструкцій було добре в дорозі. Так, дуже легко потрапити у вживання слова або терміна, як ассемблер чи комп’ютер чи рано.
old_timer

4

У комп’ютерному зоопарку Брука є один-два екземпляри, де він сказав щось на кшталт "мнемоніка - це наш винахід, дизайнер просто використав числовий код або символ, кодом якого був код коду", тож там, де машини, для яких навіть не було мова складання.

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

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


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

2

Я створив комп’ютер у 1975 році. Він був дуже передовим у порівнянні з сучасним Altair, тому що він мав "монітор rom", який дозволив мені вводити програми, набираючи машинний код у шістнадцятковій формі та переглядаючи цей код на відеомоніторі, де як із Altair кожну машинну інструкцію потрібно було вводити трохи за часом, використовуючи ряд комутаторів.

Так так, в перші дні комп'ютерів, а потім знову в перші дні персональних комп'ютерів люди писали додатки в машинному коді.


2

Анекдот:

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

Без сумніву, справжні асемблери вперше були написані за допомогою мікроскладальника чи якогось іншого не зовсім повного середовища.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.