Лисп
Лисп (LISP, от англ. LISt Processing language — «язык обработки списков»; современное написание: Lisp) — семейство языков программирования, программы и данные в которых представляются системами линейных списков символов. Лисп является вторым в истории (после Фортрана) используемым по сей день высокоуровневым языком программирования. Создатель Лиспа Джон Маккарти занимался исследованиями в области искусственного интеллекта (в дальнейшем ИИ) и созданный им язык по сию пору является одним из основных средств моделирования различных аспектов ИИ.
Традиционный Лисп имеет динамическую систему типов. Язык является функциональным, но многие поздние версии обладают также чертами императивности, к тому же, имея полноценные средства символьной обработки становится возможным реализовать объектно-ориентированность, примером такой реализации является платформа CLOS.
Язык Лисп, наряду с языком Ada, прошел процесс фундаментальной стандартизации для использования в военном деле и промышленности, в результате чего появился стандарт Common Lisp. Его реализации существуют для большинства платформ.
Одной из базовых идей языка Lisp является представление каждого символа как узла многокоординатной символьной сети; при этом координаты, свойства, уровни сети записаны в так называемых слотах символа. Основные слоты:
- имя символа (основополагающее Аристотелево А=А из которого вырастает лямбда-исчисление),
- функциональный слот,
- слот-значение
- расширяемый список свойств (можно свободно расширить слотовую систему удобным для решения задачи способом).
Язык Лисп является языком системного программирования для так называемых Лисп-машин, производившихся в 80-е годы, например, фирмой Symbolics.
Синтаксис
Основной механизм языка Лисп — инкапсулированная в список определяющая голова списка и подключённый к ней хвост списка, который рекурсивно также может быть списком. Лисп-машина способна воспринимать каждый поступающий на неё список на самом абстрактном уровне, например как мета-Лисп-машину, модифицирующую воспринимающую машину. В такой динамичной, высокоабстрактной среде можно реализовать как строго научные системы, так и неисчислимое множество программистских трюков и генераторов всевозможных машин.
Любая программа на языке Лисп состоит из последовательности выражений (форм). Результат работы программы состоит в вычислении этих выражений. Все выражения записываются в виде списков — одной из основных структур Лиспа, поэтому они могут легко быть созданы посредством самого языка. Это позволяет создавать программы, изменяющие другие программы или макросы, позволяющие существенно расширить возможности языка.
Внешне исходный код программы на Лиспе отличается обилием круглых скобок; редактирование программ значительно упрощается использованием текстового редактора, поддерживающего автоматическое выравнивание кода, подсветку соответствующих пар скобок и такие специальные команды, как «закрыть все открытые скобки», «перейти через список вправо» и т. д. [1]
Список является последовательностью элементов любого рода, в том числе других списков. Например, (1 3/7 ‘foo #’+) состоит из целого числа, рациональной дроби, символа foo и указателя на функцию сложения. Выражения представляются списками в префиксной записи: первый элемент должен быть формой, то есть функцией, оператором, макросом или специальным оператором; прочие элементы — аргументы этой формы, передаваемые форме для обработки. Функция list возвращает список состоящий из её аргументов: например, (list 1 3/7 ‘foo #’+) возвращает список, упомянутый ранее. Если некоторые элементы являются выражениями, то сначала вычисляется их значение: (list 1 2 (list 1 2)) возвращает (1 2 (1 2)) . Арифметические операторы записываются по тому же принципу, например (+ 4 (* 2 3)) выдаёт 10.
Специальные операторы позволяют управлять последовательностью вычислений. С их помощью реализуются ветвления и циклы. Оператор if позволяет вычислить одно из двух выражений в зависимости от выполнения условия, которое тоже является выражением. Если его результат не ЛОЖЬ (не nil ), то вычисляется первый аргумент, иначе — второй. Например, (if nil (list 1 2 «foo») (list 3 4 «bar»)) всегда возвращает (3 4 «bar») .
s_expression ::= atomic_symbol | «(» s_expression «.» s_expression «)» | list
atomic_symbol ::= letter atom_part
atom_part ::= empty | letter atom_part | number atom_part
letter ::= «a» | «b» | » . » | «z»
number ::= «1» | «2» | » . » | «9»
Примеры
Пример программы, выводящей сообщение «Hello, world!»:
Кто является автором языка программирования LISP?

Как называется язык программирования, разработанный Никлаусом Виртом для целей обучения?
#Компьютеры #Сложность: 1500 #Пандарина

Кто является автором языка программирования LISP?
#Компьютеры #Сложность: 10000 #Пандарина

Кто является создателем языка программирования Eiffel (Эйфель)?
#Сложность: 5000 #Пандарина

Что представляло собой зерцало — атрибут присутственных мест после Петра I?
#Сложность: 200 000 руб. #Кто хочет стать миллионером? #Универ: Прокачай общагу!

Главный герой фильма Николая Ковальского
#Отечественный кинематограф #Сложность: 200 #Пандарина

Как моряки говорят о передвижении по воде?
#Сложность: 200 руб. #Кто хочет стать миллионером?

Какая профессия была первой в трудовой биографии Агнии Барто?
#Сложность: 200 #Пандарина
- Умник.NET © 2023
- Обратная связь
16 апреля 1959 года был анонсирован язык программирования LISP Это один из основных языков для создания искусственного интеллекта

Я зык программирования LISP был создан американский информатиком и автором термина «искусственный интеллект» Джоном Маккарти. В пятидесятых годах предыдущего столетия Маккарти занимался разработкой искусственного интеллекта, для чего ему нужен был новый язык программирования, который помог бы оперировать с английскими словами и с их последовательностями. В итоге Маккарти сам создал такой язык и назвал его LISt Processing language – LISP.
Сегодня LISP – это уже не просто язык программирования, а целое семейство языков, включающее в себя диалекты MacLisp, Interlisp, Franz Lisp, Scheme, Zetalisp и другие. Самая популярная современная версия LISP – Common Lisp, которая не так уж отличается от таких известных языков как C++, PHP или Java.
Несмотря на свой возраст, LISP — это далеко не мертвый язык программирования. Благодаря Common Lisp язык, созданный Маккарти, получил новую жизнь и по сей день применяется для разработки искусственного интеллекта. Конечно, Common Lisp – это уже не тот LISP, который придумал Джон, но пользоваться им куда приятнее и проще, чем многими аналогичными языками программирования.

В 1973 году ученые решили создать компьютер индивидуального пользования, разработанный для достижения более эффективной работы Lisp-программ. Разработки Lisp-компьютера велись в Массачусетском технологическом институте и в исследовательском центре компании Xerox в Пало-Альто. Основными производителями Lisp-компьютеров были компании Xerox, Symbolics Inc. и Lisp Machines Inc.
Для своего времени Lisp-компьютеры были одними из лучших ЭВМ в классе персональных рабочих станций, и хоть им прочили большое будущее, уже в конце 20 века все Lisp-машины вышли из производства.
876 Комментировать —>
Использованные источники: Scott Edmunds (CC BY), precessor (CC BY-ND)
Первый древнейший: в чём уникальность языка программирования LISP
В этой статье мы поговорим об одном из самых старых языков программирования ― Lisp. Несмотря на свой внушающий уважение возраст, он всё ещё находится в строю и заставляет переосмысливать всю теорию программирования. Так что же это за язык и чем он примечателен?
Лисп, или LISP (от англ. LISt Processing language — «язык обработки списков», современное написание: Lisp) — семейство языков программирования, программы и данные в которых представляются в виде списков.
Существует альтернативная расшифровка названия LISP: Lots of Irritating Superfluous Parentheses («Много раздражающих лишних скобок») — намёк на особенности синтаксиса языка.
Шутливое «Десятое правило Гринспена» гласит: «Любая достаточно сложная программа на Си или Фортране содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Common Lisp».

Правило, несмотря на свою юмористичность, выражает важную мысль. При программировании на традиционных императивных языках разработчики тратят очень много времени на реализацию. Результат — худшее качество тех возможностей, которые функциональным языкам, в частности Лиспу, присущи изначально.

Создан был этот язык в конце 1950-х годов математиком Джоном Маккарти. Принято считать, что именно он положил начало понятию «искусственного интеллекта».
Во время работы над одним из своих исследовательских проектов ему пришлось разработать совершенно новый язык программирования, содержащий ряд концепций, до этого не применявшихся.
1. Условные конструкции
If/then/else и построения из них впервые появились именно в языке Lisp и только затем были позаимствованы другими языками.
2. Функции
В этом языке функции находятся на том же уровне, что и строки или числа.
3. Рекурсия
Несмотря на свою математическую природу и то, что она была известна гораздо раньше появления языка Lisp, впервые она была реализована именно в нём.
4. Переосмысление переменных
Все переменные в рамках языка Lisp представляют собой указатели.
5. Сборка мусора
Механизм эффективного автоматического контроля памяти, который стирает из неё ненужные объекты, впервые появился именно в Lisp-е.
6. Вся программа построена на основе выражений
Стандартная Lisp-программа представляет собой деревья выражений, которые могут возвращать конкретные значения.
Если язык полностью состоит из выражений, это позволяет составлять их любимым способом:
(if foo (= x 1) (= x 2))
(= x (if foo 1 2))
7. Символьный тип (A symbol type)
Символы отличаются от строк, что позволяет проверить на равенство, сравнив указатели.
8. Нотация для кода (A notation for code)
Подразумевает использование деревьев из символов.
9. Весь язык всегда доступен (The whole language always available)
Нет явного различия между временем чтения, компиляции и выполнения. Можно компилировать или запускать код во время чтения, читать или запускать кода, пока идёт процесс компиляции, или читать, или компилировать код во время выполнения.
Чем ещё примечателен этот язык? Дело в том, что каждый язык обладает развитой библиотекой инструментов для реализации многих концепций. Любой практикующий программист может воспользоваться либо уже имеющимися в наличии классами, переменными, константами и функциями, либо написать свои собственные реализации.
Lisp же, помимо этого, предоставляет возможности расширения синтаксиса, для чего в нём реализована система макросов. Например, Пол Грэм называет макросы «программами, которые пишут программы». Есть мнение, что Lisp более гибкий, чем обычные языки программирования, так как позволяет неожиданным и творческим образом сочетать элементы, что недоступно никакому другому языку.
Например, рассмотрим минимальную исполняемую программу, которая компилируется и выполняется, даже если при этом ничего существенного не происходит. Начнём с C/C++. В этих языках «точкой входа» — местом, где программа начинает выполняться — является функция main (что значит «основная»):
main()<>
Круглые скобки после имени функции указывают на то, что мы определяем функцию, а не переменную (подробнее об этом позже), фигурные скобки содержат тело функции, инструкции, которые будут выполнены, когда функция будет вызвана. Пока оставим тело функции пустым. На самом деле написанный выше код упрощён. Он будет компилироваться и выполняться, но так определять можно только единственную функцию — main. Дело в том, что всякая функция имеет тип (это он совпадает с типом вычисляемого результата). Если функция ничего не возвращает, её тип void («ничто»), и он обязательно указывается перед именем функции. Если же тип функции не указан, то подразумевается тип int (сокращение от integer, что значит «целый», т. е. целое число), и тогда функция обязана возвращать целое значение инструкцией return. Функция main имеет целый тип, так что полная версия будет такой:
int main()
Напишем то же самое на Java. Как и в C/C++, точкой входа является функция main, но в Java не существует функций вне классов. Таким образом, нам нужно определить класс, членом которого является функция main (функция, принадлежащая классу, называется методом):
public class Minimal < public static void main(String[] args) <>>
В первой строке мы определили класс по имени Minimal, во второй строке мы определили пустой метод main. В отличие от C/C++, в Java все ключевые слова обязательны при определении классов (public class) и методов (public static void). Кроме того, в Java метод main всегда получает массив строк (об этом позже).
Теперь напишем то же самое на Lisp:
Это не опечатка. Вся программа состоит из единственной буквы T, которая в Lisp означает истинное значение (сокращение от truth — «истина»). Что же произошло? Во-первых, в Lisp всякое выражение возвращает некоторый результат. Даже если выражение не является вызовом функции и ничего не вычисляет. В частности, любое значение вычисляется само в себя. Во-вторых, точкой входа является то, что пользователь запускает, будь то функция или значение. Мы «запустили» истину, и она, ничего не вычислив, возвратила саму себя.
Жемчужины Lisp:
- не обязывает программиста определять элементы программы (функции, классы и др.) без необходимости;
- любая сущность Lisp может быть запущена. При этом она возвращает осмысленный результат. В частности это означает, что Lisp не делает разницы между выражениями (expression) и инструкциями (statement), его синтаксис не нуждается в специальном символе завершения инструкции, типа ; в C/C++/Java или разделения между инструкциями в Pascal.
Говоря об этом языке, нельзя не вспомнить и о макросах. Макрос в Lisp — это своего рода функция, которая получает в качестве аргументов формы или объекты и, как правило, генерирует код, который затем будет скомпилирован и выполнен. Это происходит до выполнения программы во время фазы, которая называется развёрткой макросов (macroexpansion). Проще говоря, с помощью макросов можно сделать так, чтобы код Lisp действовал как любой другой язык программирования… Воистину поразительно!
Именно поэтому он получил большую популярность среди хакеров в своё время. Многие отмечают ещё и то, что преимущества этого языка далеко не всегда очевидны тем, кто пытается его использовать, однако более умудрённые программисты говорят, что основной его пользой является опыт переосмысления информатики и программирования в целом. Новый опыт получает любой программист, столкнувшийся с Lisp.
Так как Lisp основан на списках, оператор может представлять собой список элементов, каждый из которых может быть представлен тоже списком либо конечным неделимым элементом, получившим название «атом». В качестве такого атома может выступать, например, какое-либо значение в виде числа или символа.
Lisp является языком системного программирования для так называемых лисп-машин, производившихся в 1980-е годы, например, фирмой Symbolics.
Lisp-машина — универсальная вычислительная машина, архитектура которой оптимизирована для эффективного выполнения программ на языке Lisp.
Эквивалентна абстрактной машине Тьюринга (и обычному персональному компьютеру) по критерию полиноминальной сводимости.
Несмотря на то, что лисп-машины никогда не были широко распространены, многие популярные сейчас идеи и программные технологии были впервые разработаны с помощью лисп-машин. Так, на машинах, которые использовались в исследовательском центре Xerox PARC, были реализованы:
- сборка мусора;
- лазерная печать;
- многооконный графический интерфейс пользователя;
- растровая графика высокого разрешения;
- рендеринг;
- множество сетевых инноваций.
Lisp-машины предоставляли широкие возможности по проведению экспериментальных разработок в области компьютерных наук. На базе разработок таких машин было создано новое поколение инженерных рабочих станций.
Любой язык программирования является живой субстанцией, которая постоянно развивается и совершенствуется. Не был исключением и язык Lisp. Так, ряд лабораторий, исследовавших вопросы искусственного интеллекта, начали предлагать свои интерпретации языка. В результате это привело к появлению ряда диалектов языка Lisp. В период с 1960-х по 1980-е годы образовались такие диалекты, как MacLisp, Interlisp, PSL, Franz Lisp, Scheme, Zetalisp, NIL и T.
Стандартизация языка
К первой половине 1980-х годов в лисп-сообществе сложилась ситуация, которую некоторые авторы сравнивали с Вавилонской башней: параллельно существовали и развивались более десятка крупных диалектов Лиспа, общее же число несовместимых между собой реализаций было существенно больше. Похожая ситуация наблюдалась в это время в большинстве распространённых языков программирования, в случае же с Лиспом ситуация усугублялась тем, что язык изначально был разработан как произвольно расширяемый, что спровоцировало развитие его возможностей в разных диалектах в существенно разных направлениях.
На начальном этапе, когда Lisp использовался почти исключительно в лабораториях и институтах, многообразие диалектов не сильно мешало и даже было отчасти полезным, поскольку способствовало быстрому развитию языка. Но к 1980-м годам, когда появилась потребность в промышленных разработках на Лиспе, обилие реализаций стало тормозом, так как приводило к массовому дублированию разработок и рассредоточению сил на поддержку множества лисп-систем.
Попытки стандартизации Lisp предпринимались почти с момента его появления (первое предложение по стандартизации датируется 1960 годом), но из-за разобщённости и значительных различий в потребностях заинтересованных групп разработчиков ни одно из предложений не было принято. Во второй половине 1970-х годов Министерство обороны США провело огромную работу по анализу ситуации в программных разработках военного назначения, после чего организовало конкурс на разработку нового языка высокого уровня для встроенных систем, которым стал язык Ада. Однако Ада изначально не предназначалась для искусственного интеллекта и символьной обработки, вследствие чего для таких разработок военное ведомство США оказалось вынуждено допустить к использованию более подходящий язык. Поэтому Министерство обороны США оказало организационную и финансовую поддержку формированию промышленного стандарта языка, который и приняло в качестве дополнительного средства разработки ПО для военных применений.
Первоначальный вариант стандарта начали готовить в Университете Карнеги — Меллона на основе внутреннего проекта Spice Lisp, также первоначально нацеленного на разработку лисп-системы для рабочей станции. Проектируемый стандарт с самого начала получил наименование Common Lisp («Общий Lisp»), подчёркивающее цель разработки — получить единый базовый язык, на основании которого можно было бы создавать программно-совместимые системы. В разработке и редактировании стандарта приняли участие около 80 специалистов из университетов, лабораторий и фирм США. Процесс разработки впервые происходил дистанционно, с помощью компьютерной сети ARPANET, через которую было передано свыше 3000 сообщений. Процесс разработки стандарта завершился в 1984 году. Его результат был зафиксирован в первом издании руководства Common Lisp: the Language Гая Стила.
Для чего применяется
Сферы применения языка Lisp многообразны: наука и промышленность, образование и медицина, от декодирования генома человека до системы проектирования авиалайнеров. Первые области применения языка Лисп были связаны с символьной обработкой данных и процессами принятия решений. Наиболее популярный сегодня диалект Common Lisp является универсальным языком программирования. Он широко используется в самых разных проектах: интернет-серверы и службы, серверы приложений и клиенты, взаимодействующие с реляционными и объектными базами данных, научные расчёты и игровые программы.
Существуют специализированные диалекты Lisp, предназначенные для конкретных применений, например, Game Oriented Assembly Lisp (GOAL). Он создан для написания высокодинамичных трёхмерных игр, на нём целиком написана серия игр Jak and Daxter.
Одно из направлений применения Lisp — его использование в качестве скриптового языка, автоматизирующего работу в ряде прикладных программ, в том числе:
- AutoLISP — скриптовый язык САПР AutoCAD;
- Emacs Lisp — встроенный язык текстового редактора Emacs, использованный как в реализации самого редактора, так и в разработке дополнений к нему, что даёт неограниченные возможности расширения функциональности;
- Interleaf Lisp — скриптовый язык в издательском программном обеспечении Interleaf/Quicksilver;
- Nyquist — скриптовый язык в аудиоредакторе Audacity;
- Rep (близок к Emacs Lisp) — язык настроек и расширений в оконном менеджере Sawfish;
- SKILL — скриптовый язык САПР Virtuoso Platform компании Cadence Design Systems;
- TinyScheme — один из скриптовых языков в свободном графическом процессоре Gimp версии 2.4 или более;
- ICAD — система «знаний на основе знаний», которая позволяет пользователям кодировать знания дизайна и опыт инженерного проектирования.
Что дальше?
В случае Лиспа сложно провести чёткую грань между диалектом и языком-потомком, так как различные диалекты Лиспа, созданные за более чем полвека его существования, могут существенно различаться и быть несовместимыми. С другой стороны, Лисп просто в силу возраста оказал то или иное влияние на огромное число языков, причём не только функциональных. Если считать прямыми потомками Лиспа только языки, сохранившие общую структуру программы, но синтаксически несовместимые с Лиспом, то можно выделить следующие:
- Scheme — разработанный в 1976 вариант Lisp, который и сегодня используется в обучении программированию и в исследовательских целях, а также применяется в качестве встраиваемого языка.
- Racket — потомок Scheme, разрабатываемый с 1994 года и находящийся в использовании по сей день. Мощная расширяемая lisp-система, включающая в себя все современные средства поддержки программирования и большой массив библиотек.
- Clojure — созданный в 2007 году на основе Lisp язык функционального программирования, интегрированный с платформой Java (программы транслируются в байт-код и работают под управлением JVM). Унаследовав основные черты Lisp, язык имеет целый ряд синтаксических отличий и нововведений. Интеграция с Java-платформой даёт возможность непосредственно применять весь массив накопленных библиотек для данной платформы. Также Clojure имеет встроенную поддержку параллельного программирования, причём является одним из немногих языков, поддерживающих механизм транзакционной памяти.
- Лого — язык и интерактивная среда, разработанные в 1967 году Сеймуром Пейпертом и Идит Харель для обучения детей дошкольного и младшего школьного возраста основным концепциям программирования. Язык имеет лисп-подобный списочный синтаксис, в котором устранена необходимость использования большинства скобок. Поддерживается также и императивная форма программы, напоминающая Бейсик. Повторение, кроме рекурсии, может быть реализовано с помощью конструкции цикла с фиксированным числом итераций. Характерная особенность среды интерпретатора Лого — поддержка визуального агента («черепашки»), изображаемого в виде пиктограммы на графическом поле (в окне).
Завершая рассказ, можно сказать, что Lisp до сих пор остаётся одним из основных использующихся языков. Применяется он и как средство обычного промышленного программирования, от встроенных скриптов до веб-приложений массового использования, хотя популярным его назвать нельзя: в рейтингах популярности языков он стабильно занимает примерно 29-30 места.
- lisp
- программирование
- исследования в ит
- исследования и прогнозы в it
- Блог компании Сбер
- Программирование