Лисп (LISP, от англ. List Processing language — «язык обработки списков»; современное написание: Lisp) — семейство языков программирования, программы и данные в которых представляются системами линейных списков символов. Применяется он и как средство обычного промышленного программирования, от встроенных скриптов до веб-приложений массового использования, хотя популярным его назвать нельзя.
Традиционный Лисп имеет динамическую систему типов. Язык является функциональным, но начиная уже с ранних версий обладает также чертами императивности, к тому же, имея полноценные средства символьной обработки, позволяет реализовать объектно-ориентированность; примером такой реализации является платформа CLOS.
Наряду с языком Ада Лисп прошёл процесс фундаментальной стандартизации для использования в промышленности, в результате чего появился диалект Common Lisp, впоследствии стандартизованный ANSI. Его реализации существуют для большинства платформ.
Исторически первой реализацией Лиспа, включающей все современные базовые элементы языка, был интерпретатор, работавший на IBM 704, появившийся в октябре 1958 года. Это, кстати, позволяет говорить о Лиспе как об одном из двух старейших языков высокого уровня, которые находятся в употреблении с момента создания до настоящего времени (первый — Фортран). Помимо этого, Лисп сохранил первенство ещё в одном отношении. Дело в том, что активная работа с динамическими списками сделала невозможным ручное управление памятью, которое в императивных языках отчасти сохраняется по сей день. Создание новых списочных ячеек и списков и выход из использования имеющихся при работе лисп-программы происходят настолько активно, что практически невозможно обойтись без системы автоматического управления памятью, которая контролировала бы использование ранее созданных в памяти объектов и периодически удаляла те из них, использование которых прекратилось, то есть системы сборки мусора. Маккарти пришлось реализовать эту систему, благодаря чему Лисп, помимо прочего, является ещё и самым старым из применяемых сегодня языков программирования с автоматическим управлением памятью и сборкой мусора.
Позднее были созданы реализации для IBM 7090, в дальнейшем — для серий IBM 360 и 370. Компьютеры IBM оказались неудобны для работы в интерактивном режиме, вследствие чего в конце 1950-х годов небольшая группа разработчиков, в том числе работавших ранее в IBM, выделилась в самостоятельную компанию Digital Equipment Corporation (DEC). Первым её изделием стал компьютер PDP-1, изначально ориентированный на интерактивный режим работы. На этой машине в 1960 году была реализована интерактивная система «Lisp 1», включающая в себя интегрированные интерпретатор, редактор исходного кода и отладчик, позволявшая выполнять весь цикл работ над программой непосредственно в системе. По сути, это была первая «среда программирования» в том смысле, который вкладывается в это понятие сейчас. Тогда же в журнале «Communications of ACM» вышла статья Маккарти, в которой Лисп был описан в виде алгебраического формализма на самом Лиспе. Статья стала классической, а формализм типа «Лисп на Лиспе» с тех пор стал одним из наиболее употребимых в литературе по теории программирования. Ещё одним технологическим новшеством, появившимся в связи с реализацией системы «Lisp 1» был изобретённый Маккарти механизм, позволявший запускать интерпретатор Лиспа одновременно с выполнением обычных вычислительных работ в пакетном режиме (то, что сейчас известно как «система разделения времени»).
Мотивом для создания в конце 1970-х годов системы Franz Lisp послужило желание получить лисп-систему для новых компьютеров VAX, чтобы обеспечить выполнение на них системы Macsyma и другого написанного на Лиспе программного обеспечения. Поскольку основной целью был перенос Macsyma, за основу был взят MACLisp, однако из языка были исключены некоторые устаревшие особенности и добавлены новые механизмы, заимствованные из разрабатываемого в то время в том же MIT Zetalisp. Наиболее значительный вклад в создание данного диалекта внесли Университет Беркли, Университет Пенсильвания, Bell Labs, Ливерморская национальная лаборатория и Университет Карнеги — Меллона. Одним из основных вдохновителей проекта был профессор Университета Беркли Ричард Фэйтман, ранее работавший в MIT и участвовавший в разработке оригинальной системы Macsyma. В числе создателей Franz Lisp было несколько его учеников. Название системы было выбрано в честь известного венгерского композитора Ференца Листа.
Система была реализована в 1981 году на C для VAX 780/11 под управлением ОС UNIX. Входящий в состав системы компилятор носил имя «Liszt» — фамилии композитора, давшего имя диалекту. В 1982 году система была портирована на процессор Motorola 68000 с шиной VME, затем ещё на ряд 32-разрядных персональных платформ, в результате она стала наиболее широко используемой версией Лиспа как для 32-разрядных систем с разделением времени, так и для 32-битовых мини-ЭВМ и персональных рабочих станций.
Система Franz Lisp распространялась бесплатно под лицензией BSD, но аспирант Университета Беркли Фридрих Кунце подал идею создания коммерческой компании, которая бы обеспечивала качественную платную поддержку пользователей и выполняла заказы по портированию Franz Lisp на новые аппаратные и программные платформы. Это было время роста компьютерного рынка и перспективы выглядели неплохо. Компания была зарегистрирована в 1984 году и получила название «Franz Inc». Начало деятельности фирмы было достаточно удачным, ей удалось получить контракт на портирование Franz Lisp на платформу Sun, а позже — ещё несколько аналогичных предложений. Однако в 1985 году под давлением Министерства обороны США американское лисп-сообщество начало активную переориентацию на новый диалект — Common Lisp, создание которого в это время завершалось. В этих условиях Franz Inc. не могла найти новых контрактов, оказалась на грани закрытия и была вынуждена перейти к разработке собственной реализации Common Lisp — Allegro Common Lisp (название было выбрано, чтобы сохранить преемственность «музыкальной» темы). История Franz Lisp на этом, фактически, завершилась. В настоящее время оригинальная система полностью вышла из употребления.
В последние десятилетия широко распространились языки, использующие автоматическое управление памятью, компиляцию в промежуточный код и исполнение его в виртуальной машине, такие как Java, Python, C#, и другие. Было создано и несколько диалектов Лиспа, ориентированных на исполнение в динамических средах других языков. Эти диалекты получают возможность напрямую работать с библиотеками соответствующей языковой среды и взаимодействовать с программами на других языках, исполняемыми в той же среде. Среди них:
- Clojure — Scheme-подобный язык, предназначенный для исполнения под JVM.
- Kawa — ещё один вариант реализации Scheme для JVM.
- Hy (или Hylang) — диалект, работающий под управлением среды исполнения языка Python.
- LFE (Lisp Flavored Erlang) — диалект Лиспа, написанный на Erlang и исполняемый под его виртуальной машиной BEAM.
- Pixi (Проект не развивается) — минималистичный Лисп, написанный на альтернативной реализации Python — PyPoy
Лисп является мощным функциональным языком программирования, который может быть использован для создания нейронных сетей. Чтобы программировать нейронные сети на Лиспе, можно использовать специализированные библиотеки и фреймворки, такие как cl-neural и clml. Эти библиотеки предоставляют удобные средства для создания и обучения нейронных сетей, а также для анализа и визуализации результатов.
Программирование нейронных сетей на Лиспе обеспечивает преимущества функционального подхода, такие как удобство работы с функциями высшего порядка, лямбда-выражениями, макросами и т.д. Кроме того, Лисп обладает мощной системой макросов, что позволяет создавать сложные вычислительные системы, такие как нейронные сети, с минимальными усилиями.
Таким образом, использование Лиспа для программирования нейронных сетей может быть эффективным способом создания сложных и мощных вычислительных моделей.
В настоящее время широкое распространение получил AutoLISP – это диалект языка программирования LISP, который используется в программном обеспечении САПР AutoCAD для автоматизации задач и создания пользовательских функций и команд. AutoLISP предоставляет возможность программирования на высоком уровне, основывающегося на списочной структуре данных.
AutoLISP предоставляет программисту доступ к объектам и функциям AutoCAD, таким как точки, линии, окружности, текст, слои и т. д. С помощью AutoLISP можно обрабатывать и изменять графические объекты, создавать новые объекты, устанавливать параметры и выполнять другие операции с чертежами AutoCAD.
Программы на AutoLISP могут быть записаны в текстовом редакторе и загружены в AutoCAD, где они могут быть выполнены с помощью встроенного интерпретатора Lisp. AutoLISP также поддерживает использование переменных, условных выражений, циклов и других конструкций языка для создания более сложных программ и скриптов.
AutoLISP в различной степени используется во многих приложениях Autodesk, таких как AutoCAD, Revit, Inventor и др. Расширение файлов программ AutoLISP – .lsp или .fas.
В языке Автолисп (версия 10) определены около 150 различных операций, которые называются встроенными функциями.
По назначению их можно подразделить на функции:
- для работы с числовыми данными, реализующие шесть арифметических операций, а также наиболее часто используемые математические функции. Эти функции позволяют вычислять координаты примитивов, рассчитывать длины, площади и т.п.
- для проверки выполнения различных условий: операции сравнения, булевские функции (“и”, “или”, “не”) и др., а также функции, организующие ветвления по условиям. С помощью этих функций можно, например, получать топологически различные чертежи из одной программы;
- для работы со строками текстов: формирование, сцепление, сравнение строк, выделение символов из строки и т.п. Эти функции позволяют, например, формировать технические требования на чертеже путем совмещения переменной и постоянной частей.
- для ввода с клавиатуры, устройств указания, и вывода на экран и принтер, с помощью которых реализуется диалог пользователя с программой. Вывод на принтер позволяет получать из программы текстовые документы, например, спецификацию по сборочному чертежу;
- для создания и чтения текстовых файлов на магнитных дисках, благодаря чему обеспечивается возможность связи по данным между различными программами на Автолиспе, а также между программой на Автолиспе и программами на других языках. Например, в программу на Автолиспе в качестве параметров могут быть введены результаты расчетов из программы на языке С;
- характерные для всех языков программирования и обеспечивающие компактное описание действий в программе за счет таких конструкций, как циклы и подпрограммы;
- характерные для языков типа Лисп: создание, анализ и преобразование списков. Поскольку данные о графических объектах-примитивах и блоках представляются в виде списков, то эти функции используются для обработки внутрипрограммных описаний графических объектов.
Далее перечислены функции, определяющие специфику языка Автолисп, т.е. функции, связанные с графикой и работой в среде графического редактора ACAD:
- для внутрипрограммных геометрических построений; важнейшая из этих функций – определение точки, заданной через другую точку, угол луча и расстояние по лучу. С помощью этой функции можно формировать из программы опорные точки примитивов чертежа, задавая их параметры с помощью переменных;
- для приема геометрических данных, т.е. данных, которые могут задаваться перемещением курсора на экране: точки, угла, расстояния;
- для выделения примитивов построенного на экране чертежа и наборов примитивов, выделения и изменения характеристик примитивов и блоков, анализа и измнения системных переменных и содержимого символьных таблиц ACAD;
- для включения в программу любой команды ACAD. Причем аргументы и опции команды могут быть заданы не только из программы, но и в режиме графического диалога в точности так, как если бы эта команда выполнялась просто в редакторе ACAD.
Расширения ActiveX значительно увеличивают функциональность AutoLISP, добавляют возможности работы с файлами, реестром, а также связи с другими приложениями. Дополнительные расширения работают напрямую с объектной моделью AutoCAD посредством функций ActiveX. Впервые технология ActiveX была внедрена в AutoCAD R14.