スタック型の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 プログラマはいつもこの順序を考えているということか?だとしたらいつも手で最適化しているということで、スゲーなということになっちゃう。誰か知っていたら教えてほしい。