2001-03-01 (Thu)
_ Ruby VM
木山君はthreaded codeを試しているらしい、ということは各命令は 独立した関数になってるってことかな。よくわかんないけど。 (これはthreaded codeという用語に関する思い違いだったらしい。 <URL:http://www-sor.inria.fr/~piumarta/pldi98/paper.ps>みると QSchemeってdirect threaded codeってやつだったのか。 とか言ってまた思い違いかも。やっぱり思い違いだったっぽい、 direct threaded codeの方はテーブルがなくて、コードの部分にジャンプ先が 直接入ってるんだな。 QSchemeのコードを実行前にdirect threaded codeに変換したらもっと 速くなるんだろうか。と思ってよく見たらQSchemeもやってるっぽいね。 うう、今日は早く寝よう。もしかして、まつもとさんの言ってた3倍って いうのはthreaded codeの差なのかしら。)
まつもとさんはQSchemeみたいにgccの拡張機能で、ラベルを first class objectにしてgotoしまくるという方法を試しているようだ。 QSchemeのコードを見たけど、バイトコード(というかバイトじゃなくて ポインタのサイズみたいだけど)を実行する関数のstatic変数にラベルの テーブルを用意しておいて、そのテーブルを見ながらgotoするみたい。 ということは、rb_eval()みたいな長い関数はどうもバイトコード化 されても健在っぽいですね。
ちなみにQSchemeの方がまだ3倍くらい早いそうです。 まつもとさん、木山君、がんばって。