Loading...

リスプを特別なものにしたもの

Original

2001年12月(改訂 2002年5月)

(この記事は、LL1 メーリングリストでのいくつかの質問に応じて作成されました。現在は Revenge of the Nerds に組み込まれています。)

マッカーシーが1950年代後半にリスプを設計したとき、それは既存の言語からの急激な逸脱でした。その中で最も重要なのは フォートラン でした。

リスプは9つの新しいアイデアを具現化しました:

1. 条件文。 条件文はif-then-else構造です。私たちは今やこれを当然のこととして受け入れています。これらはリスプの開発過程でマッカーシーによって発明されました。(当時のフォートランには条件付きgotoしかなく、これは基盤となるハードウェアの分岐命令に密接に基づいていました。)マッカーシーはアルゴル委員会のメンバーであり、条件文をアルゴルに取り入れ、それが他のほとんどの言語に広がりました。

2. 関数型。 リスプでは、関数は第一級オブジェクトです。整数や文字列などと同様にデータ型であり、リテラル表現を持ち、変数に格納でき、引数として渡すことができます。

3. 再帰。 再帰はもちろんリスプ以前から数学的概念として存在していましたが、リスプはそれをサポートする最初のプログラミング言語でした。(関数を第一級オブジェクトにすることによって、暗黙的に再帰が可能になります。)

4. 変数の新しい概念。 リスプでは、すべての変数は実質的にポインタです。値が型を持ち、変数は型を持たず、変数に代入またはバインドすることはポインタをコピーすることを意味し、ポインタが指すものではありません。

5. ガーベジコレクション。

6. 式で構成されたプログラム。 リスプのプログラムは、各式が値を返す式の木です。(一部のリスプでは、式が複数の値を返すことができます。)これは、フォートランやその後のほとんどの言語とは対照的で、これらの言語は式と文を区別します。

フォートランではこの区別が自然でした。なぜなら(パンチカードが入力形式であった言語では驚くことではありませんが)言語は行指向だったからです。文をネストすることはできませんでした。したがって、数学が機能するためには式が必要でしたが、他の何かが値を返す必要はありませんでした。なぜなら、それを待っているものが存在しなかったからです。

この制限はブロック構造の言語の登場とともに消えましたが、その時には手遅れでした。式と文の区別は根付いていました。それはフォートランからアルゴルに広がり、そこから両者の子孫に広がりました。

言語が完全に式で構成されている場合、式を好きなように組み合わせることができます。次のように言うことができます(Arc 構文を使用して)

(if foo (= x 1) (= x 2))

または

(= x (if foo 1 2))

7. シンボル型。 シンボルはポインタを比較することで等価性をテストできる点で文字列とは異なります。

8. シンボルの木を使用したコードの表記法。

9. 常に利用可能な全言語。 読み取り時、コンパイル時、実行時の間に実際の区別はありません。コードを読みながらコンパイルまたは実行したり、コンパイルしながらコードを読みまたは実行したり、実行時にコードを読みまたはコンパイルしたりできます。

読み取り時にコードを実行することで、ユーザーはリスプの構文を再プログラムできます。コンパイル時にコードを実行することはマクロの基礎です。実行時にコンパイルすることは、Emacsのようなプログラムでのリスプの拡張言語としての使用の基礎です。そして、実行時に読み取ることで、プログラムはs式を使用して通信できるようになります。このアイデアは最近XMLとして再発明されました。

リスプが最初に発明されたとき、これらのアイデアは1950年代後半に利用可能なハードウェアによって大きく制約された通常のプログラミング実践からは遠く離れていました。

時間が経つにつれて、人気のある言語の継承の中で具現化されたデフォルトの言語は、徐々にリスプに向かって進化してきました。1-5は現在広く普及しています。6は主流に現れ始めています。Pythonには7の形式がありますが、それに対する構文は存在しないようです。8は(9とともに)リスプのマクロを可能にするものであり、今のところリスプに特有のものです。おそらく(a)それには括弧が必要であるか、同様に悪い何かが必要であり、(b)その最終的な力の増加を追加すると、新しい言語を発明したとは主張できなくなり、単にリスプの新しい方言を設計したと主張することになるからです;-)

現代のプログラマーにとって便利である一方で、リスプを他の言語が採用したランダムな便宜の変種として説明するのは奇妙です。おそらく、マッカーシーがそれを考えた方法ではありませんでした。リスプはフォートランの間違いを修正するために設計されたわけではなく、むしろ計算を公理化する試みの副産物として生まれました。