История создания языка LISP
Секция: Технические науки
лауреатов
участников
лауреатов
участников
XXXVII Студенческая международная научно-практическая конференция «Технические и математические науки. Студенческий научный форум»
История создания языка LISP
Автором языка Лисп принято считать Джона Маккарти, который во время разработки языка работал в Массачусетском технологическом институте профессором по связи. Он и Марвин Мински вместе были погружены в работу с искусственным интеллектом, по причине чего и появилась необходимость в создании языка программирования, который адекватно отвечал бы требованиям задач этой области. Основная работа по разработке лиспа была проделана Маккарти в MIT в с 1958 - 1963 гг., после чего он перевелся в Калифорнийский Стенфордский университет , в котором получил должность профессора по искусственному интеллекту.
За основу Лиспа был взят более ранний язык IPL, который был разработан Ньюэллом, Шоу и Саймоном. IPL являлся языком обработки списков и имел предназначение для реализации проекта «Логик-теоретик» — такой системы искусственного интеллекта, которая была предназначена для автоматического вывода теорем математической логики. IPL можно назвать языком низкого уровня , но он имел в себе несколько базовых идей, такие как единый механизм хранения программ и данных в виде списков — иерархических структур элементов, связанных ссылками, и еще идея динамического распределения памяти. После того, как в 1956 г. Маккарти ознакомился с языком IPL, у него родилась идея реализации обработки IPL-списков в Фортране, который как раз в тоже время проектировался в IBM, но данная идея так и не была воплощена в реальность. Спустя какое то время, Маккарти было принято участие в работе «комитета по языку высокого уровня», который разрабатывал Алгол, но и там его идеи не были приняты. И по итогу к Маккарти пришла идея важности создания нового языка программирования
Изначально Маккарти было сформулирован списочный формализм, служащий для описания данных и также основанный на нём же механизм описания лямбда-выражений, что дало возможность записи программы в виде наборов функций, в виде списочной формы. Как уже потом писал Маккарти, сначала он хотел применять отдельный формализм для записи программ, который отличается от S-выражений, но как оказалось, это было лишним. Когда Маккарти был описан с помощью своей списочной записи алгоритм функционирования интерпретатора нового языка, Стивом Расселом было замечено, что сейчас для создания на самом деле работающего интерпретатора вполне хватит простого перевода этой записи в машинный код. Маккарти относился к этой мысли со скептицизмом, но Рассел реально проделал эту работу и смог получил первый интерпретатор Лиспа для компьютера IBM 704. Далее идея написания транслятора языка на нём самом использовалась часто, и свое применение находило не только в функциональных и логических языках, но и так в императивных.
Исторически сложилось так, что первой реализацией Лиспа которая включает все современные базовые элементы языка, являлся интерпретатор, который работал на появившийся в 1958 г. IBM 704. Это позволяет считать Лисп одним из двух старейших языков высокого уровня, находящиеся в употреблении с самого создания до нашего времени (первый -Фортран). Кроме того, Лиспом было сохранено первенство ещё кое в чем. Речь идет о том, что активная работа с динамическими списками сделала невозможным ручное управление памятью, которое сохраняется в императивных языках и сейчас. Создание новых списочных ячеек и списков и выход из использования имеющихся при работе лисп-программы происходят настолько активно, что почти не дает возможности обойтись без системы автоматического управления памятью, которая могла бы контролировать использование ранее созданных в памяти объектов и периодически удаляла те из них, использование которых прекратилось. То есть системы сборки мусора. Маккарти был вынужден реализовать эту систему, благодаря которой Лисп, помимо всего остального, считается ещё и самым старым из применяемых на сегодняшний день языков программирования с автоматическим управлением памятью и сборкой мусора.
Позже были созданы реализации для IBM 7090, а потом - для серий IBM 360 и 370. Компьютеры IBM были неудобными для работы в интерактивном режиме, из-за чего в 1950-х гг. немногочисленная группа разработчиков, вместе с бывшими работниками IBM, организовалась в самостоятельную компанию Digital Equipment Corporation. Первым её изделием был компьютер PDP-1, предназначенный изначально для интерактивного режима работы. На нем в 1960 г. была реализована интерактивная система «Lisp 1», которая включала в себя интегрированные интерпретатор и редактор исходного кода и отладчик, позволявшая выполнять весь цикл работ над программой в самой системе. Можно сказать, что это была первая «среда программирования» в том же смысле, в котором оно подразумевает себя сегодня. В тоже время в журнале «Communications of ACM» была опубликована статья Маккарти «Recursive Functions of Symbolic Expressions and their Computation by Machine.», в которой Лисп был описан в виде алгебраического формализма на самом Лиспе. Статья стала классической, а формализм типа «Лисп на Лиспе» с того времени стал одним из наиболее употребимых в литературе по теории программирования. Ещё одной технологической новинкой, появившимся в результате реализации системы «Lisp 1» являлся изобретённый Маккарти механизм, который мог позволить запускать интерпретатор Лиспа вместе с выполнением обычных вычислительных работ в пакетном.
К 1962 г. была готова новая версия оригинального лиспа «Lisp 1.5», в которой устранялись все обнаруженные за время эксплуатации недостатки первой версии. Её описание было издано в «MIT Press» как отдельная книга. Так как руководство включало описание реализации системы, оно стало основой для создания лисп-систем для большинства других компьютеров как в США, так и в других странах.
Несмотря на активное использование Лиспа в европейских и азиатских странах и разработку там же своих собственных лисп-систем, большинство распространённых диалектов Лиспа имеют американское происхождение. В начале 80-х гг. в лисп-сообществе случилась ситуация, которую многие авторы сравнивали с Вавилонской башней: параллельно существовали и развивались больше десяти крупных диалектов Лиспа,а общее число несовместимых между собой реализаций было значительно больше. Подобная ситуация развивалась в то время и в большинстве других распространённых языков программирования, а в случае же с Лиспом ситуация была еще хуже из-за того, что язык изначально был разработан как произвольно расширяемый, что спровоцировало развитие его возможностей в разных диалектах в существенно разных направлениях. Если на начальном этапе, когда Лисп использовали в основном в лабораториях и институтах, многообразие диалектов не особенно мешало и даже было в каком то смысле полезным, поскольку способствовало быстрому развитию языка, то к 1980-м гг., в то время когда появилась нужда в промышленных разработках на Лиспе, многообразие реализаций сыграло роль тормоза, потому что оно приводило к массовому дублированию разработок и рассредоточению сил на поддержку множества лисп-систем.
Попытки стандартизации Лиспа предпринимались практически с момента его появления, но из-за разобщённости и значительных различий в потребностях заинтересованных групп разработчиков ни одно из предложений не было принято. В конце 70-х гг. Министерством обороны США была проведена немалая работа по анализу ситуации в программных разработках военного назначения. Был организован конкурс на разработку нового языка высокого уровня для встроенных систем, им стал язык Ада. Но Ада не предназначалась первоначально для искусственного интеллекта и символьной обработки, из-за чего для таких разработок военное ведомство США было вынуждено прибегнуть к использованию более подходящего языка. И поэтому Министерство обороны США оказало содействие формированию промышленного стандарта языка Лисп, который вскоре и приняло в качестве дополнительного средства разработки ПО для военных целей.
Начальный вариант стандарта начал изготавливаться в Университете Карнеги - Меллона на базе внутреннего проекта Spice Lisp, также изначально нацеленного на разработку лисп-системы для рабочей станции. Разрабатываемому стандарту с самого начала было дано название «Common Lisp»,что подчёркивало цель разработки - получение единого базового языка, на основании которого было бы возможным создание программно-совместимых систем. В этапе разработки и редактирования стандарта приняло участие примерно 80 специалистов из университетов, лабораторий и фирм США. Разработка проводилась дистанционно, через компьютерную сеть ARPANET, которая передавала более трех тысяч сообщений. В 1984 г. разработка стандарта завершилась. Результаты были зафиксированы и опубликованы Гаем Стилом в первом издании руководства «Common Lisp: the Language» .
Создание Common Lisp притормозило появление новых диалектов языка. «Старые» диалекты еще существовали, но по мере выхода из употребления платформ, на которых они работали, прекращали использоваться и соответствующие Лисп-системы. Большое количество перестало существовать в 1985 - 1995 гг.. Последующие разработки были произведены уже на Common Lisp. И все же, в последующих годах отмечается появление нескольких новых диалектов Лиспа, которые в основном упрощались и ориентировались на микрокомпьютеры. В последующие десятилетия обширно распространились языки, которые использовали автоматическое управление памятью, компиляцию в промежуточный код и выполнение его в виртуальной машине, такие как Java, Python, C#, и др.. Были созданы и еще несколько диалектов Лиспа, которые были ориентированы на выполнение в динамических средах других языков. Таким диалектам становится возможным работа напрямую с библиотеками соответствующей языковой среды и взаимодействовать с программами на других языках, выполняемых в этой же среде. Например:
- Clojure - Scheme-подобный язык, служащий для исполнения под JVM.
- Kawa - тоже вариация реализации Scheme для JVM.
- Hylang - диалект, работающий под управлением среды исполнения языка Python.
- Lisp Flavored Erlang - диалект Лиспа, написанный на Erlang и исполняемый под его виртуальной машиной BEAM.