Что было первым: компилятор или исходный код?

17

Мне любопытно о рождении компилятора. Как началось программирование? Люди сначала создавали оборудование, которое распознало определенный набор команд, или люди определяли язык, а затем строили оборудование на его основе? И на родственной ноте, какой был первый язык программирования?

Дэвид Кауден
источник
1
Одним из подвопросов был сам по себе вопрос: какой был первый язык программирования, написанный для компьютеров? ,
Марк Бут
Конечно, это то, что вы могли бы посмотреть ?
Калеб
@Caleb прочитал комментарии в ответе SkyDan ..
Дэвид Кауден
2
@ Брайан Допустимое предположение, но оказывается ошибочным. Это не проблема куриного яйца, есть очень четкий ответ (подсказка: большинство проголосовавших ниже неверно). Исходный код задолго до компиляторов.
Конрад Рудольф

Ответы:

30

На самом деле это имеет очень четкий ответ: исходный код появился первым - с большим отрывом.

Прежде чем дать технические детали, немного перспективы:

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

Рассмотрим цитату из статьи в Википедии о Фортране, которая иллюстрирует, с чем сталкивались компиляторы нежелания:

… Первый компилятор FORTRAN [был] поставлен в апреле 1957 года. Это был первый оптимизирующий компилятор, потому что клиенты неохотно использовали язык программирования высокого уровня, если только его компилятор не мог генерировать код, производительность которого была сопоставима с производительностью языка ассемблера, написанного вручную. , [Акцент мой]

=> К моменту появления на рынке компилятора FORTRAN (1957) люди уже с радостью программировали как на ассемблере, так и на FORTRAN.

Дело было аналогичным для LISP (от Hackers & Painters ):

Стив Рассел сказал: «Послушайте, почему бы мне не запрограммировать этот eval… и я сказал ему, хо-хо, вы путаете теорию с практикой, этот eval предназначен для чтения, а не для вычислений». Но он пошел вперед и сделал это. То есть он скомпилировал eval в моей статье в машинный код IBM 704, исправляя ошибку, а затем объявил об этом как интерпретатор Lisp, что, безусловно, и было. Таким образом, в тот момент Лисп имел по существу ту форму, которую он имеет сегодня ... »

Еще раз, не только исходный код (в LISP) предшествует интерпретатору, последний даже не подразумевался в первом.

Но эти события относительно поздно. Даже если не учитывать аналитический движок Чарльза Бэббиджа и первую связанную с ним программу Ады Лавлейс, в 20-м веке существовали языки программирования, предшествовавшие компиляторам:

Plankalkül Конрада Цузе и математическая конструкция λ-исчисления, представленная Алонзо Черчем. Оба эти языка являются формально определенными языками программирования, но в то время ни один из них не имел компилятора.

Чтобы представить это в перспективе, λ-исчисление датируется 30-ми годами, а Plankalkül был разработан примерно в 1945 году. Напротив, первый компилятор FORTRAN появился в 1957 году (но снова через три года после того, как был указан FORTRAN).

Конрад Рудольф
источник
Отличный ответ! Я не знал, что код раньше компилировался вручную, но это имеет смысл.
ckb
10

Программирование началось с того, что люди записывали машинный код непосредственно в память, на перфокарты и бумажную ленту или даже на короткие ссылки на патч-панели. Сложно сказать, было ли аппаратное обеспечение построено с учетом потребностей программного обеспечения или наоборот. Конечно, самый ранний дизайн программируемого компьютера Тьюринга , аналитический движок Бэббиджа , предшествовал первой документированной программе Ады Лавлейс .

Что касается первого языка программирования, я утверждал, что это был машинный язык аналитического движка Бэббиджа (из вопроса « Какой был первый язык программирования, написанный для компьютеров? )

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

Кроме того, компилятор никогда не был необходим , просто удобно.

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

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

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

