型チェックってどうすればいいかっていうメモ

と、したいところなんだけど、ちゃんとした型システムって作ったこと無いからどういうのが必要なのかわからんのだよなぁ…


とにかく、型チェックっていうのは組み合わせだ。いっこいっこのパターンは量が多くないんだけど、型の数に応じてパターンの数が組み合わせっぽく増えていくわけだ。
intとfloatがあったら、int+int=int、float+float=float、int+float=floatのみっつ。
これにポインタが混じると、int+pointer=pointer、pointer+pointer=error、int+int=int、float+pointer=error、float+float=float、float+int=floatの6個。
これにdoubleが混じると?charが混じると?構造体が混じると?構造体がオペレータのオーバライドすると?型に修飾子が付くと?継承?テンプレート?


とにかく、そういう、パターン数の爆発に対処できる何かがいるわけだ。けど、ライブラリとか、構文とかでいくら対処をしたとしても組み合わせには対処しないといけないわけで、結局どうやってもパターン数は減らないわけだ。
んんん。どうすればいいかなぁ…とりあえず考えたのが、いっこいっこのパターンを極限まで簡単に、一目瞭然でわかるようなフォーマットを作る、という感じか。

int float: // 左辺がint型、右辺がfloat型の場合、次の関数を実行
	function( expr, lhs, rhs ) { 
		expr.type = float;        // これ全体の式の型はfloat。
		lhs = convert_float(lhs); // 左辺値はfloatに変換
	} 

int int:
	function( expr, lhs, rhs ) { expr.type = int }

pointer float: // pointer は型名ではなくて、えーと、そこらへんはうまくやるようにできる予定。
	function( expr, lhs, rhs ) { error("error hoge hoge"); expr.type = error_type; }

こういう別ファイルを用意しておけば、あとはそれを読み込んで、うまくやってくれるようなライブラリがある、と、そういうのを考えてみたんだけど。



んで、もういっこ、重要なのが、型の伝播っぽいものを簡単に書く方法だ。関数型言語みたいに型推論するんだったら当然いるだろうし、Cでも、doubleとかfloatなんかの変換を考えれば、そういうのが自然に書けるようになっていると嬉しい気がする。
けど、そういうのって具体的にどうやったらいいか全然イメージがわいてこないんだよなぁ…どうすればいいのかなぁ。

やっぱ一回は関数型言語みたいな静的型の処理系も書いておくべきだったか。いや、それはちょっと気楽にはできないなぁ…


まあ、そんな感じ。とにかく、コンパイラでは、型チェックは馬鹿にしてはいけない。C言語のような簡単な型システムでも、どうやって実装するか考えると、それだけで結構な量になることがわかるかと。
実際、GCCのCフロントエンドでも一番行数が多いのがc-typeck.cというファイルだったりするのだ。