スタック型のVM
コンパイラの結果をスタックマシン型の VM に落とすことを考える。JVM などでは iload なるものがある。きっと istore もある(あーあったあった)だから、スタックと"変数"への出し入れは自由なわけだ。
a = b + c
を考えると
iload b iload c + istore a
とかになるのか?いやちょっと待て。a はいずれ使うだろ。だからスタックにとっておこうよ。とすると次に
e = f + g
とかが来ると、もう a はスタックの下の方に埋もれてしまう。なるべくスタックで処理をしようと思うと実行順序は大事だ。これ FORTH のプログラマはどう解決しているのだろう?
コンパイラに効率よい順序を考えさせるのは結構大変だと思う。(というかこの手のはだいたい NP 問題になっちゃうし)でおそらく経験的なプログラムをして、例外処理をするということになるだろう。FORTH でない言語を FORTH のようなスタックマシンに落とすとき(典型的な FORTH マシンはたぶん iload や istore はないと思う。)どうすればよいのだ。
FORTH プログラマはいつもこの順序を考えているということか?だとしたらいつも手で最適化しているということで、スゲーなということになっちゃう。誰か知っていたら教えてほしい。