Lisp — язык программирования¶
Lisp (от LISt Processing — «обработка списков») — семейство языков программирования, первоначально созданное в 1958 году Джоном Маккарти и его сотрудниками в Массачусетском технологическом институте. Lisp — один из старейших языков программирования, дошедших до наших дней, и один из двух языков, ставших стандартом языков искусственного интеллекта (наряду с Prolog). Ключевая особенность Lisp — обработка данных через односвязные списки и использование скобочной нотации (S-выражений), а также возможность программы представлять собственные данные в виде исполняемого кода.
¶Происхождение и история
Идея Lisp была изложена Джоном Маккарти в статье 1958 года «Recursive Functions of Symbolic Expressions and Their Computation by Machine», опубликованной в Communications of the ACM в 1960 году. Маккарти предложил формальную систему описания вычислений, основанную на лямбда-исчислении, и показал, как её можно реализовать на компьютере. Первая реализация — на языке MAD — была выполнена в 1958 году, а в 1959 году Стив Рассел и Тимоти Харт написали первый интерпретатор Lisp для IBM 704, используя машинный регистр для адресации ячеек памяти. Отсюда произошли операции car (содержимое адресного регистра) и cdr (содержимое декрементного регистра).
В 1960-е годы Lisp быстро распространился по университетским и исследовательским лабораториям США. К 1970-м годам сложилось множество диалектов: Stanford Lisp 1.6, MIT MacLisp, BBN Lisp, Interlisp. В 1973 году в Xerox PARC был разработан Common Lisp, а в 1984 году вышла первая версия стандарта Common Lisp, объединившего черты наиболее развитых диалектов.
В СССР и России Lisp также использовался: в Институте точной механики и вычислительной техники АН СССР и других научных центрах применялись диалекты для задач искусственного интеллекта и символьных вычислений.
¶Основные концепции
¶S-выражения
Базовый синтаксис Lisp — S-выражения (symbolic expressions). Атомы (символы, числа) и списки, заключённые в круглые скобки, представляют и данные, и программы. Форма (операнд1 операнд2 ...) трактуется как вызов функции операнд1 с аргументами операнд2 и далее. Единообразие представления кода и данных позволяет программам на Lisp обрабатывать собственный исходный код как данные — это свойство называется гомоиконичностью.
¶Функции высших порядков
Lisp поддерживает функции как объекты первого класса: их можно передавать как аргументы, возвращать из функций и присваивать переменным. Анонимные функции задаются с помощью формы lambda. Макрокоманды (макросы) позволяют программисту преобразовывать форму до её вычисления, что даёт мощный механизм расширения языка.
¶Динамическая типизация
Lisp — динамически типизированный язык: тип значения определяется во время выполнения, а не компиляции. Стандарт Common Lisp включает систему типов с предикатами (stringp, numberp), объединениями типов и механизмом перегрузки диспетчеризации (method combination).
¶Сборка мусора
Lisp-системы одними из первых внедрили автоматическую сборку мусора, что стало стандартной практикой для современных языков.
¶Основные диалекты и стандарты
| Диалект | Год | Особенности |
|---|---|---|
| Lisp 1.5 | 1962 | Классическая реализация, описанная в «Lisp Programmer's Manual» |
| Scheme | 1975 | Минималистичный диалект Гая Стила и Джеральда Сассмана, лексическая область видимости, continuations |
| Common Lisp | 1984 | Стандартизированный объединённый диалект, ANSI-стандарт с 1994 года |
| Clojure | 2007 | Диалект Рича Хикки на платформе JVM, упор на конкурентность |
| Emacs Lisp | 1985 | Встроенный язык расширения текстового редактора Emacs |
| Racket | 2010 | Диалект, развившийся из Scheme, ориентированный на образование и исследование языков |
¶Применение
Исторически Lisp был основным языком исследований в области искусственного интеллекта в 1960–1980-е годы. На нём создавались экспертные системы, программы для обработки естественного языка, теоремообразователи. В 1980-е годы Lisp-машины (Symbolics, LMI) представляли собой специализированные аппаратные платформы для выполнения Lisp-программ.
В настоящее время Common Lisp применяется в коммерческих и научных проектах, Clojure — в серверной разработке и обработке данных. Emacs Lisp остаётся одним из самых распространённых языков расширения. Scheme широко используется в образовании — он является основой ряда учебников по программированию, включая «Structure and Interpretation of Computer Programs» Харольда Абельсона и Джеральда Сассмана.
¶Влияние на другие языки
Концепции, впервые реализованные в Lisp, повлияли на множество современных языков: лямбда-функции и замыкания (в JavaScript, Python, Ruby), макросы (в Rust, Elixir), динамическая типизация, сборка мусора, REPL-цикл (read-eval-print loop). Гомоиконичность и макросы нашли отражение в Racket и в системах метапрограммирования.
¶Интересные факты
- Lisp-код традиционно содержит много открывающих и закрывающих скобок, что стало объектом шуток среди программистов, хотя на практике вложенные скобки встречаются редко.
- Маккарти изначально планировал Lisp как язык для математических вычислений, однако идея оказалась применима гораздо шире.
- В 2020 году исполнилось 62 года с момента первой публикации идеи Lisp.
¶Источники
- McCarthy J. Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I. Communications of the ACM, 1960.
- Steele G.L., Sussman G.J. Scheme: An Interpreter for Extended Lambda Calculus. MIT AI Lab, 1975.
- Common Lisp HyperSpec (ANSI X3.226-1994).
- Winston P.H., Horn B.K.P. Lisp. Addison-Wesley, 1984.
