Открыть сервисСервис

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.51962Классическая реализация, описанная в «Lisp Programmer's Manual»
Scheme1975Минималистичный диалект Гая Стила и Джеральда Сассмана, лексическая область видимости, continuations
Common Lisp1984Стандартизированный объединённый диалект, ANSI-стандарт с 1994 года
Clojure2007Диалект Рича Хикки на платформе JVM, упор на конкурентность
Emacs Lisp1985Встроенный язык расширения текстового редактора Emacs
Racket2010Диалект, развившийся из 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.
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru