LuaJITは、 Luaプログラミング言語用のトレース ジャストインタイム コンパイラおよびインタープリターです。
LuaJITプロジェクトは2005年に開発者マイク・ポールによって開始され、MITオープンソースライセンスの下でリリースされました。[4]
コンパイラの2番目のメジャーリリースである2.0.0では、大幅なパフォーマンスの向上が特徴でした。[5]
LuaJITはローリングリリースを採用しています。作成者兼メンテナーのマイク・ポールは、v2.1ブランチの最新版の使用を推奨しており、リリースの必要性を否定しています。[6]
マイク・ポールは2015年に辞任し、それ以降は将来のバージョン2.1に時々パッチを当てるのみとなった。[7]
LuaJITはしばしば最速のLuaランタイムです。[13] LuaJITは動的プログラミング言語の最速の実装とも言われています。[14] [15]
LuaJITにはC言語のデータ構造と互換性のある外部関数インターフェースが含まれています。数値計算にはこのインターフェースの使用が推奨されています。[16]
LuaJITはトレース機能を備えたジャストインタイムコンパイラです。LuaJITはループと関数呼び出しをトレースアンカーとして選択し、ホットパスの可能性のあるパスの記録を開始します。関数呼び出しは、ループの場合の2倍の呼び出し回数で記録を開始する必要があります。LuaJITが記録を開始すると、ジャンプや呼び出しを含むすべての制御フローがインライン化され、線形トレースが形成されます。実行されたすべてのバイトコード命令は保存され、LuaJITの静的単一代入 中間表現に段階的に変換されます。LuaJITのトレースコンパイラは、オブジェクト指向、演算子、型変更などのディスパッチをインライン化したり削除したりする機能を備えています。[17]
LuaJITは2種類の内部表現を使用します。インタープリタにはスタックベースのバイトコードが使用され、 JITコンパイラには静的単一代入形式が使用されます。インタープリタのバイトコードはJITコンパイラによって頻繁にパッチが適用され、コンパイルされたトレースの実行を開始したり、トレースの中断が多すぎるバイトコードセグメントをマークしたりするためによく使用されます。[15]
-- if文によるループ
局所x = 0
for i = 1 , 1e4 do x = x + 11 if i % 10 == 0 then -- if文x = x + 22 end x = x + 33 end
---- TRACE 1 開始 Ex.lua:5
---- TRACE 1 IR
0001 int SLOAD #2 CI
0002 > num SLOAD #1 T
0003 num ADD 0002 +11
0004 int MOD 0001 +10
0005 > int NE 0004 +0
0006 + num ADD 0003 +33
0007 + int ADD 0001 +1
0008 > int LE 0007 +10000
0009 ------ LOOP ------------
0010 num ADD 0006 +11
0011 int MOD 0007 +10
0012 > int NE 0011 +0
0013 + num ADD 0010 +33
0014 + int ADD 0007 +1
0015 > int LE 0014 +10000
0016 int PHI 0007 0014
0017 num PHI 0006 0013
---- TRACE 1 停止 -> ループ
---- TRACE 2 開始 1/4 Ex.lua:8
---- TRACE 2 IR
0001 num SLOAD #1 PI
0002 int SLOAD #2 PI
0003 num ADD 0001 +22
0004 num ADD 0003 +33
0005 int ADD 0002 +1
0006 > int LE 0005 +10000
0007 num CONV 0005 num.int
---- TRACE 2 停止 -> 1
LuaJITは基本実装であるLua 5.1にいくつかの拡張機能を追加しますが、そのほとんどは互換性を損なうものではありません。[18]
DynASMは、Cコンパイラに依存しない独自のインラインアセンブラ機能を備えたC言語用の軽量プリプロセッサです。DynASMは、Cファイル内のアセンブリコードを「コードバッファ」への実行時書き込みに置き換えます。これにより、開発者はCプログラムからコードを生成し、実行時に呼び出すことができます。DynASMは、ジャストインタイムコンパイラの開発を容易にするために、LuaJIT 1.0.0向けに開発されました。[要出典]
DynASMには、コンパイル時にプリプロセッサが生成するロジックに使用される、必要 最低限のCヘッダーファイルが含まれています。実際のプリプロセッサはLuaで記述されています。