Lua

ptはスクリプト言語およびその処理系の実装で、主にリオデジャネイロ・カトリカ大学のコンピュータ科学科  および/または同大学附属研究所のTecgraf/PUC-RioTecgrafはlangに所属するロベルト・イエルサリムスキー pt、pt、ptらによって設計開発されたLua公式サイトの著作者一覧。

1. 名称の由来
--------

Luaという名前は、ポルトガル語の「月」に由来する。もともとLuaはブラジルの石油会社であるペトロブラス内部でデータ入力用に開発された言語DEL  と、レポート生成用に開発されたSOL  の2つの簡易言語に由来する。SOLがポルトガル語で太陽を意味することから、新しい言語の名称はLuaになった。

2. 概要
-----

Luaは、C言語のホストプログラムに組み込まれることを目的に設計されており、高速な動作と、高い移植性、組み込みの容易さが特徴である。いったんバイトコードにコンパイルされ、Lua VMで実行される。LuaJITは The Computer Language Benchmarks Game によると、動的型付けのスクリプト言語では最速の言語・処理系である。

TIOBE Programming Community Indexでは2007年に人気が急上昇し、2011年6月には10番目に人気なプログラミング言語になったが、その後は人気が下がっている。2009年2月の調査で、ゲーム開発者がイベントスクリプト等の内部処理に利用する言語として、最も利用例が多いと報告されるなど、近年はゲーム産業での利用が広がっている。2013年3月以来、ウィキメディア財団のサイトではLuaをサポートしている。

MITライセンスのもと配布されている。

3. 特徴
-----

Luaの特徴としては、汎用性が高いが比較的容易に実装が可能である、というものである。実際のところLuaは、オブジェクト指向などといった他の要素としての働きを明白にはサポートしていないが、サポートしていない範囲においても容易に拡張が可能である。また前述のような、動作の高速性や優れた移植性なども大きな特徴である。

文法的な特徴としては、Pascalによく似た構文を採用していること、コルーチンのサポートFederico Biancuzzi、数値型は整数と浮動小数点数の区別がないこと、関数を変数として扱えることなどが挙げられる。

Luaはいわゆる汎用スクリプト言語であり、特定の用途に限定されない性質を持つが、同じく汎用スクリプト言語であるPerl、Python、Rubyと比較して高速に動作するdate=2018年9月}}。これはLuaの理念である、簡素、高効率、高移植性を目指した実装の産物である。また、Luaにおけるテーブルの実装はかなり最適化されており、特にキーに数値のみを使用した場合は、単純な配列としてさらに高速に動作するようになる。

Lua 5.0以前はメモリ管理にマーク & スイープ方式のガベージコレクションが使用されていたが、Lua 5.1ではメモリ管理にインクリメンタル・ガベージコレクションが採用され、リアルタイム用途における性能の改善が図られている。ガベージコレクションの実装形態も Lua の高速動作および高リアルタイム性能に一役買っている。

4. LuaJIT
---------

LuaのJITコンパイラである LuaJITがMike Pallにより開発されている。動的型付けであるにもかかわらず、Javaよりも少し遅くなる程度の速度で動いている。静的単一代入などをつかった高度な最適化が行われており、バイトコードを実行する場合と比べて、数倍から数100倍の高速化が期待できる。

5. Luaの歴史
---------

5.1. Lua
--------

1993年7月28日 - Lua 1.0 リリース。
1995年2月7日 - Lua 2.1 リリース。
1997年7月1日 - Lua 3.0 リリース。
2000年11月6日 - Lua 4.0 リリース。
2003年4月11日 - Lua 5.0 リリース。MITライセンスの採用。
2006年2月21日 - Lua 5.1 リリース。インクリメンタルGCの採用。
2008年8月22日 - Lua 5.1.4 リリース。
2010年5月14日 - Lua 5.1.4-2 リリース。
2011年12月16日 - Lua 5.2.0 リリース。ビット演算ライブラリをサポート。
2012年6月14日 - Lua 5.2.1 リリース。
2013年3月27日 - Lua 5.2.2 リリース。
2013年12月7日 - Lua 5.2.3 リリース。
2015年1月6日 - Lua 5.3.0 リリース。整数型およびビット演算子のサポートなど。
2020年6月29日 - Lua 5.4.0 リリース。

5.2. LuaJIT
-----------

