メインルーチン

 

次にMinCamlのメインルーチンmain.mlを見てください。末尾のlet () = ...という部分から、コンパイラの実行が開始されます。

 

まず、OCamlの標準ライブラリArgを利用して、オプションを処理しています。-inlineでインライン展開する関数のサイズを、-iterで最適化処理のループ回数を指定します(詳しくは後で述べます)。

 

それ以外のコマンドライン引数は、コンパイルするプログラムの名前と解釈され、関数Main.fileにより「プログラム名.ml」というMinCamlソースコードから「プログラム名.s」というSPARCアセンブリが生成されます。

 

なお、デバッグや実験のために、引数の文字列をコンパイルして、標準出力に結果を表示するMain.stringという関数も用意されています。

 

main.mlの中核は関数Main.lexbufです。引数として受け取ったバッファに対し、順に字句解析(Lexer.token)、構文解析(Parser.exp)、型推論(Typing.f)、K正規化(KNormal.f)、α変換(Alpha.f)、最適化(iter)、クロージャ変換(Closure.f)、仮想マシンコード生成(Virtual.f)、SPARC13 bit即値最適化(Simm13.f)、レジスタ割り当て(RegAlloc.f)、アセンブリ生成(Emit.f)を行います。

 

最適化関数iterは、β簡約(Beta.f)、ネストしたletの簡約(Assoc.f)、インライン展開(Inline.f)、定数畳み込み(ConstFold.f)、不要定義削除(Elim.f)の5つを、-iterで指定した回数を上限として、結果が不変になるまで適用します。

 

これらの処理の内容については、以下で説明していきます。

 

次へ進む