memoiseを自動的に行う言語処理系
コンパイラが行う最適化は、要するに計算の一部をコンパイル時に行うことになる。型の決定とか、定数の計算とか。
ある種の関数なら、実行前に結果がわかっていて、定数におきかえてもいいこともあるし。コードの一部分が副作用をしないものなら、コードを削除してしまうこともある。副作用が問題でないならば、コードの実行の順番も変更されてしまう。
でも、そのためにコンパイルには多大な時間がかかるようになるかもしれない。というか、停止して、決まった値を一つ出力するプログラムなら、コンパイルの時間=プログラムの実行時間とも言える。
ただし、いくつもの実行のパスがある場合には、コンパイルされるコードと実行されるコードは一致しないので、コンパイルの時間>プログラムの実行時間というケースは有り得る。この場合は結果は非決定的であることが多いから、プログラムが一つの値に収束することもない。
何度も実行されるプログラムなら、これでおそらく問題は無い。
しかし、デバッグの過程にあるコードでは、コンパイルの時間が長いのはわずらわしいと感じられるかもしれない。プログラムが実際に実行される場合、実行速度の優位性は、さまざまな遅延によって隠されてしまうこともあるかもしれない(消費されるエネルギーは確実に削減できるはずだが)
そこで、コンパイル、Optimizeをlazyに行えないか?と考えた。(すでに同じことを考えた人は無数に居るだろう)コードの実行結果が決定的な部分については、自動的にmemoiseしてしまうのである。こうすれば、実行されない部分はCompileする無駄(?)が無い(かもしれない)
そして、一度実行したobjectコードは、もとのソースコードとは別に実行可能なイメージとして再利用可能となれば面白い。「ソースは同じだけど、x86_64で使いこんだこのオブジェクトは速いぜ」とかね。
この、自動memoiseのネタはHaskell関係の記事でみたような記憶があるので、探してみようと思う。
調べ中
memoise
- 記憶(メモ)する関数
- 403 Forbidden
- http://d.hatena.ne.jp/tanakh/20041126#p2
- pure memoization - One of the Eight Stones
- d.y.d.C++で、という話らしい
histmorphismッテなに?