Sunday 18 February 2007

プログラミング言語



一番好きな言語は? と聞かれれば、アセンブラと答えると思う。

僕は、実装から遠く離れた言語には問題があると感じているらしく、Pascal あたりまでは我慢できるんだが、それ以上、高級になると使う気がしないです。

例えば、ML。最初に見たときに感じた違和感が大きくて、そこから派生した言語は、自分的にはすべてだめ。Ocamlとか。プログラムを見て実装が見えないのはだめだろ? あと、だめなのは遅延評価系が入った関数言語ですね。Haskel とか。基本的にはグラフ処理みたいな操作意味論を持つのだが、複雑すぎると思う。こちらの言語だと、プログラムを見て計算量を見積もることも難しい。

前にも書いたけど、この手の1階述語論理レベルでの理論サポートをしても、結局は、その上でメタインタプリタ的な構造を作って、そこでad-hocなプログラムをするようになるので、無駄だと思う。ad-hoc さは、プログラミングには必須なんだと思う。特に、オープンな型が必須。

ADAとか、あるいはPL/I、今時のFortranや Template 込の C++ みたいな巨大な言語は、直観的にだめだと思う。

Object 指向言語も実は、メソッド呼び出しが不透明なことが多く、あまり好きではないです。メソッドキャッシュがどうたらとかいうのが入るのが嫌い。

逆にPrologは勉強するにつれ実装に近い言語だと認識するようになりました。複雑な cons (Cで言うmalloc, Java で言うnew) を極めてコンパクトに書ける言語だが、そのうちのどれがstack上に作られて、どれがheap上にできるのかを制御できる言語というのは珍しい。操作意味論も実は明解だったりするし。型がない割に、自分で型制御しやすいのも良い。でも、複雑すぎるね。

じゃぁ、Perl はどうなんだと言うと、symbol に結びつけられたスカラと配列、そして、Hash を基本とした言語だと思うと、実装が見えて来ます。まさにデータ処理言語なんだよね。OOの実装法もPerlらしく透明。その他の似たりよったりOO script 言語とは、そこが違う。

ad-hoc さの極みの言語と言えば、LISP でしょう。LISPを標準化しようとするのは、実はLISPを殺すことに他ならなかった。Common LISPは、コンパイラを前提にしたおかげで、つまらない言語になってしまった。Squeak が、コンパイラを捨てて甦ったのと対称的だと思う。

実装に近いと言えば、C アセンブラ。そこから、さらに複雑な関数呼び出しを外したのが、今やっているCbC。まぁ、結局、自分で欲しい言語を自分で作っているっていうだけなんだよな。

No comments: