Как стать автором
Обновить

Разработка web-приложений на языке Common Lisp (часть первая)

Время на прочтение 4 мин
Количество просмотров 8.7K
Данный обзор является небольшим путеводителем для тех, решился (или решается) доверить этому чудесному языку будущее своего стартапа. Несмотря на то, что основной акцент будет ставиться на web-разработке, я постараюсь осветить также и более общие темы, так или иначе связанные с Common Lisp. Материал почерпнут из собственного опыта разработки web-сервиса AlterMoby.

Первая часть этого обзора будет вводной. Опытные лисперы смогут смело его пропускать. В этой части я попробую объяснить, когда стоит использовать Lisp, и какая его реализация лучше подойдёт для построения web-приложений. Последнее, конечно, отразит лишь мою субъективную точку зрения.

image

Когда стоит использовать Lisp

Многие современные web-ориентированные языки имеют в своём арсенале многое из того, что когда-то принадлежало исключительно языку Lisp (к таким вещам, прежде всего, относятся анонимные функции и функционалы). Поэтому, используя Lisp для создания типичных web-приложений, вы, скорее всего, не почувствуете больших преимуществ по сравнению с теми же PHP, Python или Ruby. Скорее даже наоборот, поскольку Lisp-сообщество достаточно небольшое, и вам будет труднее найти готовое решение. Однако у Lisp есть одна ключевая особенность, которая может поднять абстракцию на уровень, недостижимый для любого другого языка. Я говорю о возможностях программы строить и запускать другую программу в процессе своего выполнения (или компиляции), т.е., о метапрограммировании.

Приведу игрушечный пример на Common Lisp, демонстрирующий эту возможность:

image

Этот простой код определяет функцию, строящую другую функцию с заданным числом аргументов. Последняя вычисляет их сумму. Разумеется, это надуманный пример (оператор + вычисляет сумму произвольного числа аргументов), однако он демонстрирует уникальное свойство Lisp, отличающее его от других языков. Метапрограммирование также реализуется и макросами (прошу не путать с макросами C/C++). Макросы — это те же производящие функции, но используемые не во время выполнения программы, а во время её компиляции.

Когда использование Lisp будет целесообразным в вашем проекте? Во-первых, когда реализуемое приложение должно обладать достаточно сложной семантикой, другими словами, если требуется высокая гибкость программного кода. Во-вторых, когда система строится малым числом программистов, и нецелесообразно пренебрегать автоматизацией на всех уровнях разработки (в подобных случаях неудобство малой распространённости этого языка будет перевешиваться потенциальной экономией кода). Кроме того, Lisp рекомендуется использовать для реализации web-приложений с большой нагрузкой (как это ни странно на первый взгляд). Многие современные Lisp-компиляторы генерируют машинный код, на порядок более быстрый в сравнении с теми же PHP или Python (о Ruby я вообще не говорю).

Диалект и реализация

Как известно, есть два основных диалекта Lisp: Common Lisp и Scheme. Не буду рассказывать здесь о различиях между ними (можно найти в изобилии на страницах Интернета). На мой субъективный взгляд, для написания web-приложений лучше использовать Common Lisp по следующей причине. Стандарт Scheme описывает синтаксис и семантику самого языка, игнорируя стандартные библиотеки. В итоге мы имеем изящный, но игрушечный язык с многочисленными несовместимыми друг с другом расширениями (столь необходимыми для прикладного программирования). В свою очередь Common Lisp, несмотря на свои многочисленные недостатки, чётко регламентирует большинство вещей, которые потребуются в реальном проекте. К ним, в частности, относится протокол внешних вызовов, позволяющий связываться с библиотеками, написанными на C. Поэтому Common Lisp является настоящим промышленным языком с большим количеством открытых библиотек, реализующих ту или иную функциональность.

Теперь о реализации. Качественных реализаций Common Lisp существует немало. Их можно разделить на проприетарные и свободные. К проприетарным можно отнести LispWorks и Allegro CL. Обе системы обладают широкими возможностями, но стоят немало (особенно вторая). Если вам не жалко денег, вы можете получить прекрасный продукт с качественной поддержкой. Но прежде, чем принять такое решение обратите внимание на лагерь свободных реализаций. Он содержит очень достойных представителей.

К качественным свободным реализациям относятся CLISP, SMUCL и SBCL. Первый является кроссплатформенным компилятором в байт-код. Отсюда необходимость в среде исполнения и невысокая производительность. SMUCL – качественный нативный компилятор для Unix-систем, генерирующий очень эффективный машинный код. Его недостаток в неполной поддержке стандарта и наличии множества противоречивых атавизмов (ведь проект имеет давнюю и богатую историю). SBCL является удачной попыткой реформирования SMUCL. Сохраняя общую линию преемственности, SBCL более логичен, будучи очищен от многих исторических наростов и наслоений SMUCL. К условным недостаткам обоих этих компиляторов можно причислить слабую портируемость, ограничивающую их работу лишь на Unix-системах. SBCL имеет экспериментальную поддержку Windows, но она не полноценна (в частности, нет многопоточности), так что о серьёзных проектах на этой платформе пока можно забыть.

В заключение первой части моего обзора я бы рекомендовал остановиться именно на компиляторе SBCL. Это свободный, высококачественный и постоянно развивающийся продукт, на который можно положиться в самых серьёзных проектах.
Теги:
Хабы:
+72
Комментарии 241
Комментарии Комментарии 241

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн