Perlテックブログ

ITエンジニアの成長意欲を刺激する技術考察、モジュール開発の日記。Perlイベントや国内や海外のPerlの記事の紹介。

SPVMのJITの実装とプリコンパイルとキャッシュ

今目指しているSPVMのJITの実装について語る。実行時コンパイルの手法はさまざまなんだけど、できる限りPerlishな方法で、実現したいと考えている。

パッケージ単位のJITコンパイル

一般的にJITコンパイルというと、関数単位のJITだ。JavaScriptのv8しかりJavaのHot Spotしかり。関数単位のJITで、機械語の生成のところは独自実装している。

一方SPVMは、パッケージ単位にしようと考えている。そして、独自実装ではなくって、C言語ソースファイルを作成して、gccやclangを使って、共有ライブラリを作成して、これを読み込む。これは、機械語になっている。

この方法は、そのなんというか、XSを使って、共有ライブラリを作成するのと、そっくりなんです。この感覚に近いものがいいかなと思う。

CPANモジュールとして配布するときは、ライブラリのディレクトリに共有ライブラリをコンパイルできるようにして、手元のライブラリで利用するときは、ビルドディレクトリの中に、共有ライブラリを、置いておけるようにする。

プリコンパイル

JITとはいうけれど、単に共有ライブラリを生成して、実行時に読み込むというだけ。これを事前にやるとプリコンパイル、実行時にやると実行時コンパイル(JIT)というわけ。

キャッシュ

コンパイルするわけだから、ちょいと時間がかかる。もし、生成する共有ライブラリが同じなんだったら、一度作って、再利用すると、初回のコンパイルだけになってよい感じ。

キャッシュを作る場合は、どうやって、同一性を保証するかというところが、大切。

  1. コンパイル前のC言語ソースコードが同じ
  2. コンパイルオプションが同じ

この二つの条件で、大丈夫かな。どうだろう。