2008年04月26日 17:30 [Edit]

Lispは本当に最強か?

これはある程度さまざまな言語で経験を積んだプログラマーが必ず抱く感慨なのだけど....

プログラミング言語はLispに回帰しているんだろう - ’(rubikitch wanna be (a . lisper))
せっかく最強言語のLispがありながら、おれおれ言語がどんどん登場していくさまはおもしろい。括弧が嫌いなのかな。Lispの表現力の源はS式だというのに括弧を拒否したら表現力が落ちるよなぁ…

これって果たして本当なのだろうか、ということを改めて考えてみる。


違うものは、違って見えるべきだ - Different things ought to look different

「Lisp最強」と思っている人々が、「なのに何でLispが普及しないのか」という設問に対する回答として、最近では最も多いのがこれ。Matzさんが一番使っている口上もこれだ。

プログラミング言語はLispに回帰しているんだろう - ’(rubikitch wanna be (a . lisper))
だけどLispやSchemeの高階関数に触れると「なーんだ、ブロックってただの高階関数じゃん」と思って少し落胆したが、「do〜end」が秀逸で制御構造のように見えるからやはり美しいと感じた。

オブジェクトに関しても、CLOS使いからすれば、「obj.method(message)(method obj message)も対して違わないじゃん」ということになる。Perlに至っては$obj->method($message)ともmethod $obj $messageとすら書ける(method $obj, $messageでない点に注意!カンマはなし。但し後者の例は、newを除けば推奨されてないしそもそも面倒なので使われない)。

しかし、人間の感じ方はやはり違う。「obj.method(message)の場合は、methodobjが知っている」ということが直感的にわかるのに対し、(method obj message)の場合、「総称関数(generic function)であるmethodは、複数の実装のうちもっともobjに相応しいものが選ばれる」ということになるのだが、methodを限定しているのがobjなのに、それを後で書かなければならないというのは結構な苦痛だ。drawするのはstrawなのか(くじ引き)、それともlineなのか(描画)なのか、それが先に答えておきたい問題なのだ。

値知りの値段知らず - Lisp programmers know the value of everything, but the cost of nothing.

しかしかつては、Lispの悪口として最も人気だったのはこちらの方だった。

GCは今な言語にはほぼ必ずといっていいほど備わっている。

これは裏をかえせば、LispにはLispそのものに資源管理の仕組みがないことも意味している。「Lispでmalloc()ってどうやればいいの?」って質問を、かつて受けたことがあったっけ。

こういった、「有限の資源をやりくりするにはどうしたらいいか」という設問には、Lispはかなり不向きなのではないか。

たとえば、毎月拙宅で開催されるSICP読書会で、私はこんな質問をしたことがある。「リストのみを使って、ハッシュテーブルを実現できるか?」ハッシュの機能だけであれば、答えはYESである。(key . value)というペアをリストにぶっこんでおいて線形探索すればいいのだから。しかしこれではO(n)になってしまい、ハッシュテーブルの目的である「O(1)でデータにアクセスする」にはならない。あれこれみんなで考えたあげく、出てきた答えは「おそらく不可能」であった。O(log n)であれば可能だ。二分木であればリストで実現できるので。

確かにムーアの法則のおかげで、CPUは格段に高速になり、メモリーは格段に増え、そしてコストは劇的に下がった。しかしこれらはゼロになったわけではなく、今後もゼロとはなり得ない。まだメモリーは「金で買える」だけましで、時間という資源は買うことができない。

そういうこともあって、配列(vector)とかハッシュ(hash table)とかといったものは、Lispを含め、動的言語では組み込みである(あのPHPのわけわかめなarray()もそうだ!)。

余談ではあるが、perlというのはこの点でも「変態」言語である。GCがreference counterという原始的なもののおかげで、ある程度の資源管理が言語内で出来るのだ。

まとめ

プログラミング言語はLispに回帰しているんだろう - ’(rubikitch wanna be (a . lisper))
『プログラミング言語の神秘:全てのプログラミング言語はLispに始まりLispに終わる』

