Я получил степень бакалавра в области когнитивной науки и искусственного интеллекта. После этого у меня было введение из одного курса в Lisp. Я думал, что язык интересен (как в «элегантном»), но не особо задумывался о нем, пока не наткнулся на Десятое Правило Гринспуна гораздо позже:
Любая достаточно сложная программа на C или Fortran содержит специальную, неформально определенную, медленную реализацию половины Common Lisp.
Гринспен утверждал (частично), что многие сложные программы имеют встроенные интерпретаторы. Вместо того, чтобы встроить интерпретатор в язык, он предположил, что было бы более разумно использовать язык, подобный Лиспу, который уже имеет встроенный интерпретатор (или компилятор).
В то время я работал над довольно большим приложением, которое выполняло пользовательские вычисления с использованием специального интерпретатора для пользовательского языка. Я решил попробовать переписать его ядро на Лиспе в качестве масштабного эксперимента.
Это заняло примерно шесть недель. Оригинальный код был ~ 100 000 строк Delphi (вариант Паскаля). В Лиспе это было сокращено до ~ 10000 строк. Еще более удивительным было то, что двигатель Lisp работал в 3-6 раз быстрее. И имейте в виду, что это была работа новичка Лиспа! Весь этот опыт был довольно откровением для меня; Впервые я увидел возможность сочетать производительность и выразительность на одном языке.
Некоторое время спустя, когда я начал работать над веб-проектом, я прослушал несколько языков. Я включил в смесь Lisp и Scheme. В конце концов я выбрал реализацию схемы - схему Chez . Я был очень доволен результатами.
Веб-проект представляет собой высокопроизводительный «механизм выбора» . Мы используем Scheme разными способами, от обработки данных до запроса данных и генерации страниц. Во многих местах мы фактически начинали с другого языка, но в итоге перешли на Scheme по причинам, которые я кратко опишу ниже.
Теперь я могу ответить на ваш вопрос (хотя бы частично).
Во время прослушивания мы рассмотрели различные реализации Lisp и Scheme. Со стороны Lisp мы рассмотрели (я полагаю) Allegro CL, CMUCL, SBCL и LispWorks. Со стороны Схемы мы смотрели (я полагаю) Биглоо, Курица, Чез, Гамбит. (Выбор языка был давным-давно; поэтому я немного туманен. Я могу выкопать некоторые заметки, если это важно.)
Мы сразу искали: а) нативные темы и б) поддержку Linux, Mac и Windows. Эти два условия объединили всех, кроме (я думаю) Аллегро и Чеза - поэтому, чтобы продолжить оценку, нам пришлось ослабить требование многопоточности.
Мы собрали набор небольших программ и использовали их для оценки и тестирования. Это выявило ряд проблем. Например: некоторые реализации имели дефекты, которые мешали выполнению некоторых тестов до завершения; некоторые реализации не могут компилировать код во время выполнения; некоторые реализации не могли легко интегрировать скомпилированный код времени выполнения с предварительно скомпилированным кодом; у некоторых реализаций были сборщики мусора, которые были явно лучше (или явно хуже), чем у других; и т.п.
Для наших нужд только три коммерческие реализации - Allegro, Chez и Lispworks - прошли наши первичные испытания. Из трех только Chez прошел все тесты с летающими цветами. В то время я думал, что у Lispworks не было собственных потоков на какой-либо платформе (я думаю, что они есть сейчас), и я думаю, что у Allegro были только собственные потоки на некоторых платформах. Кроме того, у Allegro была плата за лицензию «позвони нам», что мне не очень понравилось. Я считаю, что у Lispworks не было платы за время выполнения, а у Chez была простая (и очень разумная) схема (и она вступила в силу только в том случае, если вы использовали компилятор во время выполнения).
Произведя несколько значительных кусков кода как на Лиспе, так и на Схеме, вот некоторые точки сравнения и сравнения:
Среды Лиспа гораздо более зрелые. Вы получаете намного больше за доллар. (Сказав это, больше кода также означает больше ошибок.)
Среды Лиспа гораздо сложнее изучать. Вам нужно гораздо больше времени, чтобы стать опытным; Common Lisp - это огромный язык - и это прежде, чем вы перейдете к библиотекам, которые коммерческие реализации добавляют к нему. (Сказав это, синтаксический случай Scheme гораздо более тонкий и сложный, чем любая другая вещь в Lisp.)
В средах Lisp может быть несколько сложнее создавать двоичные файлы. Вам нужно «встряхнуть» ваше изображение, чтобы удалить ненужные биты, и если вы не будете правильно выполнять свою программу во время этого процесса, вы можете позже столкнуться с ошибками во время выполнения. , Напротив, с Chez мы компилируем файл верхнего уровня, который включает в себя все остальные файлы, которые ему нужны, и мы закончили.
Я уже говорил, что в конечном итоге мы использовали Scheme во многих местах, которые мы изначально не собирались делать. Почему? Я могу думать о трех причинах из головы.
Сначала мы научились доверять Chez (и его разработчику, Cadence). Мы много просили от инструмента, и он постоянно доставлял. Например, Chez исторически имел незначительное количество дефектов, и его менеджер памяти был очень, очень хорош.
Во-вторых, мы научились любить представление, которое мы получили от Chez. Мы использовали что-то похожее на язык сценариев - и мы получили скорость нативного кода от этого. Для некоторых вещей это не имело значения - но это никогда не ранило, а иногда это очень помогало.
В-третьих, мы научились любить ту схему, которую могла предоставить абстракция. Кстати, я имею в виду не только макросы; Я имею в виду такие вещи, как замыкания, лямбды, хвостовые вызовы и т. Д. Как только вы начинаете думать в этих терминах, другие языки кажутся довольно ограниченными по сравнению.
Схема идеальна? Нет; это компромисс. Во-первых, это позволяет отдельным разработчикам быть более эффективными - но разработчикам труднее ухватиться за код друг друга, потому что в Схеме отсутствуют указатели, которые есть в большинстве языков (например, для циклов) (например, существует миллион способов сделать это). для цикла). Во-вторых, гораздо меньше разработчиков, с которыми можно общаться, брать на работу, брать кредиты и т. Д.
Подводя итог, я думаю, я бы сказал: Lisp и Scheme предлагают некоторые возможности, не так широко доступные где-либо еще. Эта возможность является компромиссом, поэтому лучше иметь такую, которая имеет смысл в вашем конкретном случае. В нашем случае определяющие факторы между тем, использовать ли Lisp или Scheme, были в большей степени связаны с очень фундаментальными функциями (поддержка платформы, потоки платформы, компиляция во время выполнения, лицензирование во время выполнения), чем с возможностями языка или библиотеки. Опять же, в нашем случае это тоже было компромиссом: с Chez мы получили основные функции, которые хотели, но мы потеряли обширные библиотеки, имеющиеся в коммерческих средах Lisp.
Также, чтобы повторить: мы смотрели на различные Лиспы и Схемы очень давно; с тех пор все они развивались и совершенствовались.