定数畳みこみ

*Parse> test toplev "module X; machine x { int x=9 ; int y = 8+x-2; }"
("X",[("x",[],[(int)(local,"x",int,0) = 9,(int)(local,"y",int,1) = (+ (local,"x",int,0) 6)])])

できたー。(たしざんだけ)
http://morihyphen.hp.infoseek.co.jp/files/a24z-futon.tar.gz


http://d.hatena.ne.jp/w_o/20060220#p1 これと同じの。



というのは嘘で、実は定数畳みこみには色々と罠があって、

a = (2147483648+2147483648)/2

こーいうのとか、

a = b/3 * 3

こういうのを考え出すと大変というか。(この大変さは仕様が曖昧なところを無理矢理実装しようとしたために起こっています!!正しいプロセスを組んでヲーターがフォールするような美しいV字型を描きましょう!!)


とりあえず、ちゃんとしたコンパイラの場合、

float addf( float x ) {
	return x + 8.0 + 4.0;
}

こういうコードは、真面目に計算するコードになるとかは覚えておいたほうがいいかもしれない。(GCCなら-ffast-mathで手抜きできる)


というわけで、次はCFGつくろー。(いつも大体このへんで飽きて終了するので注意)