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