Какие трансляторы были созданы раньше интерпретаторы или компиляторы и почему кратко

Обновлено: 02.07.2024

Первый компилятор был написан Грейс Хоппер в 1952 году, в то время как интерпретатор Лиспа был написан в 1958 году учеником Джона Маккарти Стивом Расселом. Написание компилятора представляется гораздо сложнее, чем интерпретатор. Если это так, почему первый компилятор был написан за шесть лет до первого интерпретатора?

Написание компилятора представляется гораздо сложнее, чем интерпретатор.

Сегодня это может быть правдой, но я бы сказал, что это было не так около 60 лет назад. Несколько причин:

  • С помощью интерпретатора вам необходимо сохранить и его, и программу в памяти. В эпоху, когда 1kb памяти была огромной роскошью, сохранение минимальной занимаемой памяти было ключевым. И интерпретация требует немного больше памяти, чем запуск скомпилированной программы.
  • Современные процессоры чрезвычайно сложны с огромными каталогами инструкций. Поэтому написать хороший компилятор - действительно вызов. Старые процессоры были намного проще, поэтому даже компиляция была проще.
  • Современные языки намного сложнее старых, поэтому даже компиляторы намного сложнее. Таким образом, старые языки будут иметь более простые компиляторы.

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

В то время лучшие пользовательские интерфейсы были в основном ограничены перфокартами и телетайп-принтерами . В 1961 году система SAGE стала первой Отображение катодно-лучевой трубки (ЭЛТ) на компьютере. Таким образом, интерактивный характер переводчика не был предпочтительным или естественным до гораздо более позднего времени.

Многочисленные компьютеры 1950-х годов использовали переключатели на передней панели для загрузки инструкций, а выход был просто рядами ламп /светодиодов, а любители даже использовали переключатели на передней панели и amp; Светодиоды в 1970-х годах. Возможно, вы знакомы с печально известным Altair 8800 .

Другие аппаратные ограничения также сделали интерпретаторы неосуществимыми. В 1950-х годах на компьютерах существовала крайне ограниченная доступность первичной памяти (например, ОЗУ). До полупроводниковой интегральной схемы (которая не наступила до 1958 года) память была ограничена магнитной памятью ядра или задержка строки памяти , которая была измерена в bits или слова , нет префикса. В сочетании с медленностью памяти вторичного хранилища (например, диска или ленты) было бы расточительно, если не было бы невозможно использовать большую часть памяти, используемой для интерпретатора, даже до того, как была загружена интерпретируемая программа.

Ограничения памяти по-прежнему были основным фактором, когда команда, возглавляемая Джоном Бэкусом в IBM, создала компилятор FORTRAN в 1954-57 годах. Этот инновационный компилятор был успешным только потому, что это был оптимизирующий компилятор .

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

Добавление

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

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

С точки зрения компьютерных наук компиляторы и интерпретаторы являются translators и примерно равны по сложности для реализации.

Я не согласен с предпосылкой вопроса.

адм. Первый компилятор Хоппера (A-0) больше напоминал компоновщик или макроязык. Она хранила подпрограммы на ленте (каждый присваивал номер), а ее программы записывались в виде списка подпрограмм и аргументов. Компилятор скопирует запрошенные подпрограммы с ленты и переупорядочит их в полную программу.

В этом первом компиляторе, насколько я могу судить, не было lexer или parser, что делает его далеким предком современного компилятора. Позднее она создала еще один компилятор (B-0, aka FLOW-MATIC) с целью более синтаксиса на английском языке, но он не был завершен до 1958 или 1959 года примерно в то же время, что и интерпретатор Lisp.

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

Как ссылка на время, я начал программировать в телефонной компании около 1972.

Если вы не держите все в памяти, скомпилированный код намного быстрее. Не забывайте, что в эти моменты функции были объединены с скомпилированным кодом. Если вы не компилируете, вы не знаете, какие функции вам понадобятся. Итак, вы вызываете функции из . О, а не с диска, мы находимся в начале 50-х, но из карт! Во время выполнения!

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

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

Но компиляторы намного эффективнее интерпретаторов. Если бы вы предложили написать переводчика в тот момент, люди подумали бы, что вы сумасшедшие. Можете ли вы представить себе покупку миллиона долларов компьютера, а затем тратить 90% своей мощности на интерпретацию кода?

Прежде чем интерпретировать программу цикла, она должна быть сохранена в среде, которая может быть прочитана повторно. В большинстве случаев единственным подходящим носителем будет ОЗУ. Так как код, как правило, вводится на перфокартах, которые - для понятных для человека языков - скорее всего, будут в значительной степени пустыми, некоторая обработка должна выполняться над кодом до его хранения в ОЗУ. Во многих случаях обработка текста перфокарта в форме, подходящей для прямого выполнения процессором, на самом деле не сложнее, чем обработка ее в форме, которая может быть эффективно обработана через интерпретатор.

