Как был написан первый компилятор? - PullRequest
154 голосов
/ 31 октября 2009

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

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

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

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

Ответы [ 6 ]

127 голосов
/ 31 октября 2009

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

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

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

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

41 голосов
/ 31 октября 2009

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

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

33 голосов
/ 08 февраля 2011

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

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

23 голосов
/ 20 сентября 2010

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

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

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

9 голосов
/ 31 октября 2009

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

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

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

8 голосов
/ 31 октября 2009

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

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

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

...