2011/09/18

では、静的型付けと動的型付けについて語りましょう

このブログを始めて3日目になりました。 おかげ様で、色々な皆さんに読んでいただけているようで、とても嬉しいです。 本当は、呑気に気が向いた時にポツリポツリと書いていこうと思っていたのですが、 折角なので、型付けについて書いてみようと思います。

結論から書きましょう。
プログラマにとって、静的型付け動的型付けの違いは、問題領域を分割するか共有するかの違いです。

動的型付け言語の例として、Smalltalkを取り上げます。はい、そうです、Smalltalkが好きだからです。ツ

SmalltalkにはNumberクラスがあります。そう、数のことです。1とか3.14とか、1/2とかです。 もちろん、足し算とか掛け算とか平方根とかができる、賢い子です。 しかもその上、自分を表わす文字列まで作れちゃいます。 数だけでない、Stringクラス君に関わることまでできちゃうなんて、これはもう天才の領域でしょう。ツ でもね、それは「1」君のすごさの、ほんの、ほーんの一部なんです。

なんと、この「1」君、isStringなんてメッセージまで受け付けられるのです。 もしこのisStringメッセージを文字列が受け取ったら、trueを返します。

1がisStringメッセージを受け取ることができるということは、会社の仕事で言うと、「ねえねえ、君、X部長のところの人かな?」と言われても、X部長が誰のことか知らなくてもパニクったりせずに平然と「いいえ」と言えるだけの社会性を備えているんです。 すごいぜ1、既にオレを越えてやがる。ツ

では、静的型付け言語ではどうでしょうか? 1がisStringかなんて、訊くほうがバカでしょう。ツ だって、1は整数で、文字列なわけがない。 型エラー。 isStringとか訊く前に名札読め。それが出来ないような社会性のない馬鹿の書いたコードなんかコンパイルせんぞ! まさに正論ですね。 会社というのは、ある程度の規模からは、大抵はそういう風に出来ています。 つまり、社員一人一人には職掌があり、それぞれ裁量と責任が規則で定められているから、それに応じて仕事を分担し、連携して、組織として業務をしていきます。

これが、静的型付けでは問題領域を分割する、と言った意味です。 では、動的型付けではどうでしょう?

動的型付けの場合、先に書いた「1 isString」には重要な意味があります。 isStringじゃつまらない、とおっしゃる貴方、何ならifStringDo:なんてメソッドを定義してもいいですよ。 引数として「1引数のクロージャ」を取って、もし自分がStringだと思ったら、自身を引数にしてクロージャを評価します。

ここで、1 isStringは、1 class = Stringでもないし、1 isKindOf: Stringでもないことに注目してください。 あくまで受け取った側が自己申告で答えています。 「ねえねえ、君、X部長のところの人かな?」と訊かれて、組織上は直接の部下でなくても、プロジェクトで一緒だったり、X部長を師と仰いでいるのなら、自分で判断して会話を続ければよいのです。

Smalltalkには、他にも色々な「isナントカ」とか「ifナントカ:」とかがあります。 どれも、受け取ったオブジェクトが自分なりに答えます。 だから答えなきゃならないメッセージの種類は、静的型付けの場合よりも、多くなります。 でも、「俺もこの仕事に関わりたいな」と思った人は、誰に許可を得ることもなく、自分から「はい」と言えます。 そのかわり、「はい」と答えたからには、その仕事を遂行するだけの能力を身につけなければなりません。 さあ、がんばりましょう。ツ

これが、動的型付けでは問題領域を共有する、と言った意味です。

どうでしょう、納得してもらえたでしょうか? ある意味、大企業とベンチャーのようでもあり、伽藍とバザールのようでもあります。 オレ個人は、プログラムが解くべき問題がしっかり定義されていれば、静的型付けの安全性と効率を取るでしょう。 これから問題を創出するような探検的なプロジェクトでは、動的型付けを選びます。

どちらかがもう一方より絶対的に優れているわけではありませんし、 「動的型付け = 静的型付け - コンパイル時型検査」でもありません。 違う特性を持った、違うスタイルと、違う戦略、違う組織論に立った、違う獣なのです。

もちろん、静的型付けが好き!とか、動的型付けはこうしたらもっと良くなる!とか、そういう楽しい議論になれば、楽しいですね。ツ

0 件のコメント:

コメントを投稿