こんぱいら

一週間くらい前まで大学の実験で PL/0 言語のコンパイラを書いたりしていました.
全然知らなかったけど PL/0 というのはコンパイラ作成の学習においてわりと使われるものらしい.
実装言語は Java で,適当な命令セットを持ったスタックマシンの命令列にコンパイルして,それを VM 上で走らせるような構成.
最初に http://ja.wikipedia.org/wiki/PL/0 にあるような最低限の文法についてコンパイルできるようなコンパイラ+VM が与えられて,課題に従って for 文とか配列とか float とか返り値を持つ関数とか(値|参照)渡しとかを拡張していくという進め方だった.
一応課題は全部こなしたつもりで,あとは int -> float の暗黙の型変換とか多次元配列とか単純な最適化を書いた.
最初は「Java かー…」とやる気も低めだったけど,しばらく書いていれば慣れるし,大学で習ったことになっている言語は C, Scheme, Java で,その中なら Java が一番マシかなと思ったりもして中盤からは気にならなくなった,というか諦めのような気持ちになった.
その実験はもう終わったわけだけど,なんとなく VM のほうを高速化してみたいなーと思いはじめて C++ で書き直し,JIT するようなものを書いている.
まだ float の部分がうまくいっていないけど,それ以外はちゃんと動いている.
結果,元の VM では fib(36) の計算に9秒くらいかかっていたところを1秒くらいで計算できたり,100000000回ループする処理が13秒→1.7秒と速くなったりしてなかなか楽しい.
ちなみに JIT を行う上で Xbyak というライブラリを利用している.
http://homepage1.nifty.com/herumi/soft/xbyak.html