なんとなく MinCaml を x86 に移植とかしてました。が、いつものごとく飽きてきたので中断。気が向いたら再開するかもですが、とりあえず BSD ライセンスぽいので上げときます。
http://shinh.skr.jp/tmp/min-caml_x86.tgz
やったこと的にはなんかある程度 x86 語に直訳したりそれなりにほげほげしたり(つまり忘れた)とかなんですが、やってないことを記録するのが重要なのでやってないことは、
- x86 は圧倒的にレジスタが少ないのに SPARC 時の設計のまま。 6 引数以上の関数は自動的に作れないし、その他スタックあんまり使ってないので heap pointer を保持する専用のレジスタが超絶無駄使いくさいなど、色々ひどいです。
- あと関数に必要なスタックサイズとか超適当で (ESP を 20 引いてるだけ) 32Byte 以上のスタック使用があると不思議なことになるはず。
- なんか SPARC の命令が残ってる個所があるかもしれませんが、それは意図的です。それによって未テストな場所がわかるという適当な話。
- 組み込み関数も全然足りない。
- 浮動小数やってません。
- 上のパッケージには色々ゴミが入ってるかも。
まぁスタックを活用するようにするってのは直訳よりも、それなりに面白い作業になると思いますが、つまり気が向いたらやります。直訳から始めたのは、私は読んで理解するよりいじって理解する方がラクだから、とりあえず練習チックにいじってたとかそんな事情。ホントは、キチンと読んで理解する→x86向けの設計について一定考察→実装、ってのが正しいんでしょうけど、どうもそういうのはニガテというか楽しくないとか。
MinCaml は、うーんと main.ml の
Emit_x86.f outchan (RegAlloc.f (Simm13.f (Virtual_x86.f (Closure.f (iter !limit (Alpha.f (KNormal.f (Typing.f (Parser.exp Lexer.token l)))))))))
なんて感じで構造がキチンとわかれてるのは非常にわかりやすくていいなぁと。逆に細かい体裁とかはこれ、行数少ないと主張してたからかなーと思ったんですが、なんかもうちょい改行してよとか思ったりとか、これは OCaml 慣れの問題でしょうが、パッと読めないコードが結構ありました。以下はテストケースのコードなんですけど、簡単なことやってるのにパッと読めなくて狼狽えました。 LISP 慣れしてれば読みやすそうな。
let rec f n = if n < 0 then () else (print_int n; let a = Array.create 1 f in a.(0) (n - 1)) in f 9
あとはコードについてではないんですが、想像以上にできること少ないなとビックリしました。例えば文字列が無いとか、リストとかタプルとかも無いですし。もちろん教育用とかで要素を削ってあるというのは理解してたんですが、それにしてもこれだけかぁ、というか。
あと直訳なのでたぶん遅いです。これで MinCaml の速度評価とかはしないようにお願いしますです。