Введение
Лисп — второй по старшинству из ныне живых высокоуровневых языков программирования (после Fortran) и первый функциональный язык. Он был разработан в 1958 году и сильно изменился с тех пор, породив множество диалектов и оказав значительное влияние на развитие других языков. На данный момент наиболее известные диалекты: Common Lisp, Scheme, Racket и Clojure.
Слева: Лисп-машина в музее MIT.
Справа: Лисп-машина Symbolics 3640, фото Michael L. Umbricht и Carl R. Friend (Retro-Computing Society of RI)
Лисп стал “первооткрывателем” многих идей, нашедших применение в современных языках программирования: древовидные структуры, динамическая типизация, функции высшего порядка и многое другое. В этом посте мы не будем углубляться во вклад Лиспа в теорию, а сосредоточимся на практической пользе.
Изначально Лисп предназначался для работ в области искусственного интеллекта, в частности как представление математической нотации для символьных вычислений. Но насколько широко диалекты Лиспа используются сейчас и в каких областях применяются?
Мы в Typeable любим и применяем функциональное программирование, а влияние Лиспа на функциональные языки всё ещё сильно, поэтому нам стало интересно разобраться в этом вопросе.
Кто и что пишет на Лиспе?
Во время учёбы мне часто приходилось иметь дело с диалектами Лиспа. Проведя поиск информации при подготовке этой статьи, я была приятно удивлена, когда находила упоминание кода на том или ином диалекте Лиспа в приложениях, которыми пользуюсь сама. Думаю, и вы найдёте знакомые названия в этом списке.
- GNU Emacs — текстовый редактор, разработанный Ричардом Столлманом в 1984 году, первая программа проекта GNU, участник вечной битвы за звание лучшего текстового редактора. Написан по большей части на своём собственном диалекте Лиспа, Emacs Lisp. На нём же пользователи пишут конфиги и расширения для Emacs. Хотя этот диалект и может использоваться как скриптовый язык общего назначения, он всё же заточен под разработку текстового редактора: например, в Emacs Lisp есть мощная библиотека для работы с текстовыми файлами.
- Grammarly — онлайн-сервис для проверки текстов на английском языке. Сервис использует искусственный интеллект для анализа текста и формирования советов по его улучшению. Проверяется не только грамматика и орфография, но и лаконичность, словарный запас и тон текста. Разработка началась в 2009 году, сейчас у сервиса 30 миллионов активных пользователей ежедневно, он регулярно попадает в различные рейтинги. Я сама использую Grammarly как расширение для браузера, и неожиданно для меня оказалось, что весь их бэкенд, вся работа с обработкой текстов, написана на Common Lisp. Разработчики поделились в своём техническом блоге, почему они выбрали CL и каково это — Лисп в современном продакшене: https://www.grammarly.com/blog/engineering/running-lisp-in-production/
- В Boeing 747 и 777 используется Allegro NFS Server (сервер, использующий протокол сетевого доступа к файловым системам, NFS), написанный на Common Lisp. Продолжая тему авиации: Boeing и Airbus используют Piano — пакет программ на Common Lisp для разработки и анализа конструкции воздушного судна. Узнать больше о низкоуровневой разработке на Common Lisp можно из этого доклада: https://youtu.be/S7nEZ3TuFpA
- ITA Software — некогда отдельная компания, разработавшая систему поиска и расчёта цен авиабилетов, а сейчас — часть подразделения Google, отвечающего за индустрию туризма. Для разработки своего ПО компания по большей части использует Common Lisp.
- Ещё одно применение в области транспорта — Лондонское метро, которое использует ПО от португальской компании Siscog, в которой основной язык разработки — Common Lisp. Компания разрабатывает системы поддержки принятия решений для планирования, распределения и управления ресурсами при транспортировке.
- Circle CI — одна из крупнейших и, вероятно, самых известных платформ для CI/CD с миллионами билдов ежемесячно и прочей впечатляющей статистикой, которую можно посмотреть у них на сайте. Большая часть написана на Clojure, кроме того, на фронтенде используется ClojureScript. Вообще, Clojure полюбился разработчикам настолько, что в 2021 году занял второе место среди любимых технологий пользователей Stack Overflow, согласно их ежегодному опросу (https://insights.stackoverflow.com/survey/2021#technology-most-loved-dreaded-and-wanted).
- В системах автоматизированного проектирования работ AutoCAD используется диалект AutoLISP как внутренний язык разработки приложений. Хотя AutoLISP — самый старый из внутренних языков программирования в AutoCAD, он активно поддерживается и доступен для разработки в других CAD-системах (Bricscad, IntelliCAD, DraftSight).
- Apache Storm — распределенный инструмент обработки больших объёмов данных в реальном времени. Проект реализован на Clojure и Java, и был выложен в открытый доступ под лицензией Apache License 2.0 после того, как его выкупил Twitter. Интероперабельность с Java — главная особенность Clojure, позволяющая интегрировать код на нём в любой проект, написанный на Java.
- Riemann — инструмент для мониторинга распределённых систем. Он агрегирует события с серверов и приложений пользователей, объединяет их в поток и передаёт для дальнейшей обработки или хранения. Riemann отличается от других подобных систем гораздо большей гибкостью и отказоустойчивостью. А ещё он написан на Clojure чуть менее, чем полностью. Код доступен на GitHub и распространяется под лицензией Eclipse Public License 1.0.
- Новостной сайт Hacker News был разработан как проект компании Y Combinator и написан на языке Arc. Это диалект Лиспа, реализация которого сделана на Racket. Автор сайта, Пол Грэм, также принимал участие в разработке этого языка и, как видим, нашёл ему практическое применение. Одной из целей было формирование сообщества, похожего на то, которое было на Reddit в начале его существования (тогда он, внезапно, был написан на Common Lisp, пока в 2005 году его не перенесли на Python).
Заключение
Я попыталась включить в список примеры из разных прикладных областей, инструменты для разработчиков, готовые приложения для нетехнических пользователей и системы, входящие в состав того, чем регулярно пользуется довольно большое число людей, даже не задумываясь об этом.
Конечно, это список не полный, здесь выделены наиболее интересные на мой субъективный взгляд применения Лиспа в современном ПО. Более полные списки библиотек, готовых приложений и компаний, использующих диалекты Лиспа, можно посмотреть в следующих ресурсах:
- Clojure:
- Common Lisp
- Scheme/Racket
Рассказывайте в комментариях, какие программы на Лиспах используете и делитесь своими pet-проектами!
Вам также может понравиться:
- Как мы выбираем языки программирования в Typeable
- Сильные стороны функционального программирования
- Зачем мы транспилируем Haskell в JavaScript
- 7 полезных инструментов на Haskell
Версия на английском языке: https://typeable.io/blog/2021-10-04-lisp-usage.html
Комментарии (48)
skotjuko
04.10.2021 22:26+5У меня диплом в институте был сделан на AutoLISP под Автокадом. Ужас-ужасный: бесконечные скобки и ограничения на размер памяти.
sergey-gornostaev
04.10.2021 23:26+2В Nubank все системы написаны на Clojure. В Сбере есть проекты на Clojure. Графовая СУБД Datomic написана на Clojure.
SergioShpadi
05.10.2021 00:10Считается, что LISP - это язык Бога.
Программируя на нем прекрасно понимаешь, почему так говорят.
У меня есть пет-проект под названием Una: LISP-подобный язык на платформе JavaScript: https://una-language.com/
Druj
05.10.2021 10:02+1Программируя на нем прекрасно понимаешь, почему так говорят.
Можете раскрыть мысль? Недавно пробовал пописать на Racket для общего развития и опыт вышел, мягко скажу, неудачный. Слишком высокий порог входа без видимых плюсов, отложил в сторону так как не понял чем он вдруг станет интересен после глубокого изучения. И я не против «особенных» языков, OCaml, например, оставил только положительные впечатленияSergioShpadi
05.10.2021 10:25LISP основан на лямбда-исчислении и при правильной композиции функций код выходит лаконичным, мощным и красивым. Особенно "приближает к Богу" реализация чисел Чёрча и всей математики поверх них на лиспе. Если хотите понять красоту лиспа попробуйте пройти книгу "Structure and Interpretation of computer programs".
aelaa
05.10.2021 11:47-5Интересно слышать о пороге входа в язык, в котором "нет синтаксиса"(с). Ну, фактически есть 3 синтаксических правила. Можно подробнее, что вкладывается в это понятие?
Yoel
21.10.2021 04:47+2Макросы. В принципе они очень простые, что в CL, что в Racket, что в Clojure, но для глубокого понимания нужно их годами изучать. Я лично знаю довольно плохо, а есть примеры высшего пилотажа, которые выглядят как колдовство 10000-го уровня.
Синтаксиса как бы нет, но у функций масса параметров в определенном порядке, а для приличного программирования надо соображать, как, где и что оптимально использовать. В любом языке главное это, а не синтаксис. Он везде более менее простой. В Прологе, например, тоже можно свести к 3-4 правилам, но от этого переход с C на Пролог проще не становится.
Racket - это метаязык, в котором реализован и Алгол, и всякие специфические языки. Это площадка для опытов с экспериментальным синтаксисом. Скажем, можете там по приколу написать Бейсик. Базовый язык там Scheme, на на нем столько там всего наворочено, что легко запутаться. Собственно, Racket - это вообще не язык, но нагромождение всякой всячины, написанной годами на Scheme. Есть там, например, язык презентаций, что-то вроде игрушки по мотивам PowerPoint. Я как-то пытался создать там презентацию. Обычно пользуюсь для этого LibreOffice. Оказалось, что это какой-то недоделанный малопонятный проект. В Racket напихано много такого. Это все равно, что одновременно изучать нормальный Лисп (Scheme), Пролог (вставлена там недоделанная лиспообразная версия), SQL, SDL для 3-мерной графики и много, много прочего. И особенно "радует" отсутствие человеческой документации. Если человек не знаком вообще ни с каким Лиспом, как он поймет код этих нагромождений?
DarkEld3r
15.11.2021 20:50Если человек не знаком вообще ни с каким Лиспом, как он поймет код этих нагромождений?
Так ведь если человек не знаком ни с каким С-подобным языком, то он точно так же не поймёт псевдокод, который большинство программистов легко прочитает.
Yoel
21.10.2021 04:25-1В Racket имеет смысл практиковаться в написании кода на обычном Scheme. Во всяких напридуманных там языках, я бы сказал, не высокий порог входа, но чертовски плохая документация. В значительной мере, если не большей частью, вообще никакая. А в режиме Scheme подходит и 8-летним детям, чтобы "черепашкой" рисовать, как в Лого.
alex-khv
05.10.2021 00:53+2Какой второй смысл вкладывался в название языка ? Ведь lisp - переводится как "шепелявить"
Filipp42
05.10.2021 06:57Предполагалось, что это LISt Processing.
alex-khv
05.10.2021 09:42Почему не LisPro, LP, LPro а именно готовое слово lisp ?
Filipp42
05.10.2021 17:18+1Ну… Это нужно спрашивать у тех, кто создавал язык. Не знаю, много ли осталось в живых, боюсь, абсолютное большинство уже умерло. Но можно попробовать обратиться к Полу Грэму, контакты можно найти на его сайте, может он и подскажет, он разбирается.
Danik-ik
06.10.2021 07:23+1А почему в unix постоянно используются команды "кошка", "человек"? Которые совсем не про человека или кошку.
"Это я шалю, ну, то есть, балуюсь!" ©
schulzr
05.10.2021 01:43+2Skill - диалект лиспа. Бедные инженеры микроэлектронщики вынуждены на нем разговаривать :)
https://en.wikipedia.org/wiki/Cadence_SKILL
Praksitel
05.10.2021 03:37+3Интересно было бы узнать, какие преимущества у этих систем по сравнению с вариантом, если бы та же функциональность была написана на чём-то ещё.
GospodinKolhoznik
05.10.2021 09:43+5Если бы емакс конфигурировался не лиспом, а питоном, количество его пользователей сейчас было бы побольше.
event1
05.10.2021 15:28+1Во-первых, питон стал подходящим для таких дел лет через 20 после появления емакса. Соответственно, все 100500 плагинов надо было бы кому-то переносить. Во-вторых, где же эти мощные и замечательные редакторы с конфигурацией на питоне? В известном списке, насколько я знаю, только Sublime одновременно популярнее емакса и поддерживает плагины на питоне. И то, там по-ходу нельзя писать функции прямо в конфигурации
Wolf4D
05.10.2021 06:34+3LISP использовался в качестве скриптового языка в играх Abuse и Crash Bandicoot. Причём в случае с первой - на это я наткнулся самостоятельно, когда в юности решил залезть в ресурсы игры. Игра была написана в 1996 г крошечным коллективом (чуть ли не парой студентов), и я до сих пор восхищён тем, что под капотом живёт самописный интерпретатор LISP, позволявший сделать из сайд-скроллера хоть пинбол (один из модов, поставляемых самими авторами в качестве примера).
gelerum
05.10.2021 09:18+3Жду подобных статей о других языках
fierce-katie Автор
05.10.2021 11:35+2Скоро будет как минимум ещё одна
kamilgarey
05.10.2021 16:42А будут ли статьи по экспертным системам, где list не используется?
fierce-katie Автор
05.10.2021 17:23+3Про экспертные системы писать не планировали, но хотим сделать серию постов, похожих на этот, про разные "экзотические" языки программирования. В том числе речь зайдёт о Прологе.
belch84
05.10.2021 10:03В Boeing 747 и 777 используется Allegro NFS Server (сервер, использующий протокол сетевого доступа к файловым системам, NFS), написанный на Common Lisp.
Хорошо хоть, что не в Boeing 737 MAXfierce-katie Автор
06.10.2021 10:51+1Там, оказывается, Clojure: https://www.youtube.com/watch?v=iUC7noGU1mQ&ab_channel=ClojureTV
prefrontalCortex
05.10.2021 11:50+4делитесь своими pet-проектами!
Раз вы просите :) На досуге делаю клон Diablo 2 на Common Lisp и периодически стримлю процесс: движок, технодёмка, twitch.
По поводу компаний, использующих лиспы - имел удовольствие поработать в испанской конторе RavenPack, делающей автоматический анализ финансовых новостей на Common Lisp, было очень круто.
gunGarave
06.10.2021 10:04+2Из лиспов очень используемым можно назвать Clojure. Вот тут можно найти кто его использует (https://clojure.org/community/companies).
Из реализаций, что я щупал (Clojure, ABCL, Cawa, SBCL, Racket, Guile) мне Clojure показался наиболее применим с практической точки зрения. У него много плюсов, есть особенности направленные именно на стабильность и использование в enterprise.
На самом деле Lisp как язык оброс массой мифов. Начиная от его "инопланетного синтаксиса", до того что он является "серебряной пулей". Что Lisp мёртв, на самом деле - такой же миф. Используются как прямые потомки Lisp (Scheme, Racket, Clojure, Common Lisp, PicoLisp, etc), так и его производные (применяемый везде JS - это Scheme с синтаксисом похожим на Java).
Проблема любого Lisp в том, что у него нет сильного маркетинга и он не примитивный. С одной стороны любой Lisp - это просто инструмент, который стабильно работает и даёт возможность получать предсказуемый и стабильный результат. С другой - он открывает возможности вместе с квалификацией и потребностями разработчика. Именно вариативность и не даёт его отдать куче джунов (как тот же Python) и ждать, что они сделают что-то вменяемое без сильного лида. А это уже не подход современного рынка.
Yoel
21.10.2021 05:14-1Вы три разных языка перечислили: Common Lisp, Scheme и Clojure, под разными платформами.
1. ABCL - тормозная глюковатая версия Common Lisp, работающая под Джавой. Не вполне совместим, как быстро выясняется, с хорошо известными реализациями CL. Создан, наверное, чтобы легко портировать код, поскольку работает в Java. Морально устарел еще в процессе создания. :)
2. Kawa - Scheme под Джавой. Удобен для написания умных скриптов для сцепления кусков кода для Джавы, вряд ли для чего-либо другого.
3. Racket - всякая всячина, написанная годами сотнями студентов на Scheme. Вообще не язык в нормальном смысле, но площадка для игр по созданию своих языков (как правило, глючных и недоделанных).
4. Guile - шустрый Scheme. Годится для скриптов и вставления в код, написанный на C/C++. Для этого и предназначен, а не как полноценный самостоятельный язык.
5. Clojure - отличный современный Лисп, но увязанный тоже с Java и несколько отличающийся от CL. Есть урезанная версия под Javascript, но я ничего толком о ней сказать не могу.
6. SBCL - лучшая из бесплатных реализаций CL, практически ничем не хуже распиаренных дорогих LispWorks и Allegro Lisp. Очень быстрый, примерно как C++, если разбираться в оптимизации и использовать массивы вместо списков, содержит даже ассемблер, когда нужна предельная скорость. Помимо стандартного CL, там множество специфического для каждой архитектуры, включая ARM. Я его и на телефоне часто запускаю. Недостатки: много глючных и устаревших библиотек, авторы которых зачастую думают: а что, человек прочитает код и сам допишет. Встречался с таким не раз на американских форумах. А так, я его и в качестве калькулятора использую. Очень удобно. Есть еще CCL (Closure Common Lisp, не путать с Clojure). Раза в два помедленней, заточен больше для Маков, но тоже хороший.
Svetlyak
13.10.2021 23:16+3Я на Common Lisp пилю аналог питоновского PyPi: https://ultralisp.org. Это хостинг для более чем тысячи CL библиотек, куда можно в несколько кликов добавлять новые прямо с GitHub.
Ну и ещё есть на гитхабе десятки небольших CL библиотек в организации https://github.com/40ants/, если конечно можно считать их pet-прожектами.
Yoel
21.10.2021 05:18О, вот это интересно! Т.е. не нужно просить авторов Quicklisp, чтобы добавить туда свой проект?
Svetlyak
21.10.2021 10:34+1Да именно так.
Более того, Ultralisp автоматически настраивает вебхук в проекте на GitHub, и собирает новую версию диста, как только ты запушишь изменения.
А ещё, в нём можно делать свои "дисты". Например ты в такой дист можешь включить форки каких-то библиотек, которые нужны только тебе. В общем дисте они не будут видны.
К примеру, в такой дист я начал собирать расширения для Lispworks: https://ultralisp.org/dists/lispworks В Quicklisp их в принципе не включат, потому что туда включают только проекты, которые компилируются под SBCL.
Svetlyak
21.10.2021 10:36+1Да, забыл сказать. С недавних пор Ultralisp поддерживает не только формат метаданных Quicklisp, но и CLPI. CLPI, это альтернатива Quicklisp, формат данных используемый в Common Lisp Package Manager (https://www.clpm.dev/)
Yoel
21.10.2021 05:25Еще интересная вещь: Hy, Лисп для Питона, т.е. по сути Питон, но с синтаксисом, макросами и прочими фишками Лиспа. Пока альфа-версия, но вполне работает.
А вот такое же примерно для Erlang.
Несколько урезанный Scheme встроен также в Gimp. Удобно писать скрипты для автоматического преобразования кучи картинок по какому-то алгоритму, и т.п.
Yoel
21.10.2021 05:38Еще две копейки. Где-то есть эмуляторы как минимум двух старых исторических Лисп-машин с их родной операционной системой. Мне удавалось их запускать ради интереса на Линуксе, но не помню уже, где они валяются и как запускаются. Довольно много было возни с настройками.
Еще также коммерческий эмулятор последней (кажется?) Лисп-машины с ОС Genera 2.0. Вот тут инструкции по его настройке:
https://archives.loomcom.com/genera/genera-install.html
Вполне работает. Можете какое-нибудь старье превратить таким образом в сервер на Лисп-машине!
zloddey
А ещё на clojure написан мой (чуть менее чем бесполезный) пет-проект!
Lisp со всеми его диалектами прекрасен, но мало под него умельцев находится, увы...
Кстати, ещё один проект можно тут упомянуть - Guix. Он хоть и необычен, но достаточно интересный - и опенсорсный при этом.
fierce-katie Автор
Спасибо за ссылку! Всё не удалось вместить в пост, чтобы он не разросся в скучный лонгрид, но мы планируем продолжать тему с обзором инструментов на функциональных языках.
deem0n
Вот ещё пара относительно живых проектов:
pgloader (Common Lisp) - загрузчик данных в PostgreSQL
babashka (Clojure) - скриптовый язык, на замену Bash
fierce-katie Автор
Отличное название у языка :D Спасибо за ссылки!
Yoel
Это не на смену bash, а чтобы писать шелл прямо в REPL. Не совсем понятно, зачем это вообще нужно, если можно просто запускать bash из Java-машины.
deem0n
Наличие REPL никак не отменяет возможности писать скрипты и однострочники на Clojure:
$ bb -Xmx10m -e '(io/copy (:body (curl/get "http://ipv4.download.thinkbroadband.com/200MB.zip" {:as :stream})) (io/file "/tmp/200mb.zip"))'
На Clojure скрипты писать довольно неудобно, время запуска JVM в несколько секунд делает это бессмысленным. А вот babashka запускается очень быстро.