«前の日記(2006年08月10日) 最新 次の日記(2006年08月12日)» 編集

ema log


2006年08月11日 [長年日記]

_ [Programming][Book] 文法と語彙数

人月の神話—狼人間を撃つ銀の弾はない」はエッセイをまとめたものとあって、全体にだらだらとしており、半分ぐらいにまとめて欲しいものも良書だった。とても二十年以上前に書かれた内容とは思えない。

本書のごくごく一部分が今日、突然、妙に自分の中でしっくり来たので書いてみた。読み終わったのはだいぶ前なんだけど、図書館にまだ返してない(てへっ。

人月の神話―狼人間を撃つ銀の弾はない (Professional Computing Series)(フレデリック・P,Jr. ブルックス/Frederick Phillips,Jr. Brooks/滝沢 徹/富沢 昇/牧野 祐子)

一般にプログラミング言語を比較する場合、従来は文法面のみをみた比較が一般的だった。

もちろん、この比較は妥当な比較なのだけど、現代においてはそれぞれの言語のある側面をとらえているに過ぎない。

というのも、言語とそれに標準でついてくるライブラリはセットで考慮されるものになっているからだ。

母国語を話している人は、通常一万語を超える語彙を使用しているのであり、教養のある人の語彙はそれよりずっと多い。私たちはどういうわけか構文と非常に微妙な語義を習得しているのである。例えば、私たちは、giant(同類のものより大きい)、huge(普通より大きい)、 ...(中略)... を正確に区別しているから、通常、「マンモスのように大きい砂漠」とか「広大な象」などと言わない。

[人月の神話 20周年改訂版 p.213より引用]

何故、その言語に人気があるのかを文法面からだけみるのでは不十分だ。ライブラリや組み込み関数・クラスなどという語彙も含めて評価しないといけない。普段、例えば英語と日本語の比較は文法でのみ行う。しかし、それは「語彙数が同じぐらいだろう」という暗黙の了解があるからに過ぎない。

C# などの .Net 系は比較的まとまったライブラリ(Windows 用はなおさら)を持つし、Java は膨大な標準ライブラリを備えている。Perl には CPAN という、標準添付ではないものも、オンラインから簡単にインストールできる、膨大なライブラリ群を備えている。だから、人気がある

C++ や C も歴史があるため、膨大なライブラリがあるはずなのだが、統一されたリポジトリがなく、探すのが手間だし、見つけてもコンパイラによっては手を入れる必要があったりする。例えば、いまだに標準ライブラリだけでは、インターネットに接続することすらできない

C# の筋の良さは文法面より、(後発だからこその)ライブラリにあると思うし、CPAN の無い Ruby はまだまだだと思う。Java は膨大なライブラリ群を持つが、逆に歴史的な積み重ねによる不統一感が個人的には悪印象だ。obsoleted なものは初学者にはノイズ群にすぎない。C#, Ruby にもそのうち出てくるだろう。

Ruby のブレイクスルーになりかかっているのが、Ruby on Rails の成功というのも妥当なところなのだろう。Rails から Ruby に入った人には、言語を選ぶ上では文法など後付けだ。

ただし、ライブラリがあるだけでは不十分で、使い方を習得できなければ意味がない。

ソフトウェア再利用問題のためには、人々がどのようにして言語を習得するのかを研究し、それに関する膨大な知見が必要だ。中には、次のようにすぐわかる教訓もある。

* 人々は文脈の中で学んでいくので、部品ライブラリだけではなく、構成した製品の実例をたくさん公表する必要がある

* 人々は綴り以外暗記しない。構文と語義は、文脈の中で使用しながら少しずつ学ばれていく

* 人々は構文クラスによって語構成規則をグループ化するのであって、互換性のあるオブジェクトのサブセットによるのではない

[人月の神話 20周年改訂版 p.213より引用]

Ruby・CPAN のヘルプを使いやすく感じるのも、MSDN・Flash のヘルプを使いにくく感じるのもこれによるのだろう。

関数型言語のとっつきにくさの一因は実例じゃないかなぁ。サンプル重要。特殊用途向けの言語が死なないのも語彙の特化による部分が大きいのだろう。微妙な機知を備えた言語は強いはずだ。