Как был написан первый компилятор?

166

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

Что написал первый компилятор, который преобразовал что-то в двоичные инструкции?

Сборка скомпилирована или переведена в двоичные инструкции?

... Мне было бы трудно поверить, что они написали компилятор в двоичном формате.

Шон Маклин
источник
@nawfal, это разница между новым языком программирования и первым компилятором, так что нет - это не дубликат
@PauliSudarshanTerho в чем разница? Дух вопросов одинаков. Вы не можете написать язык программирования, этот вопрос, в свою очередь, говорит о первом компиляторе.
Nawfal
Может быть, в вашем духовном воображении? В действительности вы не найдете ничего упомянутого о первом компиляторе в этой ссылке. И вы не должны советовать никому писать новый язык, чтобы начать с нуля. И если так, то почему вы хотите скрыть ответы о том, как написан первый компилятор, если это важно для написания нового языка?
Учитесь у меня - это дубликат: stackoverflow.com/questions/4772768/…

Ответы:

133

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

Первые программы были сделаны именно таким образом - рукописные коды операций.

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

Первые сборщики были написаны от руки. Затем эти ассемблеры можно использовать для сборки более сложных ассемблеров, которые затем можно использовать для сборки компиляторов, написанных для языков более высокого уровня, и так далее. Этот процесс итеративного написания инструментов для упрощения создания следующего набора инструментов называется (как упомянул Дэвид Рабиновиц в своем ответе) начальной загрузкой .

янтарный
источник
18
Моим первым компьютером была машина на базе Z80, в мониторе ПЗУ которой я должен был вручную собрать загрузчик начальной загрузки, чтобы поднять основы операционной системы (CP / M), чтобы я мог собрать остальную часть указанной операционной системы в рабочую систему. , в комплекте с дисковым загрузчиком. Веселые времена. Так что да, вы можете просто собрать вручную. Это медленно, мучительно и подвержено ошибкам (именно поэтому мы автоматизировали вещи), но это возможно.
Просто мое правильное мнение
Первое звено разрывается.
Люк
Написано от руки. Как? Проводка или перфокарты? Я думаю, у них были шестнадцатеричные клавиатуры.
44

Пожалуйста, прочитайте о загрузке компилятора и истории написания компилятора.

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

Дэвид Рабиновиц
источник
36

Яйца давно предшествовали курам. Ответ на большинство проблем "курица и яйцо" один и тот же: эволюция. Некоторым людям трудно поверить в биологическую эволюцию, но неверие не является аргументом (google argumentsum ad ignorantiam).

Чтобы прямо ответить на ваш вопрос: первый компилятор был написан (человеком) на языке ассемблера - программа, называемая ассемблером, переведет язык ассемблера в двоичный файл; это гораздо более простой процесс, чем компиляция, потому что ассемблер является просто символической формой машинного языка, которая использует имена кодов операций вместо чисел, представляет адреса с символами и так далее. Многие последующие компиляторы были написаны также на ассемблере. Но первый компилятор Си был изменен Б компилятор, который был написан в B . Первый B-компилятор был написан на TMG . Компилятор TMG, используемый для компиляции этого B-компилятора, был написан на языке ассемблера PDP-7.

Джим Балтер
источник
24

Воз сказал в одном из своих публичных выступлений, что когда он начинал, он не мог позволить себе компилятор, поэтому он компилировал в двоичный файл вручную на бумаге. Если вы хотите увидеть что-то еще более дикое, прочитайте об условиях, при которых Билл Гейтс и Пол Аллен написали BASIC для Altair 8800.

Что касается «написания компьютера в двоичном формате» - сделайте шаг назад от того, чтобы быть программистом, и подумайте, какими были ранние компьютеры. Материал высокого уровня еще не существовал - вы думали обо всем на низком уровне, потому что это все, что было. У вас было оборудование, которое могло выполнять базовую логику и арифметику, которыми вы манипулировали с помощью машинного кода (который является просто скомпилированной сборкой - Амбер объясняет, почему эту часть не сложно выполнить вручную), и вы хотели, чтобы это оборудование выполняло определенные математические действия. Вы не беспокоились о несуществующей операционной системе, вы просто сказали аппаратному обеспечению (в сборе), как манипулировать числами, которые вы ему предоставляете. Это был просто большой калькулятор. Компьютер сегодня был построен одна абстракция за один раз.

Если вы хотите преодолеть барьер, который заставляет компьютеры ощущать себя волшебными, я НАСТОЯТЕЛЬНО рекомендую прочитать CODE Чарльза Петцольда и / или «Элементы вычислительных систем» . Обладая лишь базовыми знаниями в области программирования, эти удивительно доступные книги помогут вам разобраться в компьютерах сверху вниз. Очевидно, что никто не может получить комп. Sci. или степень EE после двух книг, но я могу сказать как программист-самоучка, который пропустил формальное обучение: эти книги потрясли мой мир!

Дина
источник
2
Написание переводчика Altair BASIC после продажи? Кодирование бутстрэппера в самолете до Альбукерке? Это звучит немного смешно. И веселье.
Этеш Чоудхури
2
@Shurane: ха! Эти пункты тоже актуальны, но для меня мельчайшие подробности того, как они сделали интерпретатор BASIC и как группа втиснула его в крошечное пространство, - это красота и поразительные способности / хакерские способности программирования.
Дина
10

Что написал первый компилятор, который преобразовал что-то в двоичные инструкции?

Человек сделал. Читайте о системе A-0 :

В 1952 году Грейс Хоппер завершила свой первый компилятор для Sperry, известный как A-0. Система A-0 представляла собой набор инструкций, которые могли бы переводить символьный математический код на машинный язык. Создавая А-0, она взяла все подпрограммы, которые собирала на протяжении многих лет, и записала их на пленку. Каждой подпрограмме был присвоен номер вызова, чтобы машина могла найти его на ленте. «Все, что мне нужно было сделать, - это записать набор телефонных номеров, позволить компьютеру найти их на ленте, перенести их и сделать дополнения. Это был первый компилятор», как описано Грейс.

Синан Юнюр
источник
1
Похоже, что сейчас ссылка 404, в любом случае «Грейс» выше - это Грейс Хоппер.
Фолькер Штольц
2
Я слышал, что Хоппер написал первый компилятор, но приведенное выше описание делает его более похожим на компоновщик, чем на компилятор. Все-таки хорошая история. Удивительно думать, что было время, когда ученые-компьютерщики скептически относились к идее компиляторов ...
Марк Э. Хааз
1
@mehaase, поэтому он называется «компилятор». он создает компиляцию подпрограмм, каждая из которых (потенциально) написана непосредственно на машинном языке.
Элазар
@ MarkE.Haase Люди, о которых говорил Хоппер, были разработчиками приложений и учеными, использующими компьютеры для выполнения конкретных вычислительных задач; они не были "компьютерными учеными". В 1952 году было несколько кибернетиков, но я сомневаюсь, что она говорила с кем-либо из них.
Джим Балтер
9

Первые программы были написаны на машинном коде (не на ассемблере) - фактические числа вставлялись в память компьютера с помощью переключателей. Мы прошли долгий путь ...

Иногда это все еще происходит в небольшой степени - для исправления небольших фрагментов кода или создания кодов. Я вспоминаю вставку чисел в строки Basic, которые затем выполнялись в виде небольших быстрых подпрограмм на ранних микроэлементах. Я также помню переключатели на передней панели PDP-11 для ввода программы начального загрузчика в ее память для университетского курса.

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

Майкл Берр
источник
Речь идет о первом компиляторе, а не о первых программах в целом, несмотря на то, что программы иногда являются компиляторами; история двух не одинакова. (Аналогия: ответ на вопрос о том, когда на Земле появились первые животные, не является ответом на вопрос о том, когда на Земле появились первые кошки, несмотря на то, что кошки были животными.)
Джим Балтер,