部分評価
プログラムの入力の一部(static な入力)を先に固定し、その分の計算を済ませた特化版プログラム(residual program)を生成する技法。p(static, dynamic) を p_static(dynamic) に変換する。抽象化のオーバーヘッドを「抽象度を保ったまま」消すための基盤。
Futamura 射影(二村射影)
部分評価器 mix をインタプリタ int に適用すると、コンパイルの階層が現れる。
mix(int, prog)→ prog をコンパイルした実行コード(インタプリタの解釈オーバーヘッドを除去)mix(mix, int)→ コンパイラ(任意の prog をコードに変換する関数)mix(mix, mix)→ コンパイラ生成器(インタプリタからコンパイラを作る器械)
仕組み
- binding-time analysis — 各式を static(今すぐ計算可)/ dynamic(実行時まで未定)に分類
- static 部分を畳み込み、dynamic 部分だけを残す
- 定数畳み込み・インライン展開・ループ展開を「入力既知」の仮定で徹底した一般化と見なせる
関連技術との位置づけ
- Tagless Final — 原論文名が “Finally Tagless, Partially Evaluated”。型クラスの解釈を部分評価で特化し、抽象化コストを消す
- staging / multi-stage programming(MetaOCaml 等)— 部分評価を明示のコード生成として制御する
- supercompilation / JIT の specialization — 動機を共有する隣接技法
- 最適化クラスタ(Stream Fusion・DCE)と同じく「汎用コードを具体化して速くする」系
なぜ重要か
汎用性と性能はふつうトレードオフだが、部分評価は汎用に書いたコードを使用時に特化することで両取りを狙う。インタプリタ=コンパイラの関係(抽象機械)を理論的に橋渡しする点でも中心的。
関連
- Tagless Final — 部分評価で解釈を特化する設計
- 抽象機械 — インタプリタ特化=コンパイルの関係を体現
- Stream Fusion — 中間構造を消す隣接最適化
- DCE — 既知入力で不要コードが落ちる
- 多段階計算 — 部分評価をステージで明示制御する版
- 射影 — 「Futamura 射影(二村射影)」の射影。同名の他の射影との区別