変数の型の宣言は必要なのか?
巷で型の宣言の話で盛り上がっているようなので、自分の妄想というか、最近思っていることをひっそりと書きまとめてみたいと思います。書いてる途中で障害が発生したりして、公開しそびれていましたが、せっかく書いたので公開。
「変数」の「型の宣言」は「必要」なのか? のそれぞれのキーワードごとに話を進めていきます。
変数
そもそも、変数とは何なのかというお話です。変数とは、何かしらのひとまとまりのデータの格納してある場所を指し示すものだと、私は思っています。
a = 1; b = "Hello"; c = ["a", "b", "d"];
char a = 1; char *b = "Hello"; char c[] = {'a', 'b', 'c'};
上はJavaScript、下はC言語のつもりです。上の2つの例で、a には 数字1 を代入しています。メモリ上のどこかに、例えば「00000001」という値が書き込まれ、変数aはその「00000001」の格納されている場所を指し示しています。b には「hello」を代入していますが、これもメモリ上のどこかに、例えば「010010000110010001101100011011000100111100000000」のような値が書き込まれ(あるいは既に存在して)、bはその「0100...」のメモリ上の位置を指し示すようになります。
配列やオブジェクト、関数のようなものであっても、表現が複雑になるだけで、やってることは同じだと思います。
型の宣言
C言語では、変数はメモリ上のポインタを直接扱っており、char 型は 1byte、int 型は例えば4byteというように、型によって大きさが異なっていたりするので、コンパイルをする際に型の情報を見ないと、何バイト分処理していいのかすら分からなかったりしたのだろうと思います。つまり、型がないとやっていけなかったわけです。(図はイメージ図であり、適当です。)
では、型が必須なのかというとそういうことはなくて、そのメモリの場所に何の型なのかを書いておけば、コンパイル時(インタプリタでもいいですが)に型を解決する必要はなくて、型から開放されることができそうですね。
必要なのか?
ということは、プログラム言語の都合という観点でみると、もはや型は必須ではないんだなということになります。必要ではないです。
すると、もはや宗教の世界になります。
PHPのように型を意識しなくても書けちゃったりする言語もあるのですが、そういう言語を触っていると、数値が欲しいのに文字列が入っているとか、関数にDateを渡すのか、文字列の状態で渡すのか悩むとか、いろいろあって、型があると便利だなと思ったりすることもあります。Rubyで、「ダックタイピングが便利!」と思ったのも、Javaのインターフェースの仕組みと利用方法を理解してからだったりしましたし、単に好みとかスタイルの問題かなと思います。
まとめ
個人的には、「変数に型がついていなくても生きていけるけど、型がついてるともうちょっと幸せになれる。」そんな感覚です。
おまけ
こんな記事書いておいてなんですが、Objective-C で Java でいうジェネリクスが使えなくてつらいです。うまく扱う方法を知っている型がいらっしゃいましたら、こっそり教えて下さいm(_ _)m。id型は却下です。