Марк Бут
источник
1
Вы действительно читали определение исходного кода по той ссылке википедии, которую вы разместили? Как сказано выше, машинный код не является исходным кодом. И машинный код! = Сборка. Машинный код был там первым.
Occulus
@MarkBooth Я думаю, что MIPS и AVR еще проще ..
Дэвид Кауден
4
@occulus - Каким образом ассемблер не является исходным кодом ? Язык ассемблера отображает одну инструкцию на языке ассемблера на один машинный код и может быть легко собран в вашей голове, если вы знаете свои таблицы кодов операций. Честно говоря, дети в эти дни ... * 8 ')
Марк Бут
1
Для меня язык ассемблера есть movl $0, -20(%rbp), тогда как машинный код есть C745EC00000000, и последний (ну, что-то вроде этого) был впервые введен вручную или прочитан с бумажной ленты. Относительно того, считается ли машинный код исходным кодом , я склонен сказать «все, что плавает на вашей лодке». Если вы включаете его вручную, то да, я бы сказал, что это важно.
Джон Боде
@JohnBode - О, я согласен, но, учитывая соответствие 1: 1 между инструкциями по сборке и инструкциями машинного кода, сборка - это просто вопрос механического перевода (сборки), логика идентична. Компиляция подразумевает гораздо более сложный перевод многие: многие (хотя Occam - это язык высокого уровня, и многие операторы Occam отображают 1: 1 в инструкции Transputer благодаря своей архитектуре MISC . * 8 ').
Марк Бут
6

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

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

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

hellodanylo
источник
20
Можно также утверждать, что источник был первым, потому что для самых первых «компьютеров» источник был эквивалентен двоичному (то есть они были запрограммированы непосредственно на машиночитаемом языке).
Иоахим Зауэр
5
@Joachim По определению, исходный код - это читаемый человеком текст, который переводится компилятором в машинный код. Таким образом, сам машинный код не является исходным кодом.
hellodanylo
11
Компилятор был первым, но он был реализован в биологических нейронных сетях.
Ден
8
Почему за это так высоко голосуют? Это не правильно. Исходный код на языках высокого уровня (в частности, λ-исчисление, Plankalkül и LISP) давно предшествует как компиляторам, так и интерпретаторам. Это даже не принимая во внимание полуформальные программы, которые написала Ада Лавлейс.
Конрад Рудольф
4
@SkyDan Каково ваше определение тогда? Я не знаю разумного определения, для которого ваш ответ является правильным (как для «компилятора», так и для «исходного кода на языке высокого уровня» - не говоря уже о низком уровне).
Конрад Рудольф
4

Интерпретаторы существовали до компиляторов, поэтому исходный код существовал до компиляторов.

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

Эта статья 1954 года описывает интерпретатора «Вихря».

Джон Стрейер
источник
1

Этот вопрос сильно влияет на нашу семантическую интерпретацию «исходного кода». Если мы определим его как «текстовые компьютерные инструкции, которые компилируются», то, по-видимому, первым пришел компилятор.

Я более склонен идти к чему-то более авторитетному, например, к статье Марка Хармана «Почему анализ и манипулирование исходным кодом всегда будут важны», представленной на десятой Международной рабочей конференции IEEE по анализу и манипулированию исходным кодом

Определение 1 (Исходный код). Для ясности под «исходным кодом» подразумевается любое полностью исполняемое описание программной системы. Поэтому оно так истолковано, что включает машинный код, языки очень высокого уровня и исполняемые графические представления систем.

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

Кирк Бродхерст
источник
«Предположительно, компилятор пришел первым» - только если вы определили «скомпилированный» как «переведенный автоматическим инструментом», а не «переведенный в машинный код вручную».
Конрад Рудольф
Очень интересная статья. Мне нравится это определение исходного кода - хотя это действительно делает мой вопрос не вопрос ...
Дэвид Кауден
@KonradRudolph - это не модуль, который выполняет компиляцию, будь то машина, человек или божественное вмешательство, называемое «компилятором»?
Кирк Бродхерст
0

Алгоритмы были разобраны на бумаге, а затем alus были подключены физически / механически (движущиеся провода). чтобы изменить программу, вы перемещаете провода и запускаете снова.

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

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

Старожил
источник