実行時にILまたはバイトコードを実行可能命令に変換するJITインタープリタを設計するとします。コード内で変数名が見つかるたびに、JITインタープリタはそれをそれぞれのメモリアドレスに変換する必要があります。JITインタープリタは変数名をどのように扱うのですか?
実行可能な方法で変数参照を解決するために、JITインタプリタがどのような手法を使用しますか?彼らはハッシングを使用していますか、変数は事前にアドレスにコンパイルされていますか、まったく何かを逃していますか?
実行時にILまたはバイトコードを実行可能命令に変換するJITインタープリタを設計するとします。コード内で変数名が見つかるたびに、JITインタープリタはそれをそれぞれのメモリアドレスに変換する必要があります。JITインタープリタは変数名をどのように扱うのですか?
実行可能な方法で変数参照を解決するために、JITインタプリタがどのような手法を使用しますか?彼らはハッシングを使用していますか、変数は事前にアドレスにコンパイルされていますか、まったく何かを逃していますか?
一般的にJITを設計する方法のさまざまな答えがあるのと同様に、この質問には多種多様な回答があります。
しかし、一例を挙げると、JVMを考えてみましょう。 Javaバイトコードは実際にはデバッグ/リフレクションメタデータを除いて、変数名を全く含んでいません。代わりに、コンパイラは各変数に0から65535までの "インデックス"を割り当て、バイトコード命令がそのインデックスを使用します。しかし、VMは、必要に応じて自由にさらなる最適化を行うことができます。たとえば、すべてをSSA形式に変換してからマシンコードにコンパイルすると、変数がスタックフレーム内の機械レジスタまたは固定オフセットに変換されるか、完全に最適化されます。
もう1つの例を考えてみましょう。CPython。 Pythonは、高いレベルの柔軟な性質のため、実際には実行時に変数名を保持します。しかし、インターペラはまだいくつかの最適化を実行します。たとえば、属性が__slots__
のクラスは、フィールドに固定サイズの配列を割り当て、動的ルックアップにはname - > indexハッシュマップを使用します。私は実装に精通していませんが、ローカル変数と同様のことをしていると思います。通常のローカル変数アクセス(リフレクションを使用しない)は、コンパイル時に固定オフセットに変換できます。
だから要するに、
に対する答えは、彼らはハッシュを使用していますか、前もってのアドレスにコンパイル変数であるか、私は完全に何かが足りないのですか?
ははいです。
SSA形式のハッシングと名前ハッシングは、最も有望な候補の2つと思われます。 AOT世代とブレンドされたものは、使用される技術です。 –
プログラムの概念設計により適した[Programmers Exchange](http://programmers.stackexchange.com/)でこれを尋ねる方がよいかもしれません。 – Singular1ty
ありがとうございました。 –
Nit: "JITインタプリタ"は擬似語です。 JITコンパイラとインタプリタはしばしばパッケージ化されていますが、これらの用語は相互に排他的です。 –