memoiseを自動的に行う言語処理系

コンパイラが行う最適化は、要するに計算の一部をコンパイル時に行うことになる。型の決定とか、定数の計算とか。
ある種の関数なら、実行前に結果がわかっていて、定数におきかえてもいいこともあるし。コードの一部分が副作用をしないものなら、コードを削除してしまうこともある。副作用が問題でないならば、コードの実行の順番も変更されてしまう。
でも、そのためにコンパイルには多大な時間がかかるようになるかもしれない。というか、停止して、決まった値を一つ出力するプログラムなら、コンパイルの時間=プログラムの実行時間とも言える。
ただし、いくつもの実行のパスがある場合には、コンパイルされるコードと実行されるコードは一致しないので、コンパイルの時間>プログラムの実行時間というケースは有り得る。この場合は結果は非決定的であることが多いから、プログラムが一つの値に収束することもない。
何度も実行されるプログラムなら、これでおそらく問題は無い。
しかし、デバッグの過程にあるコードでは、コンパイルの時間が長いのはわずらわしいと感じられるかもしれない。プログラムが実際に実行される場合、実行速度の優位性は、さまざまな遅延によって隠されてしまうこともあるかもしれない(消費されるエネルギーは確実に削減できるはずだが)

そこで、コンパイル、Optimizeをlazyに行えないか?と考えた。(すでに同じことを考えた人は無数に居るだろう)コードの実行結果が決定的な部分については、自動的にmemoiseしてしまうのである。こうすれば、実行されない部分はCompileする無駄(?)が無い(かもしれない)
そして、一度実行したobjectコードは、もとのソースコードとは別に実行可能なイメージとして再利用可能となれば面白い。「ソースは同じだけど、x86_64で使いこんだこのオブジェクトは速いぜ」とかね。


この、自動memoiseのネタはHaskell関係の記事でみたような記憶があるので、探してみようと思う。

ちうか、httpdからforkされたプロセスがこんな機能持っててほしいかも

phpのスクリプトの中間言語イメージのキャッシュとかはよくある話ですが。
カーネルのコードがこうなっていてもいいなぁ。いやまぁ、最近のCPUはダイナミックに最適化するんで、そのコード片のイメージをどこかに吐き出してくれたら、と、思わないでもない。どういう形式なら再利用可能か、ということではSSAの概念が持ち出されそう。
というわけでVM屋さんの論文とかを見ると面白いのかな。