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

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

Этот простой код определяет функцию, строящую другую функцию с заданным числом аргументов. Последняя вычисляет их сумму. Разумеется, это надуманный пример (оператор + вычисляет сумму произвольного числа аргументов), однако он демонстрирует уникальное свойство 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. Это свободный, высококачественный и постоянно развивающийся продукт, на который можно положиться в самых серьёзных проектах.
Первая часть этого обзора будет вводной. Опытные лисперы смогут смело его пропускать. В этой части я попробую объяснить, когда стоит использовать Lisp, и какая его реализация лучше подойдёт для построения web-приложений. Последнее, конечно, отразит лишь мою субъективную точку зрения.

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

Этот простой код определяет функцию, строящую другую функцию с заданным числом аргументов. Последняя вычисляет их сумму. Разумеется, это надуманный пример (оператор + вычисляет сумму произвольного числа аргументов), однако он демонстрирует уникальное свойство 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. Это свободный, высококачественный и постоянно развивающийся продукт, на который можно положиться в самых серьёзных проектах.