Поскольку интерпретаторы нуждаются в компиляторах для работы.

Вышеприведенное утверждение неверно. Строго говоря, вы можете сделать интерпретатор, не используя или не взаимодействуя с компилятором. Но результаты этого не будут сильно похожи на то, что, на ваш взгляд, вы подразумеваете под этими терминами.

В строгом смысле компиляторы и переводчики делают совершенно разные вещи. Компилятор читает текст из некоторого источника и преобразует его в какой-то другой формат: язык ассемблера, машинный код, другой язык высокого уровня, структуру данных или что-то еще. Между тем интерпретатор принимает некоторую структуру данных и выполняет на ней инструкции.

Если мы посмотрим на него с другой стороны, интерпретатор должен получить свои данные где-нибудь . Это всего лишь данные, поэтому вы можете создавать их так же, как и для создания любых других данных. Поскольку мы говорим об интерпретации, естественно, что вы можете создавать свои данные на основе инструкций в текстовом файле. Но для этого вам нужно что-то прочитать в тексте и создать структуру данных, а - это компилятор . Он подключен к интерпретатору вместо генератора кода, но он все равно компилятор.

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

Похожие вопросы

Популярные теги

Первый компилятор был написан Грейс Хоппер в 1952 году, в то время как интерпретатор Lisp был написан в 1958 году учеником Джона Маккарти Стивом Расселом. Написание компилятора кажется гораздо более сложной задачей, чем интерпретатор. Если это так, то почему первый компилятор был написан за шесть лет до первого интерпретатора?

Скомпилировать первый интерпретатор? : P (только частично язык в щеке, интерпретатор сложен (больше, чем простой компилятор), и было бы противно написать эффективный в машинном коде)

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

Маккарти не написал интерпретатор LISP. Маккарти изобрел математический формализм. Стив Рассел, один из студентов лаборатории MIT AI в то время, понял, что может написать переводчика для выполнения фантастических полетов Маккарти, а остальное уже история.

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

Написание компилятора кажется гораздо более сложной задачей, чем интерпретатор.

Это может быть правдой сегодня, но я бы сказал, что это было не так 60 лет назад. Несколько причин почему:

  • С переводчиком вы должны хранить и его, и программу в памяти. В эпоху, когда 1 КБ памяти было огромной роскошью, поддержание низкого объема памяти было ключевым. И интерпретация требует немного больше памяти, чем запуск скомпилированной программы.
  • Современные процессоры чрезвычайно сложны с огромными каталогами инструкций. Так что написание хорошего компилятора - действительно сложная задача. Старые процессоры были намного проще, поэтому даже компиляция была проще.
  • Современные языки намного сложнее, чем старые, поэтому даже компиляторы намного сложнее. Таким образом, у старых языков были бы более простые компиляторы.

Первые компиляторы, где люди. (Когда люди переводчики, нам не нужны компьютеры). Тогда кто-то должен был подумать о написании компилятора на скомпилированном языке (единственном, который у них был, но со временем компилировали мои люди).

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

В то время лучшие пользовательские интерфейсы были ограничены перфокартами и телетайпами . В 1961 году система SAGE стала первым дисплеем Cathode-Ray Tube (CRT) на компьютере. Таким образом, интерактивный характер переводчика не был предпочтительным или естественным намного позже.

Во многих компьютерах 1950-х годов для загрузки инструкций использовались переключатели на передней панели, а на выходе были просто ряды ламп / светодиодов, а любители даже использовали переключатели и светодиоды на передней панели в 1970-х годах. Может быть, вы знакомы с печально известным Altair 8800 .

Другие аппаратные ограничения также делали интерпретаторов невозможными. В 1950-х годах в компьютерах была крайне ограниченная доступность первичной памяти (например, ОЗУ). До появления полупроводниковой интегральной схемы (которая появилась только в 1958 году) память была ограничена памятью магнитного сердечника или памятью линии задержки, которая измерялась в битах или словах , без префикса. В сочетании с медлительностью памяти вторичного хранилища (например, диска или ленты), было бы сочтено расточительным, если не невозможно, использовать большую часть памяти, используемой для интерпретатора, даже до загрузки интерпретируемой программы.

Ограничение памяти по-прежнему было основным фактором, когда команда под руководством Джона Бакуса из IBM создала компилятор FORTRAN в 1954-57 годах. Этот инновационный компилятор был успешным только потому, что он был оптимизирующим компилятором .

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

добавление

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

С точки зрения информатики, компиляторы и интерпретаторы являются переводчиками и примерно одинаковы по сложности для реализации.

Использовали ли компьютеры телетайпы до появления разделения времени? Я бы ожидал, что они будут использовать линейные принтеры или спул на ленту. В противном случае, 1-8 секунд, в течение которых компьютер должен был бы ждать после каждой строки текста, представляли бы 1-8 секунд, которые компьютер мог - но не делал - делал что-то полезное.

@supercat - 1973 - но компьютер, о котором идет речь (EDP-18, Education Data Products), даже тогда был относительно пожилым. Тем не менее, это было то, что у нас было (и иметь какой-либо компьютер, с которым можно было связываться в старшей школе в начале середины 70-х годов, было необычно), так как мы думали, что это было довольно удивительно. :-)

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

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

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

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

Интерес компилятора заключался в простоте программирования, особенно для пользователей, которые не были специалистами по вычислительной технике, таких как ученые в различных областях. Этот интерес был не производительность кода. Но все же время программиста считалось дешевым ресурсом. Стоимость была в компьютерное время, до 1975-1980, когда стоимость перешла от аппаратного обеспечения к программному обеспечению. Это означает, что некоторые профессионалы не воспринимали всерьез даже компилятор .

Очень высокая стоимость компьютерного времени была еще одной причиной дисквалификации переводчиков , так что сама идея была бы смешной для большинства людей.

Случай с Лиспом очень особенный, потому что это был чрезвычайно простой язык, который сделал его выполнимым (а компьютер стал немного больше в 58). Что еще более важно, интерпретатор Lisp был доказательством концепции самоопределимости Lisp ( мета-цикличности ), независимо от какой-либо проблемы юзабилити.

Успех Lisp во многом связан с тем фактом, что эта самоопределимость сделала его отличным испытательным стендом для изучения структур программирования и разработки новых языков (а также для его удобства для символьных вычислений).

Компилятор VS интерпретатор: ключевые отличия

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

Компилятор

Что такое компилятор?

Компилятор — это компьютерная программа, которая переводит компьютерный код с одного языка программирования на другой. Компилятор берет программу целиком и преобразует ее в исполняемый компьютерный код. Для этого требуется целая программа, так как компьютер понимает только то, что написано двоичным кодом. Задача компилятора — преобразовать исполняемую программу в машинный код, который и распознается компьютером. Примерами скомпилированных языков программирования являются C и C++.

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

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

Интерпретатор

Что такое интерпретатор?

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

Интерпретатор представляет собой машинную программу, которая непосредственно выполняет набор инструкций без их компиляции. Примерами интерпретируемых языков являются Perl, Python и Matlab.

  • И компилятор, и интерпретатор выполняют одну и ту же работу — преобразовывают язык программирования высокого уровня в машинный код. Однако компилятор преобразовывает исходный материал в машинный код перед запуском программы. Интерпретатор выполняет эту функцию при ее запуске.

Как это работает?

Интерпретатор создает программу. Он не связывает файлы и не генерирует машинный код. Происходит построчное выполнение исходных операторов во время исполнения программы.

Компилятор (англ. compiler — составитель, собиратель) читает всю программу целиком, делает ее перевод и создает законченный вариант программы на машинном языке, который затем и выполняется.

1) GCC
2) Free Pascal Compiler
3) Компиляторы C , C ++ и Fortran от Sun Microsystems Inc .
4) Watcom Fortran/C++ Compiler
5) Intel C++/Fortran compiler
6) ICC AVR.

Компилятор обеспечивает преобразование программы с одного языка на другой. Команды исходного языка сильно отличаются по организации и мощности, нежели команды машинного языка. Бывают такие, в которых одна команда исходного языка транслируется в 7-10 машинных команд. Существуют даже такие, в которых в каждой команде может соответствовать более 100 машинных команд (например язык программирования Пролог). В исходных языках довольно часто используется строгая типизация данных, которая осуществляется через их предварительное описание. Программирование на таких языках может опираться не только на кодирование алгоритма, но и на тщательное обдумывание структур данных или классов. Весь процесс трансляции с таких языков программирования обычно называется компиляцией, а исходные языки обычно относятся к языкам высокого уровня.

Написать программу, которая выводит на экран результаты следующих действий: 27-5= 11+21= 32/2= 2+2*2= (2+2) * 2= Написать программу, которая выводит на экран результаты следующих действий: 21-4= 21+11= 43/3= 3+3*3= (3+3) * 3=

Вариант 2 1. Даны три числа. Найдите сумму второго и третьего числа. Найдите квадрат первого числа. 2. Даны длины сторон прямоугольника. Найдите площадь прямоугольника. 3. Даны длины катетов прямоугольного треугольника. Найдите периметр треугольника.

2. Какое значение будет иметь переменная b после выполнения следующих операторов присваивания: a:=3; b:=a+9; b:=a+b; b:=a-b+b/a. 3.

Читайте также: