Lua

LuaとLuaJITの概要と、LuaJITのLua 5.2との互換性について(2014年6月時点)

Last modified: 2021-08-05

概要

C/C++言語のプログラム内に組み込み、その中でスクリプトとして動作することを想定したプログラミング言語であり、この機能を提供するためのライブラリ(liblua)も指す。

制限の緩いMITライセンスであることや、他のスクリプト言語と比較して動作が高速であるとされることなどもあって、ゲームを含む商用プログラムなどに使われることも多い。

ライブラリ部分以外にも、PythonやPerlなどと同様にインタプリタとして単独で動作するプログラム(luaコマンド)も提供しており、これを用いるスクリプトを記述して(C/C++言語のプログラム内に組み込まずに)動かすこともできる。引数を付けずにインタプリタを実行するとPythonなどと同様に対話モードで動作し、-iオプションを付けてスクリプトの場所を指定すると、そのスクリプトの実行後に対話モードに入る。

他の用途として、アプリケーションの設定を行うための言語として使われることもある。

元の記事が公開された2014年6月時点の最新バージョンは5.2系だったが、その後5.3系と5.4系がリリース済み。

LuaJIT

lua.orgによる本家版のライブラリやインタプリタとは別に、プログラム実行時に機械語へのコンパイルを行って動かすことで本家版と比べて非常に高速に動作するLuaJITというソフトウェアが存在する。ライセンスは本家版と同様のMITライセンス。

本家版にあるluacというコマンドはプログラムの読み込みしか高速化できないが、LuaJITはプログラム内の処理が高速になる。

こちらにも機能をC/C++言語のプログラム内に組み込むためのライブラリ(libluajit)とインタプリタ(luajitコマンド)が存在する。

LuaJITには内部に統合されている形で “FFI Library” と呼ばれる追加機能が存在し、C言語で書かれたライブラリを開いてその中の機能を呼び出すことができる他、C言語のデータ型に基づく変数(構造体や共用体含む)を作成してこれを用いたプログラムを記述することで、プログラムの動作を高速化したりメモリ使用量を削減したりもできる。ただし、FFI Libraryを用いたプログラムはLuaJIT専用となり、本家版では動作しない。

LuaJITのバージョン番号の付き方は本家版とは異なり、対応する言語仕様についてもバージョン2.0系が本家版のバージョン5.1系に対応となっており、本家版のバージョン5.2系から使用可能になった機能は既存のLua 5.1向けに書かれたコードの互換性に影響しない範囲にある一部を除いて利用できない(例えば、goto文関係はバージョン5.2系から追加されたがLuaJITでも利用可)。

また、ソースを入手して

[引用]ファイル名:LuaJIT-[バージョン]/src/Makefileより
# Features from Lua 5.2 that are unlikely to break existing code are
# enabled by default. Some other features that *might* break some existing
# code (e.g. __pairs or os.execute() return values) can be enabled here.
# Note: this does not provide full compatibility with Lua 5.2 at this time.
#XCFLAGS+= -DLUAJIT_ENABLE_LUA52COMPAT

の部分の#XCFLAGS+=の行の最初の#を消してビルドすると追加で幾つかのLua 5.2との互換性が得られるが、既存のLua 5.1向けのプログラムの動作が一部変わる上に(LuaJITのバージョン2.0.3時点では)Lua 5.2と完全な互換性が得られるわけではない。また、ディストリのパッケージでこの設定が行われていない場合、追加の互換性を得たいのであれば自分でビルドしてそれを使用する必要がある。

LuaJITのライブラリの扱い方は本家版とAPI互換で同様に使用可能となっていて、更にLuaJITにはABIの互換性もあるため、Lua 5.1向けにビルドされた言語バインディングなどのC言語モジュールはそのままLuaJITでも使用できる。