インライン展開(inline.ml)

 

次は、最適化処理の中でもっとも効果のあるインライン展開です。これは、小さな関数の呼び出しを、その本体で置き換えてしまう、という変換です。MinCamlでは関数Inline.gにより実装されています。

 

まず、関数定義let rec f x1 ... xn = e in ...があったら、関数fの本体eのサイズを、Inline.sizeによって計算します。もしそのサイズが整数参照Inline.threshold以下だったら、関数名fから仮引数x1, ..., xnおよび本体eへの対応を、写像envに追加します。そして、関数呼び出しf y1 ... ynがあったら、さっきの仮引数x1, ..., xnおよび本体eを写像envから引いてきて、本体eの中の仮引数x1, ..., xnを実引数y1, ..., ynで置き換えた式を返します。

 

ただし、インライン展開した式は関数の本体を複製した式ですから、変数が重複しているかもしれないので、またα変換する必要があります。偶然か必然かわかりませんが、Alpha.gを流用すれば、上述の「仮引数を実引数で置き換える」処理とα変換は同時に実現できてしまいます。Alpha.gの写像envとして空の写像を用いるかわりに、x1, ..., xny1, ..., ynに対応させるだけでOKです。

 

次へ進む