Первый компилятор был написан Грейс Хоппер в 1952 году, в то время как интерпретатор Лиспа была написана в 1958 году Джон Маккарти'студент Стив Рассел. Писать компилятор, кажется, гораздо сложнее проблемы, чем переводчика. Если это так, то зачем был первый компилятор, написанный шесть лет до первого переводчика?
написание компилятора кажется гораздо сложнее проблемы, чем переводчика.
Это может быть правдой сегодня, но я утверждаю, что этого не было около 60 лет назад. Несколько причин, почему:
Принципиальный момент заключается в том, что аппаратной вычислительной среды 1950-х годов сделал это так, что был только компилятор возможным с учетом пакетная обработка на компьютерах.
В это время лучше пользовательский интерфейс-это, прежде всего, ограничивается перфокарты и телетайп принтеры. В 1961 г. [мудрец] системы3 впервые электронно-лучевой трубки (ЭЛТ) дисплея на компьютере. Таким образом интерактивного характера переводчик был не предпочтительнее, а естественно намного позже.
Множество компьютеров в 1950-х годах использовали переключателей на передней панели для загрузки инструкции, и результат был просто рядами ламп/светодиодов, и любители, даже использовали переключатели передней панели & светодиоды в 1970-х годах. Может быть, вы're с печально известной Альтаир 8800.
Другие аппаратные ограничения также сделал переводчиков невозможно. Там была крайняя ограниченность основной памяти (например, ОЗУ) компьютеры в 1950-х годах. До полупроводниковых интегральных схем (которые я'т прийти до 1958 года) памяти был ограничен магнитопровода памяти или линия задержки памяти, которая была зафиксирована в биты или слова, без префикса. В сочетании с медленной вторичной памяти (например, диск или лента), это будет считаться расточительством, если не невозможным, чтобы иметь много памяти, используемой для переводчика, даже до того, как программа интерпретируется был загружен.
Ограничения памяти были по-прежнему основным фактором, когда коллектив под руководством Джона Бэкуса в IBM создан компилятором Фортрана в 1954-57. Эта инновационная компилятор был успешным только потому, что это было оптимизирующий компилятор.
Большинство компьютеров в 1950-х годах практически не было **** любой операционной системы, не говоря уже современные функции, такие как динамическое связывание и управление виртуальной памятью, поэтому идея переводчика был слишком радикальным и нецелесообразно, в то время.
Добавление
Языки 1950-х годов были примитивными. Они включали в себя лишь горстка small операций, часто под влиянием как базового аппаратного обеспечения'инструкции, или проблема определения их целевого использования.
В то время компьютеры были очень редко general компьютеры purpose в том смысле, что мы думаем сегодня компьютеров. Что они были перепрограммируемые без того, чтобы быть перестроен считалась революционной концепции -- раньше люди были с помощью электромеханических машин (обычно калькуляторы) в compute или вычислить ответы (большинство приложений в 1950-х годах были числовых по своей природе).
С точки зрения информатики, составители и переводчики как translators, и примерно равны по сложности реализации.
Первыми языками программирования были довольно проста (без рекурсии для примеру) и близко к архитектуре машину, которая сама простой. Затем перевод простой процесс.
Компилятор был проще как программа, чем переводчика, что придется держаться вместе и сведения для выполнения программы и таблицы для интерпретации исходного кода. И переводчик занимают больше места, для себя, для исходного кода программы и за символические таблицы.
Память может быть так мало (как для стоимости и архитектурным соображениям) компиляторы могут быть отдельные программы, которые переписал операционная система (я использую одну из этих). ОС должен быть перезагружен после компиляции для того, чтобы запустить скомпилированную программу. ... что делает было ясно, что работает переводчиком для реальной работы-это.
Чтобы быть правдой, простотой необходимых компиляторов была такая, что компиляторы были не очень хорошие (оптимизация кода была еще в младенчестве, когда рассматривается вообще). Рукописные машинный код, по крайней мере до конца шестидесятых в некоторых местах, репутацию значительно более эффективным, чем код, сгенерированный компилятором. Существует даже понятие код с коэффициентом расширения, что сравнил размер скомпилированный код на работе очень хороший программист. Обычно больше 1 для большинства (всех?) компиляторы, что означало медленную программы, а, гораздо важнее другое: большие программы, требующие больше памяти. Это было еще в шестидесятые годы.
Интерес компилятор в программировании, особенно для пользователей кто не был вычислительной специалистов, таких, как ученые в различных поля. Этот интерес не был производительности кода. Но все-таки, программист тогда время считался дешевым ресурсом. Стоимость была в компьютере время, пока 1975-1980, когда стоимость перешли от оборудования программное обеспечение. Это означает, что даже компилятор не были приняты всерьез некоторые профессионалы.
Очень высокая стоимость компьютерного времени была еще одна причина дисквалифицирующие переводчиков, до такой степени, что сама идея была бы смешными для большинства людей.
В случае Лиспа очень особенным, потому что он был очень простой язык, который сделал его реальными (и компьютер стал немного больше в 58). Что еще более важно, интерпретатор Lisp доказательство концепция о себе определимость Лиспа (мета-циркулярность), независимо от вопрос о юзабилити.
Успех Lisp-это связано во многом с тем, что это самостоятельная definibility сделал это отличный испытательный стенд для изучения конструкций программирования и проектирования новых языках (а также на его удобство для символьных вычислений).
Я не согласен с предпосылкой вопроса.
Адм. Хоппер'первый компилятор С (А-0) была больше похожа на линкер или макроязыка. Она хранимые подпрограммы на ленте (каждому присвоен номер) и ее программы будет записан в список подпрограмм и аргументы. Компилятор будет копия запрашиваемого подпрограммы из ленты и повторно заказать их в полную программу.
Она сказала, что "сборка" в том же смысле, что один собирает антологию стихов: собирая различные элементы вместе в одном томе.
Что первый компилятор не имеет лексер и парсер, насколько я могу сказать, что делает его далекий предок современного компилятора. Позже она создала еще один компилятор (Б-0, а.к.а. Поток-Матик) с целью более английский-подобный синтаксис, но это было'т завершены до 1958 или 1959 году -- примерно в то же время как интерпретатор Lisp.
Поэтому, я думаю, сама постановка вопроса немного ошибся. Похоже, что составители и переводчики развивалась почти точно в то же время, несомненно, благодаря обмену идеями, что бы было много ученых, которые мыслят в одном направлении в те дни.
Лучший ответ вот с цитатами: https://stackoverflow.com/a/7719098/122763.
Другая часть уравнения является то, что компиляторы были шаг абстракции над ассемблером. Сначала у нас было жестко машинный код. "Мы" и были ассемблер. Каждый прыжок и смещение, и т. д. был ручной рассчитывается в HEX (или восьмеричный), а затем ударил в бумажные ленты или карты. Поэтому, когда монтажники пришли на сцену, это была огромная экономия времени. Следующий шаг был макро ассемблеры. Что дал возможность написать макрос, который будет расширяться в набор машинных инструкций. Так Фортран и Кобол были огромным шагом вперед. Нехватка ресурсов (накопителей, памяти и процессорного времени) означает, что общие цели переводчикам пришлось ждать технологией выращивания. Самые ранние переводчики байт-кода систем (таких как Java или CLR на сегодня, но с гораздо меньшими возможностями). Паскаля UCSD была очень популярна (и быстро) языка. МС Basic был байт-код двигателя под капотом. Так что "сборка", было на самом деле, чтобы генерировать байт-код потока, который на самом деле был казнен во время выполнения.
С точки зрения инструкция над головой, она полностью зависела от того, что процессор был запущен. Отрасль прошла большой РИНЦ против ЦИПУ потрясения на некоторое время. Я лично писал на ассемблере для IBM, общие данные, Моторола, Интел (когда они появились), Ti и ряд других. Существует довольно значительная разница в наборы инструкций, регистров и т. д. что будет влиять на то, что необходимо, чтобы "интерпретация" а P-код.
В качестве эталона времени, я начал программировать в телефонной компании около 1972.
Если вы не держит все в памяти, скомпилированный код намного быстрее. Дон'т забывайте, что в это время функции были объединены в скомпилированный код. Если вы не компилируете, вы не знаете, какие функции вы'll необходимо. Итак, вы вызываете функции из... Ой, не с диска еще, мы в начале 50-х, но от карты! Во время выполнения!
Конечно, можно найти обходные пути, но они не нашли пока, к языкам были очень просты и не так далеко от машинного кода. И компиляция простой и достаточно.
Прежде чем первый компилятор был написан, человек написал ассемблерный код, который был огромный прогресс по сравнению с простым двоичным кодом. В то время там был сильный аргумент, что код, скомпилированный компилятором будет менее эффективным, чем код на ассемблере - в то время отношение (стоимость компьютера) (стоимость программист) был намного, намного отличается, чем сегодня. Так там было сильное сопротивление против компиляторы С этой точки зрения.
Но компиляторы-это много эффективнее, чем переводчиков. Если вам предложили написать интерпретатор языка, на тот момент, человек бы подумал, что ты сошел с ума. Можете ли вы представить себе купить миллион долларов компьютер и затем тратить 90% своей силы, чтобы интерпретировать код?
Прежде чем зацикливание программы можно трактовать, его нужно хранить в среде, которую можно многократно читать. В большинстве случаев, единственной подходящей средой будет оперативной памяти. Так как код обычно вводится на перфорированные карточки, которые ... для чтения язык человека-это, вероятно, будет в значительной степени пустым, какая-то обработка должна выполняться после кода перед его сохранением в ОЗУ. Во многих случаях обработка для работы с перфокартами текст в такой форме, которая является пригодной для непосредственного исполнения процессором на самом деле не сложнее, чем переработка ее в форму, которая может быть эффективно через переводчика.
Обратите внимание, что цель ранних компиляторов не было для создания сборки-язык или объектно-код файла на диске, а в конечном итоге код в памяти, что был готов выполнить. Это на самом деле удивительно легко, когда там's нет операционной системы, чтобы получить в пути. Компилятор может генерировать код, начинающийся на одном конце памяти и выделить переменные и отраслевых целей, начиная на другом. Если заявление обозначены меткой на "1234" и компилятор будет храниться в переменной под названием "1234" и инструкция, чтобы перейти к текущей генерации кода адреса, создав эту переменную, если она не'т существуют. Заявление на "Гото 1234" не будет создать переменную, что "1234" если это не'т существуют, а затем перейти к этой переменной [, надеюсь, будет переход на правильное положение сохраняется в нем до этого оператор выполняется]. Обратите внимание, что компилятор не'т придется делать ничего особенного, чтобы ваш код, чтобы перейти
ярлык, который еще'т не определена, поскольку он знает, когда функция "goto" компилирует, где он'е буду прыгать ... переменной. Это может не быть наиболее эффективным способом для генерации кода, но это'адекватная по размерам программы, компьютеры, как ожидается, до ручки.
Потому что переводчики нужны компиляторы для работы.
Вышеуказанное заявление это'т правда. Строго говоря, вы можете сделать переводчика, не используя или иначе взаимодействует с компилятором. Однако результаты делать это не'т не'т очень похожа на то, что я думаю, что вы понимаете под этими терминами.
В строгом смысле, компиляторы и интерпретаторы делают совершенно разные вещи. Компилятор считывает текст из какого-то источника и преобразует его в другой формат: язык ассемблера, машинный код, еще один язык высокого уровня, структуры данных, или что-то еще. Переводчик, между тем, занимает в структуре данных какой-то, и выполняет указания на его основе.
То, что мы склонны думать о том, как и "ОТВ" в настоящее время фактически компилятор, который был в паре с код генератора: программа, которая берет данные из какого-то источника, а выходы код в каком-то формате основанные на том, что он видит. Что'ы довольно интуитивное использование для составителей, и это была одна из первых вещей, компиляторы были созданы для. Но если посмотреть на это с другой стороны, это выглядит очень похоже на то, что переводчик делает. Он всегда выводит код вместо выполнения более общих операций, но принцип тот же.
Если мы посмотрим на это с другой стороны, переводчик должен получить данные от куда-то. Это просто данные, так что вы можете построить его в этом пути вы'd построить любой другой вид данных. Поскольку мы're говоря об интерпретации, кажется естественным, что вы могли бы построить свои данные, основываясь на инструкции в текстовом файле. Но чтобы сделать это, вы'd нужен что-то прочитать в тексте и создавать свои структуры данных, и что'с компилятором. Это'ы подключили к переводчику, а не к генератору кода, но это'ы компилятор все же.
Что's, почему компиляторы были написаны первые. Толкование структур данных было'т новая, даже когда компиляторы были задуманы, но компиляторы были в "недостающее звено", что пусть программисты строят структуры из текста.
Еще один фактор: когда первые компиляторы были написаны стоимость машинного времени значительно выше, чем сейчас. Переводчики используют гораздо больше времени машина.