TMTOWTDIの謎を探る(調査報告:単純さと複雑さの関係とは?)
この資料は、オリジナルは2002/05/10にkiyokaが書いた文章で、OldTypeに移してリンク切れ等をメンテナンスしたものです。
Perlって他のコンピュータ言語よりもなんか複雑じゃない?
個人的にはC言語よりもスラスラ書けるようになるまでの時間が長かったように思う。
それは、Perlの言語設計の哲学と関係があるんじゃないか?
そういえば TMTOWTDIと関係がありそうだ。調べるてみるとやっぱり関係ありそうだということになった。
TMTOWTDIというPerlのスローガンの本質が世間で理解されているんだろうか?
(少なくとも僕は、調べるまで本質を知らなかった。)
皆さん、TMTOWTDIがThere's more than one way to do itの略だということは御存知だと思います。「やり方はひとつではない」というスローガンです。
Perlの世界ではcoolとされている哲学をスローガンとして掲げたものです。
Q.でもなぜ?やりかたが少ない方がシンプルで良いんじゃないの?
Perlの設計者のLarry Wallは言語はいろんな対象をシンプルに記述するためには言語をある程度の複雑を持っている必要があると信じています。
次のような文章を見つけました(オープンソースソフトウェアという書籍からの引用です「努力、忍耐、謙遜
」の章)
「我々がよく知っていることだが、現実とは乱雑な状態を指す。実際、人類の
言語が複雑なのは、それが現実を扱わざるを得ないためである。」
「そしてPerlは、それを可能にさせてくれる新しいツールなのである。私が英
語を使って現実を単純化できるのは、英語が乱雑な言語だからである。英語は
乱雑だからこそ、我われが現実と呼ぶ、これまた複雑な世界をうまく描写する
ことができる。同じように、Perlも(できるだけ精密なやり方で) 乱雑になる
なるほど、スローガンTMTOWTDIの本質はここにあったんですね。
「さっきの例え話はわかったけど、もうちょっと説明してよ。」という方のために次のようなグラフを作ってみました。
まず、それぞれの言語が得意とする分野の問題を記述した場合。これは、言語の設計者が意図した使い方の範囲に収まった問題とも言えるよね?
この場合、どの言語もたいして複雑にならないということは分かるよね?
だって、それぞれの言語は最初は、ある特定の問題を記述するために設計したはずだから。
それぞれの言語が得意かどうかにかかわらず、その言語でいろんな問題を記述しなければならない場合。つまり現実に対処しなければならない場合ね。
これは、言語の設計者が想定していた範囲を大きく超える問題を扱った場合とも言えるね?
例えば、tclやBASICで文字列のパターンマッチングやリスト処理やデータフォーマット変換なんかをやろうと思ったらキツいのは想像できるよね?
でもそれをやらないといけない状況が発生したと仮定すると?
Perlのコードを日々書いている方は、Perlがどんな問題を扱うにしてもそこそこの許容範囲のコードで解決できることは経験的に知っているはずです。それって cool ですよね?
また、母国語(日本語) ならもっと、扱える範囲が広いことも知っているはずです。身近な例で言うとマイクロソフトなんかは強力な「それは仕様です」というコードを持っていますからね。これは Perlでは書けないですが、母国語ならシンプルに書け、扱う範囲の大きさもかなり広いです。(極端な例かもしれませんが...)
母国語は真の言語だけれどもPerlもなかなか良い線いっているんじゃないかな?
TMOTOWTDIのスローガンはなんとなくカッコいいと思っていたけど、これでカッコよさの意味がわかってきました。
Rubyにもこの哲学は引きつがれているので、Rubyも同じ考えかたが通用するのはうれしいですね。
TMOTOWTDIはカッコいいんです。自信を持ってカッコ良さを自慢しましょう。
著者:Larry Wall and Randal L. Schwartz
「そして、ある操作を行なう方法がただ1つだけ存在すべきだと信じるミニマ
リストにとっては、Perlはまるで悪夢のように冗長で派生的であると感じられ
るかもしれない。ともかく、UNIXのミニマリズム的なツールボックス哲学の枠
から大きく踏み出すことによって、Perlは小規模から中規模の仕事に最適なツー
ルとなり、再びツールボックスにしっくると収まるようになった。Perlは、新
しいツールを作り出す工具職人の作業台であるということができるだろう。」
多くの面で単純である反面、Perlが奥の深い言語であるのもまた事実であり、
学ぶべきことは山ほどある。Perlの全能力を自分のものにするためにはかなり
「いずれにせよ、あなたの好きなように書けばよい。もしあなたがC言語に通
じていて、その上でPerlを学ぼうというのなら、あなたの書き方はシェルスク
リプトやBASICやRPG IIから入った人とは違っていることだろう。それでいい
のだ --- 他人があなたと同じ書き方をすると期待してはいけない。Perlには
*正しい*書き方というものは存在しない。Perlは、多様性に関してきわめて寛
容な言語である。(Perlのスローガンを思い出そう) --- Perl の世界では、ま
あまあ読めて、ボスにクビにされないうちに仕事を片づけられるものが*正し
我々がよく知っていることだが、現実とは乱雑な状態を指す。実際、人類の言
語が複雑なのは、それが現実を扱わざるを得ないためである。我々はみな、な
んとかして現実に対処しなければならない。そこで、物事を単純化して考える
のだが、単純化しすぎることがよくある。コピュータ言語の設計者の多くは、
言語を単純化しすぎて、この世の複雑なところの面倒をすべてプログラマに押
し付けている。実は、あなたの脳はPerlをプログラミングするようにできてい
るのである。私はたったいま英語を使って現実を単純化しようとしているが、
人は誰でも複雑なことを単純にしたいという強い要求を持っている。そして
Perlは、それを可能にさせてくれる新しいツールなのである。私が英語を使っ
て現実を単純化できるのは、英語が乱雑な言語だからである。英語は乱雑だか
らこそ、我われが現実と呼ぶ、これまた複雑な世界をうまく描写することがで
きる。同じように、Perlも(できるだけ精密なやり方で)乱雑になるように設計
されている。 Perlのカルチャーでは、ほとんど何も禁止されていない。この
(本資料はリンク切れで探しきれませんでした。Wikipediaには、下記のような文章はもうありません。まつもとさんの昔の定義だと思われます)
【法則・真理】There's More Than One Way To Do It.
- 「それのやり方は色々ある」と、Perlで使われるスローガン。
- 多くの場合、この法則を当てはめる事が出来る。が、メーリングリストな
どで質問はしたものの、「自分の『「期待する回答』が一つだけ、ポコっ
と出てくる事」を期待して待っている人間にとっては酷な事。
- つまり、「複数の選択肢からの制約・状態に応じた最善策の判断」を否定
し、新たな価値観を取り入れる余地も気も無く、伝承に基づいた価値観を
唯一の拠り所とする事で、自己の存在を保っている人間には、永遠に理解
Perlの作者、ラリー・ウォール氏は、レボルを、役に立つことを実行する「ま
た他のやり方」だとみている。「私は、選択肢が多いことはいいことだと言っ
ている。Perlのスローガンは、それをやるには他のやり方もある、というもの
だ。レボルが役立つものにはレボルで、Perlが役立つものにはPerl でという
具合に使われると素晴らしい。どうすれば両者が連係できるか、調べてみたい」
Perlの設計哲学が書かれています。さすが言語学者の視点です。