Min Caml コンパイラ その2

速攻MinCamlコンパイラ概説 をみればいいだけだったりして。ML の解説まで書いてある。
あと OCaml の参考書としては「プログラミング in OCaml」という本を読んでいる。Kindle版はあるが、紙の本の方は絶版だ。いい本だけに残念。

MinCamlはMLのサブセットです」とある。まず ML がわからないとダメ。ここで躓く。e::= の式も躓く。とりあえず自分の理解を書いておこう。

let が OCaml と違う。

let x = e1 in e2

となっている。OCaml では大域変数として

let pi = 3.14159

とかできるが、どうも Min Caml はできないらしい。上の文法を見るとそう書いてあるから、そうなのだが、ここで躓く。ML では let ... in ... しかないようにも見えるので(よく知らない)、Min Caml という名前から OCaml に誘導されそうになるが、「MinCamlはMLのサブセットです」ということらしい。

関数の定義が独自(?)

関数の定義にわざわざ「再帰関数定義」と銘打っているので、再帰じゃない関数があるのかと?勘違いするが、どうも、すべての関数(プリミティブを除くと)は「再帰関数定義」らしい。そして、

let rec f a0 a1 a2 = e1 in e2

となっていて、rec という特別なキーワードが出てくる。このキーワードは ML にも OCaml にもないように思う(自信なし)。(hatena のキーワードでハイライトされてしまった。OCaml に let rec が let とは別にあった)。ということで、関数の定義は let rec で、それは常に再帰関数定義となる。再帰関数定義の意味がよくわからないが、上の e1 でも使えるということなのだろうか?

最初に理解しなくて張らならないのは Min Caml の文法

OCaml の文法とは Min Caml は違うので、まず Min Caml 自身の文法を「CCaml とは違う」ということを念頭に理解しなくてはならないと思う。コンパイラを作るうえで OCaml の理解は必要だけど、極端な話、この時点では OCaml しらなくてよい。Min Caml を理解するのが先。そして、どこが OCaml と違うのかを理解する。というのが感想。とくに OCaml や ML 知らない人(私だよ)は特にそうだと思う。

Min Caml を使う

  • まず、 git clone する。
  • to_x86 というシェルプロを走らせる。(ほかに to_ppc, to_sparc なんてのがある)
  • make する。min-caml ができる。 (min-rt は興味のある人だけ make すればよい。直接コンパイラに関係ないから)
  • test をみて Min Caml の雰囲気を知る
  • 自分の環境で Min Caml のソースを作る(あるいは test からコピーする)
  • Min Caml でコンパイル
min-caml adder
adder: adder.s libmincaml.S stub.o
        gcc -m32 -g -O2 -Wall $^ -lm -o adder

こんな感じで理解を深めていけばよい。

*. はあるけど * はない?

OCaml で躓くのが整数と小数点ありの数。これ ML では別々の世界を持っていると考えるみたいね。なので、掛け算も小数点の場合は *. で、整数の場合は * 。
ただし、Min Caml で * はサポートされていないっぽい。*. はある。

let pi = 3.14159 in
    let rec f r = r *. r *. pi in
        print_int (int_of_float (f 789.0));
print_newline()