Perlテックブログ

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

オンスタックリプレイスメント(on-stack replacement)の実装を進めなくちゃ

SPVMJITの実装を進めているだけれど、バージョン1.0に向けて、どうしても実装しておかないといけない機能がある。

それは、バイトコードのループの途中で、ループの回数が増えた時に、ループの途中でJITのコードをコンパイルして、そのまま処理を移し替えるオンスタックリプレイスメントだ。

JavaのHot Spotはもうとっくの昔に、実装している。

オンスタックリプレイスメントがないとどうなる

もしループ処理が初回に1億回、回って終わるまで待つとしたら、それが終わるまでJITできない。サブルーチンが1万回実行したら、JITしようという実装は、ループに対応ができない。

だから、ループの途中で、バイトコードからJITコンパイルされた機械語に切り替える処理が必要になる。

実装方法は、今考えている。

関数はデータ領域と処理からなる

プログラムというのは、関数の集まりだ。関数というのは、「引数やローカル変数といったデータ」と「そのデータを処理するための処理」から成り立っている。

処理をJITに差し替えるということは、データを共有できる形で持っておくか、コピーして移さないといけない。関数のデータは、一般的にはスタックと呼ばれる。

だから、このテクニックが、オンスタックリプレースメントっていう名前で呼ばれるわけだね。

google検索したけれど、オンスタックリプレースメントの実装に関しては日本語の記事はほぼない。Hot Spotもコードは複雑すぎるだろうしね。こういう場合は、想像と直観でプログラムするのさ。

そして、結果が合っていればOKなのさ。これが、ソフトウェア技術者のラッキーなところだね。