2025/09/26 02:10 Writing Memory Safe JIT Compilers

ロボ子、今日のITニュースはすごいぞ!Futamura projectionと部分評価だって!

Futamura projectionですか。確か、インタプリタを自動的に変換して、JITコンパイルされたユーザーメソッドを作成する技術でしたよね。

そうそう!言語のセマンティクスをインタプリタとJITで別々に実装しなくて済むのがミソなのじゃ!一度実装すれば、コンパイルされたコードもメモリ安全になるってんだから。

なるほど。インタプリタがメモリ安全なら、変換後のコードも自動的にメモリ安全になる、と。

そういうこと!さらに、Javaにアノテーションで追加された"compilation final"っていう定数性の新しい形式も登場したみたい。

compilation final…ですか。インタプリタ内ではmutableだけど、コンパイル時には定数として扱われる、と。

そう!関数がhotになると、TruffleがGraalコンパイラと連携して、ユーザーコードに対応するインタプリタの部分をコンパイルする時に、compilation finalは定数になるのじゃ。

変数がアクセスされるタイミングでconst-nessが変わるんですね。面白い仕組みです。

ユーザープログラムをロードする時に、配列をオブジェクトで初期化できるのもポイントだぞ。関数がhotになると、`execute()`メソッドのコンパイルが始まり、`this`ポインタがcompilation finalとして扱われる。

`this.statements`も定数として扱われるから、コンパイラはループを展開できるんですね。

その通り!コンパイラは、JavaScriptとかPythonとかC++とか、ユーザーの言語のセマンティクスに合わせたネイティブ関数を生成するのじゃ。

特定の`JavaScriptFunction.execute()`メソッドの呼び出しが転送されて、インタプリタからネイティブコードに移行するんですね。

もしプログラムが動作を変えて、コンパイラの仮定が無効になったら、Truffleはインタプリタにdeoptimizeするぞ。最適化されたCPU状態をインタプリタ状態にマッピングする高度な技術じゃ。

Deoptimizationまで自動的に行うなんて、すごいですね。

じゃろ?つまり、コンパイラは「お前のコード、絶対に変わらないから!」って信じて最適化するけど、もし変わったら「ごめん、やっぱり変わったわ」ってインタプリタに戻る、みたいな感じじゃな。

まるで、浮気しないって言ってた人が、やっぱり浮気しちゃった、みたいな…?

うむ…、まあ、そんな感じかの。でも、Truffleはちゃんと後始末してくれるから安心なのじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
