Perlテックブログ

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

コンスタントプールの再実装 - SPVM開発日記

SPVMはPerlの実装と、Java VMの仕様を読むことから始まり、両者のアイデアを取り入れながら、付け足したり、削ったりしながら微調整を繰り返しています。

SPVMは、Javaのコンスタントプールの機能を実装していたんだけれど、その後取り外してしまいました。

コンスタントプールよりも、mallocで、個々に確保するほうが、実装が簡単だよね、みたいな感じで。

さて、SPVMの文法と必要な機能が一通り完成してみると、次は、パフォーマンスを最適化するために、メモリ最適化を行うフェーズに入ってきた。

メモリを局所化するとパフォーマンスがよくなるという定石

Javaのコンスタントプールには、クラスごとに、キュキュット小さな領域に、関数の呼び出し情報の参照や、フィールド情報の参照や、文字列定数の参照、整数定数などが含まれている。

タッチするメモリの領域が小さくて、局所化されていれば、アプリケーションは、メモリアクセスの場合に、キャッシュヒット率が高くなると予想できる。

実メモリアクセスは、高価な処理で、できれば、キャッシュメモリ上にあるものを使えたほうがよい。

きっとこういう考え方で、コンスタントプールは、キュキュット小さな領域に収まるようになっているのだなぁという気がしてきた。

そこで、今日からは、SPVMのコンスタントプールの再実装に取り掛かります。

コンスタントプールの仕様

コンスタントプールはint32_t型の配列で、長さはuint16_tのサイズに収まるサイズです。これはちょうどSPVMのオペレーションコードのオペランドのサイズとなります。

コンスタントプールは、パッケージごとに、存在します。

コンスタントプールに含まれるものは以下の情報です。

サブルーチン呼び出しへの参照 int32_t
フィールド呼び出しへの参照 int32_t
パッケージ変数アクセスへの参照 int32_t
longとdoubleの定数 int32_tを二つ使う
文字列定数への参照 int32_tで長さを、バイト列を複数のint32_tに収める