8

特に JIT と LuaJIT のトレース コンパイラについて調べたところ、いくつかの疑問が生じました。

私が理解していることから、LuaJIT の JIT は Java の HotSpot のようにホット メソッドをコンパイルせず、ループから発生するホット パスをコンパイルします。これは、何かがループから発生していない場合 (たとえば、C API から Lua 関数を呼び出している場合)、コードがジットされないということですか? そして、別のループにぶつかるとどうなりますか? 2 番目のループへのパスが JIT され、そのループからの新しいパスも JIT されますか、それとも 2 番目のループが同じパスの一部になりますか?

インタプリタはどのようにして最適なホット パスを選択しますか? int -> 文字列のハッシュテーブルがあるとしましょう。ここで、x が 3 と 5 である table[x] を呼び出して、それらがホット パスになり、jitted になったと想像してください。インタプリタは、x が 4 である table[x] に対して呼び出す jitted コードをどのように決定しますか?

私の頭を悩ませてきたもう一つのこと。関数ではなくパスがコンパイルされるため、トレース コンパイラはより多くのメモリを必要としませんか? 別のパスのコンパイル済みコードを実際に再利用することはできないので、パスはおそらく単一の関数よりも大きくなるため、一般的なケースでは...

4

2 に答える 2

13

Mike Pall は、LuaJIT メーリング リストで非常に詳細に応答しました。 http://www.freelists.org/post/luajit/How-does-LuaJITs-trace-compiler-work,1

于 2013-11-29T20:32:30.580 に答える
10

理解する必要がある最初の部分は、LuaJIT IRBytecodeです。これは wiki で確認できます。これは、LuaJIT インタープリターが実行および最適化するものであり、したがって、何をコンパイルする必要があるか、およびさまざまなものを決定するためにトレースを行います。トレース パス内のホット ループのループ展開などの最適化の追加として。

2 番目に確認する場所はLJ FAQで、次のように書かれています。

Q: LuaJIT で使用されているコンパイラ テクノロジについて、どこで詳しく知ることができますか?

LuaJIT の内部に関するドキュメントをさらに書く予定です。当面は、次の Google Scholar 検索を使用して、関連する論文を見つけてください。

検索:トレース コンパイラ

検索: JIT コンパイラ

検索:動的言語最適化

検索: SSA フォーム

検索:リニア スキャン レジスタの割り当て

以下は、LuaJIT の革新的な機能のリストです。そしてもちろん、ソースを読むことが悟りへの唯一の方法です。:-)

非常に皮肉を込めて言います(主に、マイクはドキュメントよりも開発に焦点を当てているためです)。最も重要な部分は最後の文です。ソースは非常にきれいで、LJがどのよう魔法を行うかを知る唯一の実際の方法です. さらに、革新的な機能のリンクは、何を検索するかについてのもう 1 つの手がかりも提供します。

ウィキペディアには、 JIT のトレースに関するより説明的なページがありますが、LJ ソースで使用されている概念を理解するのに最も役立つのは、一番下の論文です。

開始するためのソース ファイル (C) の一部

  • lj_record.c : コア トレース レコーダ、バイトコードを IR に変換
  • lj_trace.c : より多くのトレース管理
  • lj_snap.c : トレース スナップショットの処理/作成
  • lj_ffrecord.c : 高速関数のデータを記録します
  • lj_crecord.c : C データ操作を記録します
于 2013-11-29T10:44:48.210 に答える