ダイナミックタイピング
http://martinfowler.com/bliki/DynamicTyping.html
長年、プログラム言語における静的型付け(スタティックタイピング)と動的型付け(ダイナミックタイピング)の議論に参加したいとは思えませんでした。 というのも、これは一種の感情的なトピックスであり、人の意見にまったく耳を傾けないような議論になりがちだからです。 しかし、このトピックスについて何度か尋ねられることがありましたので、ここで個人的な経験をお話をしようと思います。 ただし、誰かを説得させようとか、そういうつもりはありません。 これが誰かにとって「考える材料」になってもらえれば幸いです。
最初に両者の違いに気付いたとき、静的型付けの利点はすぐに納得できました。 その頃に使っていたプログラム言語はBasicやFortran IVでした——これらの型は限られていましたけど。 それからPascalに移りましたが、Pascalのプログラミングはすぐに楽しくなりました。
オブジェクトの世界にやってきたときは、C++やSmalltalkを使っていました。 しばらくはSmalltalkの動的型付けのことを不便だと感じていました——もっとも、素晴らしく生産性の高いプラットフォームが手ごろな価格で購入できましたけど。
静的型について疑問を持ち始めたのは、Smalltalkを使った中規模プロジェクトの最中でした。 静的型の支持者がよく言うのは、見つけにくいバグをキャッチできるというものです。 しかし、自己テストコードが登場し、 静的型で見つかるバグは自己テストで簡単に見つけることができるということが分かりました。 自己テストでは型エラーよりも多くのバグを発見できるため、静的型言語でも動的型言語でも自己テストは必要不可欠となりました。 結果として、静的型言語から得られるものは少なくなりました。
この一連の「発見」に吸い寄せられる人たちを見るのは楽しいものでした。 Robert MartinやBruce Eckelらも同様の発見をし、C++からPythonに鞍替えしました。
ただし、バグの捕捉が静的型の唯一のメリットというわけではありません。 バグの捕捉は、現在特筆すべき事項の一部分に過ぎません。
ある日、よく書かれたRubyコードを追おうとしましたが、パラメータの型情報がないために、少し難しいと感じました——「ここで何を持ってんだ?」と何度も自問自答しました。 このようなことはSmalltalkでは(以下の2つの理由から)問題になりません。 まず、素晴らしい開発環境があり、デバッガを起動させるのが簡単だったからです。これで、何を持っているのかすぐに分かります。 それから、型にちなんで引数の名前を付けるという慣習があったからです。 (Smalltalkでは、ポジショナル パラメータではなく、キーワード パラメータを用いていたことを考えると当然だろう。 キーワードがパラメータの役割を説明していた。)
他にも静的型言語が便利なのは、プログラミング環境が助けてくれるという点です。 この点についてわれわれの目を開かせてくれたのはIntelliJです(これはとても多くのことについて言えることですが)。 このようなIDEを使えば、型システムは非常に便利なものだと思います。 自動補完のようなシンプルなものも、静的型だからこそできるのです。 静的型だとIDEは他にも色々なことができます。
にもかかわらず、SmalltalkやRubyでプログラムするのは、ある種の満足感があるからです——これは動的型と大いに関係があるように思います。 Camp 4 CoffeeでBruce Eckelと話したんですが、2人とも静的/動的型の議論でイライラするのは、動的型言語を使う利点を口ではなかなか説明できない点なんですね。 そういった環境でプログラムしていると、なんとなく良さは分かるんですけどね(IntelliJの代わりにemacsを使ってRubyのプログラミングをしているときですらそうなんです)。 (もちろん、Smalltalkにはそういった言語と愛すべきプログラミング環境の両方が存在します。)
言語内でドメイン特化言語などを許すような言語の簡潔さが、ひとつ利点として挙げられるかもしれません。 JavaやC#のような言語を使っていると、何が起こっているか理解するのにコードを飛び回らなくちゃならないように感じますから。
まあ、理由が何であれ、この「よい流れ」のおかげでプログラミングが楽しくなっています——たとえ開発環境が貧弱でもです。 ただ、これはそんなに重要なことではないかもしれません。プログラマが楽しいかどうかなんて、誰が気にするでしょうか? いえ、私 が 気 に し ま す。 なぜなら、プログラミングは本当に楽しいものだからです。 考えたことがコードになるまでのゴチャゴチャしたものに時間を浪費することなく、 さっさとやってしまうのが楽しいのです★。 私にとってそれは、SmalltalkやRubyを使う「楽しさ」です。 だからこそ、個人的なプロジェクトでそれらを使うのです。 それから、「楽しさ」にもビジネス価値があります——結局、モチベーションこそがプログラマの生産性を左右するのです。
- 2012-01-17 (火) 09:18:22 omanuke : F#は静的型付けだけどC#にない楽しさがあります(´・ω・`)
- 2011-10-21 (金) 00:34:46 kdmsnr : 「楽しい」って結論です。
- 2011-10-21 (金) 00:32:55 結論 : 結局動的型付けの利点は説明されなかった・・・
- 2005-03-17 (木) 12:25:34 ‘’[[かめ]]’’ : 俺もRubyで好きなのはクロージャですが、Rubyのクロージャが優れてるのは、動的型付けの影響もあるんじゃないかと思います。記法が簡単になるという点で。
- 2005-03-16 (水) 10:32:14 ‘’[[keis]]’’ : ひとつ目の★の箇所は、こんな感じでしょうか:「この点についてわれわれの目を開かせてくれたのはIntelliJです(これはとても多くのことについて言えることですが)」。ところで、Rubyが楽しいのは動的型付けだからなんですかねえ。私は文字列処理が簡潔に書けるとか、クロージャが使える点が大きいなあと漠然と感じていたのですが…。みなさんはどう感じているのでしょう。
- 2005-03-16 (水) 01:49:50 ‘’[[kdmsnr]]’’ : ありがとうございます。
- 2005-03-15 (火) 19:13:03 ‘’[[zunda]]’’ : 最後の★は、意味としては下記のような感じでしょうか?日本語としてこなれてませんが: 私の考えたことがコードになって走るまでの間に、わけのわからない動作をなんとかしようとして時間を浪費してしまう必要なしに、いろんなことをさっさとやってしまうのが楽しいのです。
- 2005-03-15 (火) 19:10:37 ‘’[[zunda]]’’ : 素晴しい文章をありがとうございます。「バグの補足」を「バグの捕捉」と変更しました。
- 2005-03-15 (火) 14:32:25 ‘’[[kdmsnr]]’’ : すいません、分からないところがたくさんあります。