仕様作成からJITによる最適化までPerlの処理を30倍速くすることを目標に開発しているSPVMですが、今後の道のりをここに記しておきます。現状は例外が起こったときに、コールスタックは表示されるけど、行番号とファイルは表示されない。これは、開発のときはちょっと不便なので、デバッグモードを追加する予定。ウィークリファレンスの実装Perlと同じように、SPVMのGCはリファレンスカウントで実装されている。現在制限として、オブジェクトの循環参照は禁止されているが、ウィークリファレンスを実装して、この制限を解きたい。タグポインタという仕組みを使って、実装しようと思うのだが、まだ構想段階で、パフォーマンスを悪くすることなく、実装できるかは未知数。なんとかなりそうな気もする。ネイティブインターフェースJavaにはJNIというC言語に接続するためのインターフェースがあるのだけれど、これをSPVMでも作成する。このインターフェースがあれば、SPVMの配列などのデータ構造にC言語レベルでアクセスできる。GPUやSIMDなどの並列処理を、記述したいときは、このネイティブインターフェースを使って実装できるようにする。ダイナミックリンクライブラリダイナミックリンクライブラリの機能を追加する。ダイナミックリンクライブラリが読み込めるようになると、必要に応じてC言語のライブラリが読み込めるようになる。ダイナミックリンクライブラリが読み書きできるようになると、ネイティブインターフェースを使って書いたSPVMのライブラリを、CPAN上にアップして再利用できるようになる。PerlのもっているXSやDynaLoaderの機能を使ってうまく実装できるような気もしている。ようなものをコンパイル時に4にするような最適化を定数畳み込みという。1、(値2)」という線形の形式で表現されたプログラムのことで、変数名がかぶらないように採番されるのが特徴のようだ。SSA形式に変換すると、定数伝播や不要な式の削除が行いやすくなるらしい。ループ最適化ループの中で、undefのチェックや配列の範囲チェックしている部分を、外に追い出す。これによって命令数を少なくする。これは、かなり難しそうだ。レジスタ型VM現在はスタック型のVMとして実装している。僕が調査したことによると、現在のCPUにおいては、コードサイズが小さいことよりも、命令数が少ないということが、パフォーマンスにとって重要らしい。レジスタ型VMは命令長が長くなる代わりに、加算や減算などの命令数を減らすことができる。レジスタ型VMにすると、JITを行う場合に、ちょうどCPUの命令に近いような表現ができる。VMを書き直すのはかなり大変そう。機械語に対応するバイトコード生成レジスタAにレジスタBを加算するというような、機械語に対応するバイトコードを作成する。これによって、定数決め打ちで演算ができるので、速くなる。JITにちょうど対応する命令を生成できる。