Island Life

< DST | 緑な日 >

2010/03/16

言語の強み

ネタメモ。

ある言語の強みって何だろう、とか、他の言語と比べてどうだろう、 ということを考える際には、いくつかの要素が絡んでくる。

  1. 言語そのものの素性。例えばLispなら、S式を使うこと、 プログラム=データであること(homoiconicity)、 マクロの存在、read-write invarianceなど。 その言語のaxiomやそれに近い定理、みたいなもの。
  2. 具体的な言語仕様。ANSI CLがどうだとか、RnRS Schemeがどうだとか。
  3. 実装。Allegro CLの機能や性能がどうだとか、Gaucheはどうだとか。
  4. 対象。どこまでの範囲を相手と考えているか。Lispなら "Turtles all the way down" とか。

("Turtles all the way down" は言語界ではしばしば、言語自身の実装が上から下まで全てその言語で書かれていることを指す。参考)

「言語」の比較をする場合、あくまで理屈の上では1と2の範囲に絞って 考えるべきだ、という議論があるだろう。

また、「今、実際に使えるのか」という議論になる場合、1と3が議論の中心になりがちだ。 というのは2と4は、議論する人の中では暗黙の前提になってる場合が多いから。 (実装=仕様な言語なら2と3を区別する必要はないし、4については 暗黙のうちに自分が使う分野を想定している)。

現実にはこれらの要素は相互に関連していて、 一つの要素での選択が別の要素での選択に意味を与えているので、 分離して考えるのには無理がある。

例えばLisp族言語は、外から見るとみんなカッコだらけで一緒くたに 見えるけれど、中では互いにdisり合う殺伐とした戦場である。 素人にはお薦めできない。 これは、上の要素のうち見ている部分が違うということで説明できる。

Eric RaymondやPaul GrahamがLispを語る時は、主に1の話が中心だ。 一般にも、LispのLispっぽさというのは1の要因にあるように受け取られているように思う。 だから、S式とマクロを持った新たな言語を作れば、それはLispの方言だということになる。

一方、現場で長年Lispを書いてきたプログラマにとっては、 4の要素の存在が大きいようだ。 つまり、必要とあらばベアメタル上にGCやOSが実装できるとか、 出力されるネイティブコードをソース上からチューニングできることが前提であって、 それができない言語は最初から対象外なのである。

また、実際に商用システムを動かして何年もメンテしてゆく立場のプログラマに とっては、安定した言語仕様と処理系の存在は欠かせない。 数年ごとに仕様改訂があるSchemeですら、CLerにとっては信頼するに足らない 言語であって、ましてや実装のバージョンアップで仕様がころころ変わるような 言語はとても使えないということになる。

そんなわけでLisperの中だけでも様々の流派がひしめいているのだ。

  • 哲学派 - S式は宇宙だよ
    • 博愛主義 - Lispの哲学は他の言語にも浸透してる。 RubyもPythonもPerlもLispの亜種にすぎないぜ!
    • 理想主義 - 修行を極め真理を悟れば理想の言語に到達するはずだ。 それは4ページの仕様で全てが語り尽くされ、 また全てのプログラムは100行以内で書かれることになるであろう。
    • 冒険主義 - JVMで走るLispつくったよ。 Flashで走るLispつくったよ。ニコスクリプトで走るLispつくったよ。…
  • 安定派 - ANSI CLは100年後でも戦えるぜ。
    • バンドワゴン主義 - 実装はJVMでもCLRでもいいよ。 どうせハードとランタイムは速くなるし。
    • 泥団子主義 - この超抽象DSLは自作の汎用DSL構築フレームワークと 意味記述検証フレームワークの上に乗っかってて、それらのフレームワークは 自作のグラフ最適化ライブラリと作者の名前を冠したユーティリティライブラリ の上に乗っかってて、それからcomp.lang.lispに流れたライブラリとか どっかのサイトで見つけたライブラリ(今はもうサイトがないけど、 必要ならソース送るよ)とかあれやこれや50くらいの モジュールに依存してるけど、全部Common Lisp上で走ります。
  • 性能派 - Cより速くなきゃ意味ないでしょ。
    • 自作主義 - 組み込みのGC遅いから自分用のGC書いちゃいました。もちろんLispで。
    • 最適化原理主義 - その無意味なmovを俺に削らせろぉぉぉ。

言語論争が平行線をたどるのはこのへんのウェイトの置き方が違うという 理由もあるかも。

Tags: Programming, Lisp

Past comment(s)

zaud (2010/03/17 14:17:55):

Lispは病気ですね。 感染したことを後悔します。

nobsun (2010/03/19 04:40:35):

「Lisp感染 = イニシエーション」説 :p

Post a comment

Name: