速攻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()