Моя ступінь здобула ступінь когнітивної науки та штучного інтелекту. З цього моменту я мав вступ в один курс в Лісп. Я подумав, що мова цікава (як у "елегантній"), але я не дуже думав про неї, поки я не натрапив на Десяте правило Грінспуна набагато пізніше:
Будь-яка достатньо складна програма C або Fortran містить спеціальну, неофіційну, неофіційну, помилку, повільну реалізацію половини Common Lisp.
Теза Грінспуна (частково) полягала в тому, що у багатьох складних програмах є вбудовані перекладачі. Замість того, щоб перекладати інтерпретатора на мову, він припустив, що це може мати більше сенсу використовувати мову на зразок Lisp, яка вже має вбудований інтерпретатор (або компілятор).
У той час я працював над досить великим додатком, який виконував визначені користувачем обчислення, використовуючи спеціальний інтерпретатор для власної мови. Я вирішив спробувати переписати його ядро в Лісп як масштабний експеримент.
Минуло приблизно шість тижнів. Початковий код складав ~ 100 000 рядків Delphi (варіант Паскаля). У Ліспі це було скорочено до ~ 10000 рядків. Ще більш дивовижним було те, що двигун Lisp був у 3-6 разів швидшим. І майте на увазі, що це була робота неофіта Ліса! Весь цей досвід був для мене досить відкритим для очей; вперше я побачив можливість поєднання продуктивності та виразності однією мовою.
Через деякий час, коли я почав працювати над веб-проектом, я прослухав декілька мов. Я включив Lisp і Scheme в суміш. Врешті-решт я вибрав реалізацію схеми - Chez Scheme . Я був дуже задоволений результатами.
Веб-проект - це високоефективний "механізм відбору" . Ми використовуємо схему різними способами, від обробки даних до запитів даних до генерації сторінки. У багатьох місцях ми насправді почали з іншої мови, але перейшли до схеми з причин, які я коротко опишу нижче.
Тепер я можу відповісти на ваше запитання (принаймні частково).
Під час прослуховування ми розглянули різноманітні реалізації Lisp та Scheme. З боку Lisp ми розглянули (я вважаю) Allegro CL, CMUCL, SBCL та LispWorks. З боку схеми ми розглянули (я вважаю) Біглу, Курку, Шез, Гамбіт. (Вибір мови був давно; тому я трохи туманний. Я можу викопати нотатки, якщо це важливо.)
Одразу ж ми шукали: а) рідні теми та б) підтримку Linux, Mac та Windows. Ці дві комбіновані умови вибили всіх, але (я думаю) Аллегро та Шез - тому, щоб продовжити оцінку, нам довелося послабити вимогу багаторізкових ниток.
Ми зібрали набір невеликих програм і використали їх для оцінки та тестування. Це виявило низку питань. Наприклад: у деяких реалізаціях були дефекти, які заважали запускати деякі тести до завершення; деякі реалізації не могли скласти код під час виконання; деякі реалізації не змогли легко інтегрувати компільований під час складання код із попередньо складеним кодом; в деяких реалізаціях були сміттєзбірники, які були явно кращими (або явно гіршими), ніж інші; тощо.
Для наших потреб лише три комерційні реалізації - Allegro, Chez та Lispworks - пройшли наші основні тести. З трьох лише Chez пройшов усі випробування літаючими фарбами. На той час я думаю, що Lispworks не мав натільних потоків на будь-якій платформі (я думаю, що вони зараз є), і я думаю, що в Allegro були лише рідні теми на деяких платформах. Крім того, компанія Allegro мала плату за ліцензію на час "зателефонуйте нам", що мені не дуже сподобалось. Я вважаю, що у Lispworks не було плати за час роботи, і Chez мав прямий (і дуже розумний) домовленість (і він запускався лише тоді, коли ви використовували компілятор під час виконання).
Отримавши кілька значних фрагментів коду як у Lisp, так і в Scheme, ось деякі порівняльні та контрастні точки:
Середовища Lisp набагато зріліші. Ви отримаєте набагато більше грошей на долар. (Сказавши це, більше коду також прирівнюється до більшої кількості помилок.)
Середовища Lisp набагато складніше вивчити. Вам потрібно набагато більше часу, щоб стати досвідченим; Звичайний Lisp - це величезна мова - і це ще до того, як потрапити до бібліотек, які комерційні реалізації додають поверх нього. (Сказавши це, синтаксисний випадок схеми набагато тонкіший і складніший, ніж будь-яка річ у Ліспі.)
У середовищах Lisp може бути дещо складніше виробляти бінарні файли. Вам потрібно "струсити" зображення, щоб видалити непотрібні біти, і якщо ви не будете правильно виконувати програму під час цього процесу, ви згодом можете отримати помилки під час виконання. . Навпаки, з Chez ми складаємо файл верхнього рівня, який включає всі інші необхідні йому файли, і ми закінчили.
Я говорив перед тим, що ми закінчилися використовувати схему в ряді місць, в яких ми спочатку не мали наміру. Чому? Я можу придумати три причини з верху голови.
По-перше, ми навчилися довіряти Chez (та його розробнику, Cadence). Ми багато просили у інструменту, і він послідовно постачав. Наприклад, Chez історично мав тривіально малу кількість дефектів, і його менеджер пам'яті був дуже, дуже хорошим.
По-друге, ми навчилися любити виставу, яку ми отримали від Chez. Ми використовували щось, що було схоже на мову сценаріїв - і ми отримували від цього швидкість нативного коду. Для деяких речей, які не мали значення - але це ніколи не шкодило, а іноді це дуже допомагало.
По-третє, ми навчилися любити схему абстрагування, яку може надати. Я маю на увазі не просто макроси; Я маю на увазі такі речі, як закриття, лямбдахи, виклики хвостів тощо. Після того, як ви почнете думати в цих термінах, інші мови здаються досить обмеженими порівняно.
Чи ідеальна схема? Немає; це компроміс. По-перше, це дозволяє окремим розробникам бути ефективнішими - але розробникам складніше копіювати код один одного, тому що в схемі відсутні покажчики більшості мов (наприклад, для циклів) (наприклад, мільйон способів зробити a для петлі). По-друге, існує набагато менший пул розробників, з якими можна поговорити, найняти, взяти позики тощо.
Підсумовуючи це, я думаю, що я б сказав: Lisp і Scheme пропонують деякі можливості, широко не доступні ніде. Ця здатність є компромісною, тому краще бути такою, яка має сенс у вашому конкретному випадку. У нашому випадку визначальні фактори між тим, чи потрібно переходити з Lisp чи Scheme, мали більше спільного з дуже фундаментальними особливостями (підтримка платформи, потоки платформи, компіляція часу, ліцензування виконання), ніж з мовою чи функціями бібліотеки. Знову ж таки, у нашому випадку це теж було компромісом: з Chez ми отримали основні функції, які ми хотіли, але ми втратили великі бібліотеки, котрі мали комерційні середовища Lisp.
Крім того, лише ще раз: ми давно розглядали різні Lisps та Schemes; всі вони розвивалися і вдосконалювалися з тих пір.