とても強い型付け

プログラム言語を型で分類すると「強い型付け」と「弱い型付け」があるらしい。型というのは、intとかdoubleとかstringとか。強い型付けの言語だとこれらの型が厳しく、弱い型の場合はわりと適当でもコンパイラが解釈してくれる。まあ詳しくはネット上にいっぱい記事があるからそちらを参照してくれ。
どちらも利点欠点があるのでどちらが優れているとかはいえないが、C++ヘビーユーザな私は圧倒的に強い型付けの方が好きである。ていうか、バグを埋め込みやすい私は出来る限りコンパイラが厳しい方がうれしい。それどころか、正直言うと、C++ですらまだ物足りないぐらいである。私としてはもっと強い型付けな言語であって欲しい。

ちょっと話は変わるが、変数の名前のつけ方としてハンガリアン記法というのが存在する。これは型に応じて接頭文字や接尾文字をつける記法である。これはなんだか悪名高いらしく最近ではめっきり減ったぽいが私は何が悪いのかよくわからないので普通に使っている。ていうか、やっぱあった方がコードレビューとかやりやすいし何で悪いのかイマイチわからん・・・(’’;
正確にはこれはシステムハンガリアンと呼ばれていて実は元々のハンガリアン記法、これをアプリケーションハンガリアンと呼ばれるが、が誤って広まった記法らしい。では元のアプリケーションハンガリアンとは?説明が微妙にやりにくいので物理屋さん的に説明するとDimensionの違いを接頭文字や接尾文字で区別するということである。物理屋さんなら常識なのだが、Dimensionの違う値同士の足し算や引き算はありえない。なので変数にdimensionを表す文字があれば間違った足し算引き算はすぐに気がつく。このように間違ったコードにすぐに気がつける。まあこれも詳しくはgoogle様にでも聞いてください(^^;

で、話を戻すが、システムハンガリアンはいわゆる強い型に関して名前に規則性を持たせている。一方で、アプリケーションハンガリアンは強い型ですら判別できない型(?)に関して名前に規則性を持たせている。しかしそれならいっそのことシステムレベルでアプリケーションハンガリアンで分類されるような型をプログラマが定義できるようにすればいいではないか?という考えを持っていて、是非取り入れて欲しいと思っている。

文法の例として、typedefを単なる名前の書き換えでなく新しい型の定義とする方法。

typedef double Metre
typedef double Second
//↑型を定義

Metre m1 = 10.0;
Metre m2 = 20.0;
Metre m3 = m1 + m2;//←同じ型なのでOK
Second g1 = 20.0;
Second g2 = g1 + m1;//←違う型なのでコンパイルエラー・・・になって欲しい(^^;

上記のように、typedefで違う型に定義された場合にコンパイルエラーになって欲しいのだ。さらに新機能として以下のような文法も欲しい。

typedef double Metre
typedef double Second

Metre radius = 10.0;
double pi = 3.14159;//直接型で宣言する場合はNonDimension
Metre*Metre circleArea = radius * radius * pi;//掛け算により新しい単位が出来る

Metre length = 1000.0;
Second time = 20.0;
Metre/Second verocity = length / time;//割り算により新しい単位が出来る。

上記は私が考えた文法なのでC++では当然文法違反なのでコンパイルは通らない。型を掛け算や割り算で定義することにより複合単位が生成され、これもまた厳密に同じ型しか足し算引き算が許されない。

さらにはキャストの全面禁止。どうしてもという場合はそれ用の定数を宣言させて掛け算する。

Metre Position = verocity;//←1秒後の位置を記述したいがこれではコンパイルエラーになる。
Metre Position = 1.0 * verocity;//←これもただ1.0だと無次元なのでコンパイルエラーとする。
Metre Position = 1.0[Second] * verocity;//1秒後というのを記述する。

個人的にはこれくらい厳密であって欲しい。ていうか、これだけ厳密だったら今までデバッグで苦労したアルゴリズムバグの殆どがコンパイルエラーとしてたたき出されていたはずだ。逆に不便になる分もあるかもしれないけど(いざとなれば全部無次元量にすれば従来通り)それ以上の魅力を持っている。

とうわけでC++の偉い方、是非導入を(ぇ