2005年9月8日 - LuaJIT 1.0.3 リリース。最初の公開版。
2006年3月13日 - LuaJIT 1.1.0 リリース。Lua 5.1対応。
2006年6月24日 - LuaJIT 1.1.2 リリース。
2007年5月24日 - LuaJIT 1.1.3 リリース。
2008年2月5日 - LuaJIT 1.1.4 リリース。
2008年10月25日 - LuaJIT 1.1.5 リリース。
2010年3月28日 - LuaJIT 1.1.6 リリース。
2011年5月5日 - LuaJIT 1.1.7 リリース。
2012年4月16日 - LuaJIT 1.1.8 リリース。
2012年11月8日 - LuaJIT 2.0.0 リリース。
2013年2月19日 - LuaJIT 2.0.1 リリース。
2013年6月3日 - LuaJIT 2.0.2 リリース。
2014年3月12日 - LuaJIT 2.0.3 リリース。
2015年5月14日 - LuaJIT 2.0.4 リリース。
2017年5月1日 - LuaJIT 2.0.5 リリース。

6. コード例
-------

6.1. Hello World
----------------

print

6.2. 挿入ソート
----------

-- `--´から行末までコメント local a = {5, 3, 1, 4, 2} -- `{´と`}´はテーブルコンストラクタ for i = 2, #a do -- `#´は長さ演算子であり、`#a´はテーブルaのサイズを返す for j = i, 2, -1 do if a[j - 1] <= a[j] then break end a[j], a[j - 1] = a[j - 1], a[j] end end

6.3. コルーチン
----------

コルーチンは状態遷移を記述するのに便利である。 -- Lua コルーチンによって非同期の状態遷移を同期的に記述する例。

-- 1を返している間は動作を続行中。0を返すと動作を完了。 function doAction -- 4フレーム分だけ左へ移動。 for i = 1, 4, 1 do print coroutine.yield end -- 1フレーム分だけ一時停止。 print coroutine.yield -- 3フレーム分だけ右へ移動。 for i = 1, 3, 1 do print coroutine.yield end print return 0 end

local doActionAsync = coroutine.wrap

-- コルーチンの動作テスト。 -- 実際にはフレームごとに1回だけ呼び出す。 while doActionAsync ~= 0 do end<WtXmlEndTag />

6.4. 正規表現
---------

LuaはPOSIXやECMAScript標準の正規表現とは異なる独自のカスタムパターンマッチングをサポートする。 local myTable = { "Gnome,160,30", "Sylph,100,70", "Salamander,200,20", "Ondine,140,60", } for i = 1, #myTable do local name, hp, mp = string.match%,%,") print, tonumber)) end

7. LuaとC/C++の相互運用
-----------------

LuaにはC言語向けの相互運用APIが用意されている。LuaからC/C++の関数を呼び出すためには以下の方法を用いる。下記のコードはC/C++の関数をLua VMに登録し、Luaスクリプト側から呼び出している。

include
include
include
include int my_add { const int x = lua_tonumber; // 第1引数の取得。 const int y = lua_tonumber; // 第2引数の取得。 lua_settop; // スタックのクリア。 const int ret = x + y; // C/C++ 側での演算。 lua_pushnumber; // 返却値をプッシュ。 return 1; }

int main { lua_State* L = luaL_newstate; // Lua VM の初期化。 luaL_openlibs; // Lua の標準ライブラリを使えるようにする。 lua_register; // Lua VM に C/C++ 関数を登録。 // my_add 関数を呼び出す Lua スクリプトを実行。 if )")) { lua_close; // Lua VM を閉じる。 return EXIT_FAILURE; // エラー終了。 } lua_close; return EXIT_SUCCESS; }<WtXmlEndTag /> 逆に、C/C++からLuaの関数を呼び出す際にもスタック操作が必要となる。

include
include
include
include int main { lua_State* L = luaL_newstate; // Lua VM の初期化。 // add_func 関数を定義する Lua スクリプトを実行。 if  return x + y end")) { lua_close; // Lua VM を閉じる。 return EXIT_FAILURE; // エラー終了。 } lua_getglobal; // Lua のグローバルオブジェクトである「add_func」を取得し、スタックに積む。 lua_pushinteger; // 整数値の「5」を Lua スタックにプッシュ。 lua_pushinteger; // 整数値の「3」を Lua スタックにプッシュ。 lua_call; // Lua 側で実装した add_func 関数を呼び出す。引数の数は2、結果の数は1。 printf); // 結果を表示。 lua_close; return EXIT_SUCCESS; }<WtXmlEndTag />

8. 言語バインディングの例
--------------

Luaの他言語用バインディングは公式には提供されていないが、有志によるサードパーティ製ライブラリやツールがいくつか存在する。バインディングを使うと、前述のような煩雑なスタック操作を明示的に記述することなく、簡潔に相互運用できるようになる。

8.1. C++
--------

LuaをC++言語で記述されたホストプログラムへ組み込むための省力化ツールおよび言語バインディングとして、toLua、 tolua++、Luabind、Selene、Sol、Sol2などが開発されている。

以下にSol2を使った例を示す。

LuaからC/C++の関数を呼び出す例:

include
include int add { return x + y; }

int main { // Luaの初期化 sol::state lua;

// Luaの標準ライブラリをすべて開く lua.open_libraries;

// LuaにC/C++の関数を登録 lua["add"] = add;

// Luaスクリプトの読み込み try { lua.safe_script_file; } catch  { std::cout << e.what << std::endl; } }<WtXmlEndTag /> C/C++の関数を呼び出すLuaスクリプト : print) -- 「300」と表示される

C++からLuaの関数を呼び出す例:

include
include int main { // Luaの初期化 sol::state lua;

// Luaの標準ライブラリをすべて開く lua.open_libraries;

// Luaスクリプトの読み込み try { lua.safe_script_file; } catch  { std::cout << e.what << std::endl; }

// Luaの関数を呼び出す sol::function_result ret = lua["add"];

// 結果を表示する std::cout << ret.get << std::endl; }<WtXmlEndTag /> C++から呼び出される関数を定義するLuaスクリプト : function add return a + b end

8.2. Java
---------

[1]というJava仮想マシン向けの実装がある。[2]は、Lua 5.2相当の仕様をJavaで実装しなおしたものであり、Javaのクラスからバインダ無しでインスタンスを生成したりメソッドを呼び出したりすることが可能である。そのほか、LuaのC APIをJNI経由でJavaから利用可能にするJNLuaが存在する。

8.3. .NET
---------

C#やVB.NETといった.NET Framework言語向けのバインディングとして、LunaRoadが存在する。C#で書かれたLuaインタプリタとしてMoonSharpが存在する。また、DLR上に実装されたNeoLuaが存在する。

9. Luaを採用している製品
---------------

9.1. ゲーム
--------

Blue Mars
CRYSIS
Far Cry
Factorio
From the depths
Garry's MOD
Lost Wind
RagnarokOnline
Roblox
Stomworks
Xenepic Online Revo
ソニック・ザ・ヘッジホッグ 
ソニック ワールドアドベンチャー
ティアーズ・トゥ・ティアラ 花冠の大地
THE IDOLM@STER 2
Warhammer Online:Age of Reckoning
World of Warcraft
カンパニー・オブ・ヒーローズ
GRAVITY DAZE
ニンテンドークラシックミニ ファミリーコンピュータ 
PHANTASY STAR ONLINE 2
ファイナルファンタジーXIV
ドラゴンクエストX

9.2. ゲーム以外
----------

3DMLWプラグイン
Adobe Photoshop Lightroom
Aegisub
Anime Studio
Apache mod_lua
Asterisk extensions.lua
AutoTouch
AviUtl
Computercraft - MinecraftのMOD
FlashAir - 無線LAN機能を搭載した東芝製SDHCメモリーカード
FLOW - 設定に使われている
LuaTeX
MediaWiki
MySQL Proxy
Nginx
nmap
OpenResty
OpenWrt
osm2pgsql - OpenStreetMapのデータをPostGISに読み込むユーティリティ
Redis
RigidChips
Renoise
Strata 3D
Tachyon
TileMan
ヤマハのルータ製品 - RTXシリーズ NVRシリーズ、FWX120、SRT100
Vim - ビルド時に有効化することで拡張スクリプト内でLuaを使用できる、派生のNeovimではLuaJITが内部的に利用されており組み込まれている
VLC Media Player
VOCALOID3 - ユーザー側で歌唱合成用データを加工するエフェクタを自作できる
Wireshark

10. 脚注
------

10.1. 注釈
--------

10.2. 出典
--------

11. 関連書籍
--------

12. 関連項目
--------

Squirrel
グルー言語
Wikipedia:Lua - ウィキペディアにおけるLuaの解説ページ。
SciTE

13. 外部リンク
---------

[3] - 公式の言語リファレンスマニュアル
[4] - 原著者に無断で日本語に訳した非公式のLua 5.3リファレンスマニュアル
[5] - 産業技術総合研究所
[6] - sourceforge
[7]
[8]
[9]