8-3. ミニOCamlからASEC機械へのコンパイル

Dowek & Levy の教科書に掲載されているコンパイル方式では、 補助関数として以下のものを使っているので、まず、それを実装する。 関数 position は、変数名xと、変数名のリスト venv が与えられたとき、 x が venv の何番目の要素であるかを計算する関数である。 ここで、1番目に現れるとき 0 を返し、 一般に venvの N番目の要素であったとき、N-1を返すものとする。 x が venv に現れない時はエラーとし、 x が venv に2回以上出現するときは、最初の出現についての値を返す。

たとえば (position "a" ["b"; "a"; "c"; "a"]) は、1を返す。

position の具体的な実装は以下の通りである。

  let rec position (x : string) (venv : string list) : int =
    match venv with
      | [] -> failwith "no matching variable in environment"
      | y::venv2 -> if x=y then 0 else (position x venv2) + 1

いよいよコンパイラの本体である。まず、Dowek & Levy の教科書のコンパイル方式を引用する。

これから上記の変換(Compilation of PCF)の定義を解読しよう。

上記教科書49ページの上から5行目以降に、具体的な変換結果が記載されている。

実装にあたっての補足

上記の変換を実装するためには、教科書に記載の数学的な表記を、 OCamlのプログラムとして表現しなければいけない。 このためには、ある程度の作業が必要である。以下に注意点を述べる。

課題 8-3.

発展課題 [2012/10/19追加]

上記コンパイラは、「ミニOCaml言語からASEC機械への変換」はきちんとやっ てくれるが、素朴なものであるので、「インタープリタより高速に実行されるコードへの変 換」については、不満足なものである。そこで、様々な工夫について考察し、 実装に取り組んでもらいたい。
トップ, 前へ

亀山幸義