界面駭客日記(9) - 本物のプログラマはLispを使う? 増井俊之


1959年にJ. McCarthyにより開発されたプログラミング言語Lispは、 現在広く使われている言語の中では Fortranと並んで 最も古い歴史を持つもののひとつですが、 一般にはあまり知られていません。 最近は プログラマではない人でも CやJavaといった言語の存在を知っているでしょうし、 PerlやRubyのような言語も聞いたことがあるかもしれませんが、 Lispについて知っている人はほとんどいないでしょう。

一方、 ほとんどのプログラマは Lispの存在を知っているでしょうが、 「やたらと括弧を使うAI用の言語」とか 「研究用には便利かもしれないが効率が悪くて実用にはならない言語」 程度の認識しか持たれていないのではないかと思われます。 Emacsで使われているEmacs Lispを除くと、 実際にLispを使っているプログラマの数は非常に少ないと思われます。

確かにLispは 括弧が多くて読みにくいですし、 長い間 自然言語処理/機械学習/推論システムなどの研究に使うための AI専用言語として広く使われていたのは事実ですが、 Lispがニッチを生き残ってきたのは AI研究に有利だからというだけの理由ではなく、 計算機言語として本質的な利点を数多く持っているからです。 インターネット/小型計算機/オープンソース などに代表される今日の計算機環境において、 Lispは新たな意味を持ちつつあります。

Lispの特徴

電通大の竹内郁雄教授は 最近の電子通信学会論文誌の 「記号処理システムLispの展望」と題した解説論文[1] でLispの歴史や利点について詳しく解説していますが、 これにもとづいて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倍にも達するのだということです。

普通のやつらの上を行け

Lispはこのように多くの特長を持っているにもかかわらず、 見かけ上のとっつきにくさや効率の悪さのため、 一部のハッカーに人気はあったものの、 実社会のアプリケーションで使われることはほとんどありませんでした。 竹内論文でも「記号処理システム」という言葉が使われているように、 やはり特殊な言語であるという印象があるようです。 しかし 競争の非常に厳しいWebアプリケーションの世界においても、 開発にLispを使ったことが成功の原因になったと主張する 「普通のやつらの上を行け」[2] という文書が3月に発表されたことにより、 開発者の間で最近Lispががぜん注目を集めてきました。 この文書の作者のPaul Graham氏は、 オンラインストア構築サイト 「Yahoo Shop」のもととなった 「Viaweb」という会社を1995年に立ち上げた人物です。 似たようなアイデアをもつ同業他社がPerlやCでCGIを実装していたとき、 Viawebではサーバでの処理にCommon Lispを使用することにより 圧倒的な効率で開発やサポートを行なうことができたということです。 Lispで構築したシステムは、その実行中でも 関数定義などを変更することが可能であるため、 顧客からの電話で問題を指摘された場合に、 電話を切るまでの間で問題を直してしまったり、 同業他社が新機能を導入した場合などに それについて問合せが来るよりも前に 同様の機能を自社製品にも追加してしまうことなどができたそうです。

PCのような特定の機械のアプリケーションの開発を行なう場合は OSやツールなどの環境が決まってしまっていることが多いため、 開発言語の選択の幅が限られてしまうのが普通ですが、 Webサーバの場合は どのようなマシン/言語/OSを使っているかはユーザに全く関係がないために、 最も開発効率が良いと考えられるLispを使うことができたそうです。 「普通のやつらの上を行け」には、 言語は平等ではなくレベルの上下があるとか、 低レベル言語しか知らない人間には Lispのような高レベル言語の偉さがわからない/ 最高レベルの言語を知るものだけがレベルの上下関係を俯瞰できるのだ、とか 物議をかもしそうな元気な意見が盛り沢山で楽しめます。

Schemeの台頭

Viawebを含め、 商用アプリケーションでは 長年の実績のあるFranz Inc.がサポートする Common LispやCLOSが 広く使われていたようですが、 Common Lispは仕様が巨大すぎるためか、 最近のハッカーの間では Lispの方言のひとつである Scheme の方が人気があるようです。

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] に詳しく載っています。

Lispの展望

単純な仕事に関しての実行効率は LispはCや機械語にははるかに及びません。 しかし 計算機の速度やメモリ量が飛躍的に増大したことにより 各種の計算機コストよりも開発コストの方がはるかに大事に なってきているため Lispを実システムで使用する意義は充分にあります。 この傾向は今後ずっと続くはずですから、 月刊のLisp雑誌が発行されたり Lispコンファレンスが沢山の人を集めたりする時代が 近付いているのかもしれません。
  1. 竹内郁雄. 記号処理システムLispの展望. 電子情報通信学会論文誌, Vol. J84-D-I, No.6, pp.513-522, June 2001.
  2. http://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html
  3. http://www.ipl.t.u-tokyo.ac.jp/sicp/
  4. http://kaolin.unice.fr/STklos/
  5. http://www.lispme.de/lispme/
  6. http://www.sci.toyama-u.ac.jp/~iwao/Scheme/scheme.html
    Toshiyuki Masui