LuaJITは、 Luaプログラミング言語用のトレース機能を備えたジャストインタイムコンパイラおよびインタプリタです。
LuaJITプロジェクトは2005年に開発者のマイク・ポールによって開始され、MITオープンソースライセンスの下で公開された。[ 4 ]
コンパイラの2番目のメジャーリリースである2.0.0では、パフォーマンスが大幅に向上しました。[ 5 ]
LuaJIT はローリング リリースを採用しています。作成者兼メンテナーの Mike Pall 氏は、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 コンパイラによって頻繁にパッチされます。[ 15 ]
-- if文を含むループローカルx = 0for 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 stop -> loop ---- TRACE 2 start 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 stop -> 1LuaJIT は、基本実装である Lua 5.1 にいくつかの拡張機能を追加しており、そのほとんどは互換性を損なっていません。[ 18 ]