私の学部の学位は認知科学と人工知能でした。それから、Lispの1コースのイントロがありました。この言語は(「エレガント」のように)おもしろいと思っていましたが、Greenspunの第10規則に出くわすまではあまり考えませんでした。
十分に複雑なCまたはFortranプログラムには、Common Lispの半分の、アドホックで、非公式に指定され、バグに乗った、遅い実装が含まれています。
Greenspunのポイントは、(部分的に)多くの複雑なプログラムに組み込みのインタープリターがあることでした。インタプリタを言語に組み込むのではなく、すでにインタプリタ(またはコンパイラ)が組み込まれているLispのような言語を使用する方が意味があるかもしれないと提案しました。
当時私は、カスタム言語のカスタムインタープリターを使用してユーザー定義の計算を実行するかなり大きなアプリで作業していました。大規模な実験として、Lispでコアを書き直すことにしました。
およそ6週間かかりました。元のコードは、〜100,000行のDelphi(Pascalバリアント)です。Lispでは、これは〜10,000行に削減されました。しかし、さらに驚くべきことは、Lispエンジンが3〜6倍高速だったという事実です。そして、これはLisp初心者の仕事だということを覚えておいてください!その経験全体は私にとって非常に目を見張るものでした。パフォーマンスと表現力を単一の言語で組み合わせる可能性を初めて見ました。
しばらくして、Webベースのプロジェクトに取り組み始めたとき、いくつかの言語を試聴しました。LispとSchemeをミックスに含めました。最終的に、Schemeの実装(Chez Scheme)を選択しました。結果にとても満足しています。
Webベースのプロジェクトは、高性能の「選択エンジン」です。Schemeは、データの処理からデータのクエリ、ページ生成まで、さまざまな方法で使用します。多くの場所で、実際には別の言語で始めましたが、以下で簡単に説明する理由でSchemeに移行しました。
これで(少なくとも部分的に)あなたの質問に答えることができます。
オーディションでは、さまざまなLispおよびSchemeの実装を調べました。Lisp側では、Allegro CL、CMUCL、SBCL、およびLispWorksを(私は信じています)見ました。Scheme側では、Bigloo、Chicken、Chez、Gambitを(私は信じています)見ました。(言語の選択はかなり前のことでした。だから私は少しmんでいます。重要な場合はメモを掘り当てることができます。)
すぐに、a)ネイティブスレッドとb)Linux、Mac、およびWindowsのサポートを探していました。これらの2つの条件を組み合わせることで、全員がノックアウトされましたが、AllegroとChezは除外されました。したがって、評価を続けるためには、マルチスレッド要件を緩和する必要がありました。
一連の小さなプログラムをまとめて、評価とテストに使用しました。それは多くの問題を明らかにしました。たとえば、一部の実装には、一部のテストの実行が完了するのを妨げる欠陥がありました。一部の実装は実行時にコードをコンパイルできませんでした。一部の実装では、実行時にコンパイルされたコードとプリコンパイルされたコードを簡単に統合できませんでした。一部の実装には、他のものより明らかに優れた(または明らかに悪い)ガベージコレクタがありました。等
私たちのニーズでは、3つの商用実装(Allegro、Chez、Lispworks)のみが主要なテストに合格しました。3人のうち、Chezだけがすべてのテストに合格しました。当時、私はLispworksがどのプラットフォームにもネイティブスレッドを持っていなかったと思うし(現在はそうだと思う)、Allegroは一部のプラットフォームにのみネイティブスレッドを持っていると思う。さらに、Allegroには「電話してください」という実行時ライセンス料がありましたが、これはあまり好きではありませんでした。Lispworksにはランタイム料金がなく、Chezには簡単な(そして非常に合理的な)取り決めがあったと思います(そして、ランタイムにコンパイラーを使用した場合にのみ作動しました)。
LispとSchemeの両方でやや重要なコードの塊を生成したのは、比較と対照のポイントです。
Lisp環境ははるかに成熟しています。あなたは金のためにより多くの強打を得ます。(とはいえ、コードが増えるとバグも増えます。)
Lisp環境を学ぶのははるかに困難です。熟達するにはもっと時間が必要です。Common Lispは巨大な言語であり、商用実装がその上に追加するライブラリに到達する前です。(とはいえ、Schemeの構文ケースは、Lispのどの1つよりもはるかに微妙で複雑です。)
Lisp環境では、バイナリを生成するのが多少難しくなる可能性があります。不要なビットを削除するには、イメージを「振る」必要があります。 。対照的に、Chezでは、必要な他のすべてのファイルを含むトップレベルファイルをコンパイルし、完了です。
以前に、当初は意図していなかった多くの場所でSchemeを使用することになったと言いました。どうして?頭の上の3つの理由を考えることができます。
まず、Chez(およびその開発者であるCadence)を信頼することを学びました。ツールから多くのことを尋ねたところ、一貫して配信されました。たとえば、Chezの歴史的な欠陥はごくわずかですが、そのメモリマネージャは非常に優れています。
次に、Chezから得たパフォーマンスを愛することを学びました。スクリプト言語のように感じられるものを使用していましたが、それからネイティブコードの速度が得られました。重要ではないものもありますが、けがをすることはなく、時には非常に多くの助けになりました。
第三に、Schemeが提供できる抽象化を愛することを学びました。ところで、マクロを意味するだけではありません。私はクロージャー、ラムダ、テールコールなどのようなものを意味します。これらの用語で考え始めると、他の言語は比較によってかなり制限されているように見えます。
Schemeは完璧ですか?番号; それはトレードオフです。まず、個々の開発者がより効果的になることを可能にしますが、ほとんどの言語が持っている標識(forループなど)がSchemeにないため、開発者が互いのコードを理解するのがより困難になります(たとえば、百万通りの方法があります) forループ)。第二に、話をしたり、雇用したり、借りたりする開発者のプールがはるかに少ない。
まとめると、LispとSchemeは他のどこでも広く利用できない機能を提供していると思います。その機能はトレードオフであるため、特定のケースで意味のあるものであることが望ましいです。私たちの場合、LispとSchemeのどちらを使用するかを決定する要因は、言語やライブラリの機能よりも非常に基本的な機能(プラットフォームサポート、プラットフォームスレッド、ランタイムコンパイル、ランタイムライセンス)に関係していました。繰り返しますが、この場合もトレードオフでした。Chezを使用すると、必要なコア機能が得られましたが、商用Lisp環境にあった広範なライブラリが失われました。
また、繰り返しになりますが、私たちはずっと前にさまざまなLispとSchemeを見てきました。それ以来、すべてが進化し改善されてきました。