一方、 ほとんどのプログラマは Lispの存在を知っているでしょうが、 「やたらと括弧を使うAI用の言語」とか 「研究用には便利かもしれないが効率が悪くて実用にはならない言語」 程度の認識しか持たれていないのではないかと思われます。 Emacsで使われているEmacs Lispを除くと、 実際にLispを使っているプログラマの数は非常に少ないと思われます。
確かにLispは 括弧が多くて読みにくいですし、 長い間 自然言語処理/機械学習/推論システムなどの研究に使うための AI専用言語として広く使われていたのは事実ですが、 Lispがニッチを生き残ってきたのは AI研究に有利だからというだけの理由ではなく、 計算機言語として本質的な利点を数多く持っているからです。 インターネット/小型計算機/オープンソース などに代表される今日の計算機環境において、 Lispは新たな意味を持ちつつあります。
Lispプログラムの見かけ上の最も大きな特徴は 括弧が多いことでしょう。 CやJavaの場合は 関数定義、関数呼び出し、数式、条件式などに異なる構文を使用しますが、 Lispではすべて括弧を用いた同じ表現型式を使用するために プログラムが括弧だらけになる印象があるわけです。
Lisp | C |
---|---|
(sin phi) | sin(phi) |
(- (* a d) (* b c)) | a*d-b*c |
(if c (func)) | if(c){ func(); } |
(setq a '(1 2 3)) | int a[] = {1, 2, 3}; |
単純な構文規則をもつ言語は 処理が簡単なので処理系を作るのが楽という利点はありますが、 構文解析をサボるのが主目的でそうなっているわけではなく、 Lispではプログラムとデータが同じ構造をしている ことに起因しています。 Lispは「リスト」と呼ばれる木構造のデータ構造のみを扱い、 プログラムもデータも同じリスト構造をしています。 リストをテキストで表現する方法はいろいろ考えられますが、 括弧を多用する「S式」という記法が単純で便利なので、 若干読みにくいという問題はありますが 普通のLispシステムではS式が使用されています。
Lispではプログラムとデータの構造に区別がないため、 プログラムをデータのように扱うことができます。 たとえば、プログラムの中で新しい関数を生成してそれを呼び出したり、 関数をデータとして扱ったりすることが簡単にできます。 このような動的な性質をもつため、 Lispはインタプリタで動くのが基本となっています。
新しいリストを作ったり 様々なリスト操作を行なったりしているうちに、 それまで使っていたリスト構造が不要になることがありますが、 Lispではそれらを明示的に解放する機能は用意されておらず、 システムが自動的に回収して再利用するようになっています。 このようなゴミ集め機能もLispの大きな特徴のひとつです。
これら数多くの特徴をもつLispでは 高度なプログラム開発環境を使うことができるため、 竹内氏によれば Lispの開発効率はCの5倍にも達するのだということです。
PCのような特定の機械のアプリケーションの開発を行なう場合は OSやツールなどの環境が決まってしまっていることが多いため、 開発言語の選択の幅が限られてしまうのが普通ですが、 Webサーバの場合は どのようなマシン/言語/OSを使っているかはユーザに全く関係がないために、 最も開発効率が良いと考えられるLispを使うことができたそうです。 「普通のやつらの上を行け」には、 言語は平等ではなくレベルの上下があるとか、 低レベル言語しか知らない人間には Lispのような高レベル言語の偉さがわからない/ 最高レベルの言語を知るものだけがレベルの上下関係を俯瞰できるのだ、とか 物議をかもしそうな元気な意見が盛り沢山で楽しめます。
Schemeは1975年にMITのGuy Steele Jr.とGerald Sussmanにより開発された言語で、 関数型言語としてのLispの特長を強調した美しく小さな仕様を持っており、 MITでの計算機教育に長年使われています。 Sussmanらの教科書 「計算機プログラムの構造と解釈」[3] はプログラミング言語の深遠さを学べる名著です。 その一方で Schemeは教育言語/実験的言語にすぎないという印象もあったようですが、 現在はSchemeは数多くの実際的なプロジェクトで実用になっており、 その地位を高めつつあります。 例えば、 Schemeの実装のひとつであるGuileは GNUプロジェクトの公式スクリプト言語となっており、 多くのGNUプロジェクトで今後採用されていくようです。 SchemeでTkが使えるようにしたSTkや その後継のSTklos[4]は SchemeでGUIを操作するシステムとして有用です。
Schemeは携帯端末ですら実用になりつつあります。 たとえばPalmで使えるScheme環境の LispMe[5]では Palmのライブラリも使うことができるようになっているため、 簡単なPalmアプリケーションをSchemeで動かすことができます。
LispMeの画面
JavaでSchemeを実装することにより Javaの利点とSchemeの利点を両方利用しようという試みも 各所で研究されています。 Schemeの仕様は非常に小さなもので、 言語の基幹部分しか含んでいないために、 実アプリケーションで使用するためには LispMeやStkの場合のように ライブラリを自前で用意しなければなりませんが、 Javaと併用する場合には Javaの数多くの有用なライブラリを利用できるという利点があります。
このように、 オープンソース時代の言語として Schemeが勢いよく広まりつつあります。 Schemeの処理系は一般にそれほど大きなものではありませんし、 ほとんどがソースも含めフリーで公開されているのも ハッカーにとって嬉しいところでしょう。 Schemeに関する情報は 富山大学の木村巌さんのページ[6] に詳しく載っています。