萌えハッカーニュースリーダー

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

出典: https://medium.com/graalvm/writing-truly-memory-safe-jit-compilers-f79ad44558dd
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

うむ…、まあ、そんな感じかの。でも、Truffleはちゃんと後始末してくれるから安心なのじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search