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

Я слышал о цыпленке и яйце и самонакладке. У меня есть несколько вопросов.

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Если вы хотите сломать барьер, который заставляет компьютеры чувствовать себя как магия, я настоятельно рекомендую читать CODE by Charles Petzold и/или Элементы вычислительных систем. Имея только базовые знания в программировании, эти чудесно доступные книги помогут вам понять компьютеры сверху донизу. Очевидно, что невозможно получить comp. Sci. или степень EE после всего двух книг, но я могу сказать, как программист-самоучка, который пропустил формальное обучение: эти книги потрясли мой мир!

Ответ 5

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

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

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

Ответ 6

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

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

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