Язык Lisp
Lisp (от англ. List Processing — «обработка списков») — это семейство языков программирования, основанных на представлении программ в виде списков (S-выражений) и использующих единообразный синтаксис для кода и данных. Lisp является одним из старейших языков программирования высокого уровня, уступая по возрасту только Fortran. Отличается мощной системой макросов, автоматическим управлением памятью (сборка мусора), динамической типизацией и поддержкой функциональной парадигмы, хотя в разных диалектах реализованы также императивные и объектно-ориентированные возможности.
История
Создание и ранние годы
Язык Lisp был создан в 1958 году Джоном Маккарти в Массачусетском технологическом институте (MIT) для исследований в области искусственного интеллекта. Первоначальная реализация, названная Lisp I, была выполнена для компьютера IBM 704. Маккарти опубликовал описание языка в статье «Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I» (1960), где заложил теоретические основы: использование λ-исчисления, рекурсивных функций и списков как основной структуры данных.
В 1962 году появился Lisp 1.5 — первая широко распространённая версия, включавшая интерпретатор и компилятор. В 1970-х годах, с развитием компьютерных наук, возникло множество диалектов, наиболее известными из которых стали MacLisp (MIT) и Interlisp (Xerox PARC, BBN). MacLisp использовался в проекте MAC, а Interlisp — в исследовательских центрах искусственного интеллекта.
Стандартизация и Common Lisp
К 1980-м годам фрагментация диалектов стала серьёзной проблемой. В 1981 году группа исследователей из ведущих университетов и компаний (включая MIT, Stanford, Carnegie Mellon, Symbolics, Xerox) начала работу над единым стандартом. Результатом стал язык Common Lisp, спецификация которого была опубликована в 1984 году (первая версия) и в 1994 году (ANSI X3.226-1994). Common Lisp объединил лучшие черты MacLisp, Interlisp и других диалектов, добавив объектную систему CLOS (Common Lisp Object System), условную компиляцию и мощную систему пакетов.
Параллельно, в 1984 году, появился Scheme — минималистичный диалект, созданный Джеральдом Сассманом и Гаем Стилом. Scheme отличался чистым функциональным стилем, лексической областью видимости и поддержкой продолжений (continuations). В 1998 году был опубликован стандарт Revised⁵ Report on the Algorithmic Language Scheme (R⁵RS), а в 2007 году — R⁶RS.
Современное состояние
В 2000-х годах интерес к Lisp возродился благодаря развитию свободного программного обеспечения. Появились новые реализации: SBCL (Steel Bank Common Lisp, ответвление от CMUCL), Clozure CL, ECL (Embeddable Common Lisp). Для Scheme был создан компилятор Chicken Scheme и интерпретатор Gambit. В 2010-х годах возникли гибридные языки, такие как Clojure (работающий на виртуальной машине Java) и Hy (транслируемый в Python). Lisp продолжает использоваться в академических исследованиях, разработке экспертных систем, обработке естественного языка и в некоторых коммерческих продуктах (например, в системе управления полётами Boeing 777).
Основные характеристики
Синтаксис и S-выражения
Код на Lisp записывается в виде S-выражений (symbolic expressions) — списков, заключённых в круглые скобки. Первый элемент списка обычно является функцией или оператором, а остальные — её аргументами. Например, выражение (+ 1 2) означает вызов функции сложения с аргументами 1 и 2. Такой синтаксис обеспечивает единообразие: программа сама является структурой данных, которую можно анализировать и модифицировать во время выполнения.
Макросы
Одной из ключевых особенностей Lisp является система макросов. В отличие от макросов C, которые работают на уровне текста, макросы Lisp оперируют на уровне синтаксических деревьев. Программист может определять новые синтаксические конструкции, которые преобразуются в код на этапе компиляции. Это позволяет создавать предметно-ориентированные языки (DSL) внутри Lisp, например, для описания грамматик, правил логического вывода или пользовательских интерфейсов.
Автоматическое управление памятью
Lisp был одним из первых языков, внедривших сборку мусора. Система автоматически освобождает память, занятую объектами, на которые больше нет ссылок. В современных реализациях (SBCL, Clozure CL) используются поколенческие сборщики мусора, минимизирующие паузы.
Динамическая типизация
Типы данных в Lisp проверяются во время выполнения, а не на этапе компиляции. Переменные могут хранить значения разных типов в разные моменты времени. Однако в Common Lisp предусмотрена возможность объявления типов для оптимизации компилятором.
Функции высшего порядка
Lisp поддерживает функции как объекты первого класса: их можно передавать в качестве аргументов, возвращать из других функций и сохранять в структурах данных. Это позволяет писать компактный и выразительный код, например, с помощью функций mapcar, reduce и filter.
Диалекты
Common Lisp
Common Lisp — мультипарадигмальный диалект, объединяющий функциональное, императивное и объектно-ориентированное программирование. Включает развитую объектную систему CLOS с множественным наследованием, мультиметодами и метаобъектным протоколом (MOP). Стандарт ANSI Common Lisp (1994) описывает более 700 функций и макросов. Основные реализации:
- SBCL (Steel Bank Common Lisp) — высокопроизводительный компилятор с открытым исходным кодом, портированный на многие платформы.
- Clozure CL — реализация с быстрым компилятором и низким потреблением памяти.
- ECL — реализация, транслирующая Lisp в C, что позволяет встраивать его в программы на C/C++.
Scheme
Scheme — минималистичный диалект, ориентированный на чистоту и элегантность. Отличается строгой лексической областью видимости, поддержкой продолжений и единственным пространством имён. Стандарты R⁵RS и R⁶RS определяют небольшое ядро языка, которое расширяется библиотеками. Реализации:
- GNU Guile — официальный язык расширений GNU, используется в проектах GNU.
- Chicken Scheme — компилятор, транслирующий Scheme в C.
- Racket (ранее PLT Scheme) — платформа для создания языков программирования, включающая мощную среду разработки DrRacket.
Clojure
Clojure — современный диалект, созданный Ричем Хики в 2007 году. Работает на виртуальной машине Java (JVM), что даёт доступ к огромной экосистеме библиотек. Отличается упором на неизменяемые структуры данных, поддержку параллелизма (через ссылочные типы, атомы и агенты) и макросы на основе синтаксиса Lisp. ClojureScript — версия для JavaScript.
Другие диалекты
- Emacs Lisp — язык расширений текстового редактора GNU Emacs. Имеет ограниченную область применения, но широко используется для настройки редактора.
- Hy — диалект, транслируемый в Python, позволяющий использовать синтаксис Lisp с доступом к библиотекам Python.
- AutoLISP — диалект, используемый в системе автоматизированного проектирования AutoCAD.
Применение
Искусственный интеллект
Lisp исторически связан с исследованиями в области искусственного интеллекта (ИИ). На нём написаны такие системы, как:
- SHRDLU (Терри Виноград, 1972) — программа для понимания естественного языка в мире кубиков.
- MYCIN (Стэнфорд, 1970-е) — экспертная система для диагностики инфекционных заболеваний.
- Cyc — проект по созданию общей базы знаний, начатый в 1984 году.
До сих пор Lisp используется в академических исследованиях по ИИ, особенно в области обработки естественного языка и символического вывода.
Разработка программного обеспечения
Common Lisp применяется в коммерческих проектах, требующих высокой гибкости и быстрой разработки прототипов. Например:
- ITA Software — система поиска авиабилетов, использовавшая Lisp (ныне принадлежит Google).
- Boeing 777 — система управления полётом (частично написана на Lisp).
- Grammarly — сервис проверки грамматики (ядро написано на Common Lisp).
Образование
Scheme и Racket часто используются в курсах по программированию и информатике. Книга «Structure and Interpretation of Computer Programs» (SICP) Харольда Абельсона и Джеральда Сассмана, использующая Scheme, считается классическим учебником по основам программирования.
Автоматизация и скрипты
Emacs Lisp — один из самых популярных языков для настройки редактора. Пользователи пишут макросы для автоматизации задач, создания интерфейсов и интеграции с внешними инструментами.
Критика
Lisp часто критикуют за:
- Синтаксис с множеством скобок — новичкам трудно читать и писать код из-за обилия вложенных скобок. Однако в современных редакторах (Emacs, Vim, DrRacket) скобки автоматически подсвечиваются и выравниваются.
- Производительность — ранние реализации были медленными из-за интерпретации и сборки мусора. Современные компиляторы (SBCL, Clozure CL) достигают производительности, сопоставимой с C++ в некоторых задачах.
- Отсутствие широкой экосистемы — по сравнению с Python, Java или JavaScript, у Lisp меньше библиотек и сообществ. Однако Common Lisp имеет Quicklisp — менеджер пакетов с тысячами библиотек.
- Сложность стандарта — спецификация Common Lisp объёмна и содержит множество устаревших конструкций. Scheme, напротив, минималистичен, но его реализации часто несовместимы друг с другом.
Интересные факты
- Название Lisp происходит от «LISt Processing», но сам язык не ограничивается только списками — поддерживаются массивы, хеш-таблицы, структуры и объекты.
- В 1970-х годах была создана Lisp-машина — специализированный компьютер, аппаратно реализующий выполнение Lisp. Наиболее известные модели — Symbolics 3600 и Xerox 1100.
- В 1984 году вышла книга «Common Lisp: The Language» Гая Стила, которая долгое время служила неофициальным стандартом.
- Язык Java был частично вдохновлён Common Lisp (объектная система, сборка мусора), хотя его синтаксис ближе к C.
- В 2000-х годах компания Google использовала Common Lisp для разработки некоторых внутренних инструментов, в частности, системы управления знаниями.
Источники
- McCarthy, J. (1960). «Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I». Communications of the ACM.
- Steele, G. L. (1990). Common Lisp: The Language (2nd ed.). Digital Press.
- Abelson, H., & Sussman, G. J. (1996). Structure and Interpretation of Computer Programs (2nd ed.). MIT Press.
- Graham, P. (1993). On Lisp: Advanced Techniques for Common Lisp. Prentice Hall.
- ANSI X3.226-1994. American National Standard for Information Systems — Programming Language — Common Lisp.
- Seibel, P. (2005). Practical Common Lisp. Apress.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →