Що було першим, компілятор чи джерело?


17

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




Напевно, це те, на що ти можеш шукати ?
Калеб

@Caleb прочитав коментарі у відповіді SkyDan ..
Девід Коуден

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

Відповіді:


30

На це є дуже чітка відповідь, насправді: Перший вихідний код - з великим відривом.

Перш ніж надати технічні деталі, трохи перспективи:

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

Розглянемо цю цитату статті у Вікіпедії про FORTRAN, яка ілюструє небажання укладачів, з якими стикалися:

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

=> На той момент, коли компілятор FORTRAN потрапив на ринок (1957 р.), Люди з радістю програмували і мовою асемблера, і FORTRAN.

Випадок був подібний до LISP (від Hackers & Painters ):

Стів Рассел сказав: дивіться, чому б я не запрограмував цей евал ... і я сказав йому: хо-хо, ти плутаєш теорію з практикою, цей евал призначений для читання, а не для обчислення. Але він пішов вперед і це зробив. Тобто, він склав eval у моєму документі до машинного коду IBM 704, виправляючи помилку, а потім рекламував це як інтерпретатор Lisp, що, безумовно, було. Тож у той момент Лісп фактично мав форму, яку він має сьогодні ... "

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

Але ці події відносно пізні. Навіть не враховуючи аналітичного двигуна Чарльза Беббіджа та першої пов'язаної з ним програми Ада Лавелласа, у 20 столітті існували мови програмування, які передували укладачам:

Планкалкюль Конрада Зузе та математична конструкція λ-числення, введена Церквою Алонцо. Обидві ці мови є формально визначеними мовами програмування, але жоден з них не мав компілятора.

Для того, щоб зробити це в перспективі, λ-обчислення - це з 1930-х років, а Планкалкюль був розроблений близько 1945 року. На противагу цьому перший компілятор FORTRAN вийшов у 1957 році (але знову через три роки після того, як було визначено FORTRAN).


Чудова відповідь! Я не знав код, який збирався вручну, але це має сенс.
ckb

10

Програмування розпочалося з того, що люди записували машинний код прямо в пам'ять, на перфокарти та паперову стрічку або навіть стискали посилання на панелі патчів. Чи було побудовано обладнання відповідно до потреб програмного забезпечення чи навпаки, важко сказати. Безумовно, найдавніший дизайн для цілісного повного програмованого комп’ютера, аналітичний двигун Беббіджа, який був датований першою документальною програмою Ада Ловелса .

Щодо першої мови програмування, я стверджував, що це була машинна мова аналітичного двигуна Беббіджа (з питання Яка перша мова програмування написана для комп'ютерів? )

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

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

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

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

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


1
Ви насправді читали визначення вихідного коду на тій посиланні на wikipedia? Як було сказано вище, машинний код не є вихідним кодом. І машинний код! = Збірка. Перший там був машинний код.
окулус

@MarkBooth Я думаю, що MIPS і AVR ще простіші.
Девід Кауден

4
@occulus - Яким чином мова збірки не є вихідним кодом ? Мова складання відображає одну інструкцію з мовної збірки на один машинний код і може бути тривіально зібраний у вашій голові, якщо ви знаєте свої таблиці коду. Чесно кажучи, діти ці дні ... * 8 ')
Марк Бут

1
Для мене мова монтажу є movl $0, -20(%rbp), тоді як машинний код є C745EC00000000, і саме останній (ну, щось подібне) вперше вводився вручну або читався з паперової стрічки. Щодо того, чи вважається машинний код вихідним кодом , я схильний сказати "що б не плавав ваш човен". Якщо ви вмикаєте його вручну, то так, я б сказав, що він рахується.
Джон Боде

@JohnBode - О, я згоден, але, враховуючи відповідність 1: 1 між інструкціями по збірці та інструкціями машинного коду, складання - це лише питання механічного перекладу (складання), логіка однакова. Компіляція передбачає набагато складніші багато: багато перекладів (хоча Occam - мова високого рівня, і багато висловлювань Occam відображаються 1: 1 на інструкції Transputer завдяки своїй архітектурі MISC . * 8 ').
Марк Бут

6

Компілятор був першим . Це було написано безпосередньо в машинному коді, оскільки джерело неможливо було скласти без компілятора.

Статті Вікіпедії , як цей про комп'ютерних мовах може відповісти на більшість запитань. Якщо ні, просто виберіть одну з книг Таненбаума, наприклад, Структурована комп'ютерна організація , яка може відповісти на більше питань, ніж ви навіть можете задати :)

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


20
Можна також стверджувати, що перше джерело, оскільки для перших «комп’ютерів» джерело було еквівалентним двійковим (тобто вони були запрограмовані безпосередньо машиночитаною мовою).
Йоахім Зауер

5
@Joachim За визначенням, вихідний код - це читаний людиною текст, який переводиться компілятором у машинний код. Тому сам машинний код не є вихідним кодом.
hellodanylo

11
Компілятор був першим, але він був реалізований у біологічних нейронних мережах.
День

8
Чому за це так високо голосують? Це неправильно. Вихідний код мовами високого рівня (зокрема λ-числення, Plankalkül та LISP) давно передує як укладачам, так і перекладачам. Це навіть не беручи до уваги напівформальні програми, написані Ada Lovelace.
Конрад Рудольф

4
@SkyDan Яке твоє визначення тоді? Я не знаю жодного розумного визначення, для якого відповідь правильна (і для "компілятора", і для "вихідного коду мовою високого рівня" - не кажучи вже про низький рівень).
Конрад Рудольф

4

Перекладачі існували до компіляторів, тому вихідний код існував перед компіляторами.

Є деякі дуже цікаві документи з історії обчислювальної тут . Вихідний код для компілятора FORTRAN II повинен бути доступний, але ці посилання розірвані.

У цьому документі з 1954 року описується перекладач Whirlwhind.


1

Це питання наголошує на нашій семантичній інтерпретації "вихідного коду". Якщо ми визначимо це як «текстові комп’ютерні інструкції, що складаються», то, імовірно, першим був компілятор.

Я більш схильний піти з чимось більш авторитетним, наприклад, з докладом Марка Хармана "Чому аналіз вихідного коду та маніпуляція завжди буде важливим", представленим на Десятій міжнародній робочій конференції IEEE з аналізу вихідного коду та маніпуляції.

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

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


"Імовірно, компілятор прийшов першим" - лише якщо ви визначаєте "компільований" як "перекладений автоматичним інструментом", а не "перекладений машинним кодом вручну".
Конрад Рудольф

Дуже цікава папір. Мені подобається таке визначення вихідного коду - хоча це робить моє питання справді не питанням.
Девід Коуден,

@KonradRudolph - це не підрозділ, який виконує компіляцію, будь то машинна, людська чи божественна інтервенція, яка називається "компілятором"?
Кірк Бродхерст

0

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

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

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

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