は正しくない。始まりか終わりのどちらかは、アセンブリー言語のはずなのではないか。

だから、両方習っとくべきなのだ。

Dan the Occasional Lisper


この記事へのトラックバックURL

この記事へのトラックバック
最近、というか、しばらく前から「初学者はアセンブリとLISPを学ぶべき」とか「LISPは最強、あとはC言語でもやればいい」みたいな記事をそこかしこで見ますが。 んなの、私に言わせてもらえばアセンブリでもC言語でもLISPでもなんでもいいから最低限、ノイマン型と関数型のパ...
最低限学ぶべきパラダイム、そして最強とは。【32nd Diary】at 2008年05月06日 15:48
この記事へのコメント
>こういった、「有限の資源をやりくりするにはどうしたらいいか」という設問には、Lispはかなり不向きなのではないか。

arrayで確保しちゃうよ。動的にメモリを確保しなくなってその後のコンシングが減るので。common lispでの高速化のテクニックの一つです。グレアムのANSI Common Lisp の13章 p.202あたりを読んでおくれ。
Posted by 通りすがり。 at 2008年08月02日 17:46

コンピュータ以外の何かがやりたい、という人にも不向きな言語ですね。






Posted by いろんなことに不向きな言語 at 2008年05月02日 23:45
確かに Lisp は凄い言語だと思います。
Lisp でも実用的なプログラムは作れるみたいですよ。
で On Lisp が積読な私は負け組(笑)
まぁ、各言語は他の言語からいろいろ学んで進化しているっていうような事を誰かが言ってましたし(Dan さんでしたっけ?)、Lisp 程古ければほとんどあらゆる言語が Lisp から学んでいるでしょうから、Lisp に回帰って言うのもわからなくは無いような。
でも Dan さんのまとめには激しく同意。
Posted by kariyam at 2008年04月30日 02:24
そいえば、プレイステーションのゲームで、GameLispって言う言語で出来てるやつがあるって聞いた事あるなぁ。
Posted by とほりすがり at 2008年04月27日 12:01
Common Lisp ハッカーは、速度が重要な場合
arrayを確保してGCなんて走らせないですが‥
Posted by とおりすがり at 2008年04月27日 11:44
リストでハッシュをというのは無理でしょうが、Common LISPならvectorがありますので、O(1)でハッシュを実装可能でしょう。前半の指摘は正当だと思いますが、後半の指摘は不当に思えます。
Posted by ねる at 2008年04月27日 11:08
確かに、LISP は resource の限界を意識しない造りになっている点が、実用には不向きな理由の一つだと思います。
それゆえに、学習には良い言語なのかもしれません。
resource の限界に正面から向き合うのなら、アセンブラか C が一番でしょう。
よって、学習には2つの言語が良いわけだ。
Posted by windknight at 2008年04月27日 07:24
Lispって、実用的なんですかね?
Lispって、単なる遊び道具に過ぎないように思えるのですが・・・。
Posted by oredoco at 2008年04月27日 03:26
東京大学恋愛日記
Posted by mikiko at 2008年04月27日 00:17
C/C++/Java に比べて軽量言語の方が良いのではないか、という期待に含まれているのは、その方がプロジェクトに従事する人数を減らせるという期待と、それゆえ腕利きだけをプロジェクトに残せるという期待だと思う。
Posted by Kei at 2008年04月26日 23:24
おお,いいところ突いてるな〜。
世界中の多くのプロジェクトが C/C++ で書いてるのを愚かな選択肢とするのはかなり短絡的な思想が流行るものだと思っていた。しかもどういうか訳か,そういう人たちが UNIX 系 OS で Emacs なんか使ってるプログラマに多いのも不思議だ(UNIX は Lisp で書かれていないし,Emacs の Lisp はプって感じだし)。
Posted by fuk at 2008年04月26日 20:15
>GCは今な言語にはほぼ必ずといっていいほど備わっている。

ナウなランゲージってことですね。わかります。
Posted by ヤング at 2008年04月26日 19:49