Lua

Lua（ルア）はスクリプト言語およびその処理系の実装で、主にリオデジャネイロ・カトリカ大学（英語版）のコンピュータ科学科 (Department of Computer Science) および/または同大学附属研究所のTecgraf/PUC-Rioに所属するロベルト・イエルサリムスキー Roberto Ierusalimschy、Waldemar Celes、Luiz Henrique de Figueiredoらによって設計開発された。 手続き型言語として、またプロトタイプベースのオブジェクト指向言語としても利用することができ、関数型言語としての要素も併せ持っている。 Luaという名前は、ポルトガル語の「月」に由来する。もともとLuaはブラジルの石油会社であるペトロブラス内部でデータ入力用に開発された言語DEL (data entry language) と、レポート生成用に開発されたSOL (simple object language) の2つの簡易言語に由来する。SOLがポルトガル語で太陽を意味することから、新しい言語の名称はLua（月）になった。 Luaは、C言語のホストプログラムに組み込まれることを目的に設計されており、高速な動作と、高い移植性、組み込みの容易さが特徴である。いったんバイトコードにコンパイルされ、Lua VMで実行される。LuaJITは The Computer Language Benchmarks Game によると、動的型付けのスクリプト言語では最速の言語・処理系である。 TIOBE Programming Community Index（英語版）では2007年に人気が急上昇し、2011年6月には10番目に人気なプログラミング言語になったが、その後は人気が下がっている。2009年2月の調査で、ゲーム開発者がイベントスクリプト等の内部処理に利用する言語として、最も利用例が多いと報告されるなど、近年[いつ?]はゲーム産業での利用が広がっている。2013年3月以来、ウィキメディア財団のサイトではLuaをサポートしている。 MITライセンスのもと配布されている。 Luaの特徴としては、汎用性が高いが比較的容易に実装が可能である、というものである。実際のところLuaは、オブジェクト指向などといった他の要素としての働きを明白にはサポートしていないが、サポートしていない範囲においても容易に拡張が可能である。また前述のような、動作の高速性や優れた移植性なども大きな特徴である。 文法的な特徴としては、Pascalによく似た構文を採用していること、コルーチン（協調的マルチタスク）のサポート、数値型は整数と浮動小数点数の区別がないこと（ただしLua 5.3では整数型が導入された）、関数を変数として扱えることなどが挙げられる。 Luaはいわゆる汎用スクリプト言語であり、特定の用途に限定されない性質を持つが、同じく汎用スクリプト言語であるPerl、Python、Rubyと比較して高速に動作する[要出典]。これはLuaの理念である、簡素、高効率、高移植性を目指した実装の産物である。また、Luaにおけるテーブル（連想配列）の実装はかなり最適化されており、特にキーに数値のみを使用した場合は、単純な配列としてさらに高速に動作するようになる。 Lua 5.0以前はメモリ管理にマーク & スイープ方式のガベージコレクションが使用されていたが、Lua 5.1ではメモリ管理にインクリメンタル・ガベージコレクションが採用され、リアルタイム用途における性能の改善が図られている。ガベージコレクションの実装形態も Lua の高速動作および高リアルタイム性能に一役買っている。 LuaのJITコンパイラである LuaJITがMike Pallにより開発されている。動的型付けであるにもかかわらず、Javaよりも少し遅くなる程度の速度で動いている。静的単一代入などをつかった高度な最適化が行われており、バイトコードを実行する場合と比べて、数倍から数100倍の高速化が期待できる。 1993年07月28日 - Lua 1.0 リリース。 1995年02月07日 - Lua 2.1 リリース。 1997年07月01日 - Lua 3.0 リリース。 2000年11月06日 - Lua 4.0 リリース。 2003年04月11日 - Lua 5.0 リリース。MITライセンスの採用。 2006年02月21日 - Lua 5.1 リリース。インクリメンタルGCの採用。 2008年08月22日 - Lua 5.1.4 リリース。 2010年05月14日 - Lua 5.1.4-2 リリース。 2011年12月16日 - Lua 5.2.0 リリース。ビット演算ライブラリをサポート。 2012年06月14日 - Lua 5.2.1 リリース。 2013年03月27日 - Lua 5.2.2 リリース。 2013年12月07日 - Lua 5.2.3 リリース。 2015年01月06日 - Lua 5.3.0 リリース。整数型およびビット演算子のサポートなど。 2020年06月29日 - Lua 5.4.0 リリース。 2005年09月08日 - LuaJIT 1.0.3 リリース。最初の公開版。 2006年03月13日 - LuaJIT 1.1.0 リリース。Lua 5.1対応。 2006年06月24日 - LuaJIT 1.1.2 リリース。 2007年05月24日 - LuaJIT 1.1.3 リリース。 2008年02月05日 - LuaJIT 1.1.4 リリース。 2008年10月25日 - LuaJIT 1.1.5 リリース。 2010年03月28日 - LuaJIT 1.1.6 リリース。 2011年05月05日 - LuaJIT 1.1.7 リリース。 2012年04月16日 - LuaJIT 1.1.8 リリース。 2012年11月08日 - LuaJIT 2.0.0 リリース。 2013年02月19日 - LuaJIT 2.0.1 リリース。 2013年06月03日 - LuaJIT 2.0.2 リリース。 2014年03月12日 - LuaJIT 2.0.3 リリース。 2015年05月14日 - LuaJIT 2.0.4 リリース。 2017年05月01日 - LuaJIT 2.0.5 リリース。 print("Hello World") -- `--´から行末までコメント local a = {5, 3, 1, 4, 2} -- `{´と`}´はテーブルコンストラクタ for i = 2, #a do -- `#´は長さ演算子であり、`#a´はテーブルaのサイズ（ここでは5）を返す 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 コルーチンは状態遷移を記述するのに便利である。 -- Lua コルーチンによって非同期の状態遷移を同期的に記述する例。 -- 1を返している間は動作を続行中。0を返すと動作を完了。 function doAction() -- 4フレーム分だけ左へ移動。 for i = 1, 4, 1 do print("Move Left " .. i) coroutine.yield(1) end -- 1フレーム分だけ一時停止。 print("Pause") coroutine.yield(1) -- 3フレーム分だけ右へ移動。 for i = 1, 3, 1 do print("Move Right " .. i) coroutine.yield(1) end print("End") return 0 end local doActionAsync = coroutine.wrap(doAction) -- コルーチンの動作テスト。 -- 実際にはフレームごとに1回だけ呼び出す。 while doActionAsync() ~= 0 do end 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(myTable[i], "([^,]+)%,([^,]+)%,(.+)") print(string.format("Name = %q, HP = %d, MP = %d", name, tonumber(hp), tonumber(mp))) end LuaにはC言語向けの相互運用APIが用意されている。LuaからC/C++の関数を呼び出すためには以下の方法を用いる。下記のコードはC/C++の関数をLua VMに登録し、Luaスクリプト側から呼び出している。 #include <cstdio> #include <cstdlib> #include <lua.h> #include <lauxlib.h> int my_add(lua_State* L) { const int x = (int)lua_tonumber(L, 1); // 第1引数の取得。 const int y = (int)lua_tonumber(L, 2); // 第2引数の取得。 lua_settop(L, 0); // スタックのクリア。 const int ret = x + y; // C/C++ 側での演算。 lua_pushnumber(L, ret); // 返却値をプッシュ。 return 1; } int main(int argc, char* argv[]) { lua_State* L = luaL_newstate(); // Lua VM の初期化。 luaL_openlibs(L); // Lua の標準ライブラリを使えるようにする。 lua_register(L, "my_add", my_add); // Lua VM に C/C++ 関数を登録。 // my_add 関数を呼び出す Lua スクリプトを実行。 if (luaL_dostring(L, "print(my_add(5, 3))")) { lua_close(L); // Lua VM を閉じる。 return EXIT_FAILURE; // エラー終了。 } lua_close(L); return EXIT_SUCCESS; } 逆に、C/C++からLuaの関数を呼び出す際にもスタック操作が必要となる。 #include <cstdio> #include <cstdlib> #include <lua.h> #include <lauxlib.h> int main(int argc, char* argv[]) { lua_State* L = luaL_newstate(); // Lua VM の初期化。 // add_func 関数を定義する Lua スクリプトを実行。 if (luaL_dostring(L, "function add_func(x, y) return x + y end")) { lua_close(L); // Lua VM を閉じる。 return EXIT_FAILURE; // エラー終了。 } lua_getglobal(L, "add_func"); // Lua のグローバルオブジェクトである「add_func」を取得し、スタックに積む。 lua_pushinteger(L, 5); // 整数値の「5」を Lua スタックにプッシュ。 lua_pushinteger(L, 3); // 整数値の「3」を Lua スタックにプッシュ。 lua_call(L, 2, 1); // Lua 側で実装した add_func 関数を呼び出す。引数の数は2、結果の数は1。 printf("Result: %d\n", lua_tointeger(L, -1)); // 結果を表示。 lua_close(L); return EXIT_SUCCESS; } Luaの他言語用バインディングは公式には提供されていないが、有志によるサードパーティ製ライブラリやツールがいくつか存在する。バインディングを使うと、前述のような煩雑なスタック操作を明示的に記述することなく、簡潔に相互運用できるようになる。 LuaをC++言語で記述されたホストプログラムへ組み込むための省力化ツール（コードジェネレーター）および言語バインディングとして、toLua、 tolua++（Lua 5.2非対応）、Luabind（Lua 5.2非対応）、Selene、Sol、Sol2などが開発されている。 以下にSol2を使った例を示す（C++11およびC++14の機能を利用するため、対応コンパイラが必要）。 LuaからC/C++の関数を呼び出す例: #include <iostream> #include <sol.hpp> int add(int x, int y) { return x + y; } int main() { // Luaの初期化 sol::state lua; // Luaの標準ライブラリをすべて開く lua.open_libraries(sol::lib::base, sol::lib::coroutine, sol::lib::debug, sol::lib::debug, sol::lib::io, sol::lib::math, sol::lib::os, sol::lib::package, sol::lib::string, sol::lib::table, sol::lib::utf8); // LuaにC/C++の関数を登録 lua["add"] = add; // Luaスクリプトの読み込み try { lua.safe_script_file("test.lua"); } catch (const sol::error& e) { std::cout << e.what() << std::endl; } } C/C++の関数を呼び出すLuaスクリプト (test.lua): print(add(100, 200)) -- 「300」と表示される C++からLuaの関数を呼び出す例: #include <iostream> #include <sol.hpp> int main() { // Luaの初期化 sol::state lua; // Luaの標準ライブラリをすべて開く lua.open_libraries(sol::lib::base, sol::lib::coroutine, sol::lib::debug, sol::lib::debug, sol::lib::io, sol::lib::math, sol::lib::os, sol::lib::package, sol::lib::string, sol::lib::table, sol::lib::utf8); // Luaスクリプトの読み込み try { lua.safe_script_file("test.lua"); } catch (const sol::error& e) { std::cout << e.what() << std::endl; } // Luaの関数を呼び出す sol::function_result ret = lua["add"](100, 200); // 結果を表示する std::cout << ret.get<int>() << std::endl; } C++から呼び出される関数を定義するLuaスクリプト (test.lua): function add(a, b) return a + b end LuajというJava仮想マシン向けの実装がある。Luaj 3.0は、Lua 5.2相当の仕様をJavaで実装しなおしたものであり、Javaのクラスからバインダ無しでインスタンスを生成したりメソッドを呼び出したりすることが可能である。そのほか、LuaのC APIをJNI経由でJavaから利用可能にするJNLuaが存在する。 C#やVB.NETといった.NET Framework言語向けのバインディングとして、LunaRoadが存在する。C#で書かれたLuaインタプリタとしてMoonSharpが存在する。また、DLR上に実装されたNeoLuaが存在する。 Blue Mars CRYSIS Far Cry Factorio From the depths Garry's MOD Lost Wind RagnarokOnline Roblox Stomworks Xenepic Online Revo ソニック・ザ・ヘッジホッグ (2006年のゲーム) ソニック ワールドアドベンチャー（北米版のタイトルはSonic Unleashed） ティアーズ・トゥ・ティアラ 花冠の大地 THE IDOLM@STER 2 Warhammer Online:Age of Reckoning World of Warcraft カンパニー・オブ・ヒーローズ GRAVITY DAZE ニンテンドークラシックミニ ファミリーコンピュータ (エミュレータシステム kachikachi のゲーム選択画面で使用) PHANTASY STAR ONLINE 2 ファイナルファンタジーXIV ドラゴンクエストX 3DMLWプラグイン Adobe Photoshop Lightroom Aegisub Anime Studio Apache mod_lua Asterisk extensions.lua AutoTouch AviUtl Computercraft - MinecraftのMOD FlashAir - 無線LAN機能を搭載した東芝製SDHCメモリーカード FLOW - 設定に使われている FreeBSD - ブートローダのUI等を実装 LuaTeX MediaWiki（Scribunto拡張により） MySQL Proxy Nginx nmap OpenResty OpenWrt osm2pgsql - OpenStreetMapのデータをPostGISに読み込むユーティリティ Premake（英語版） Redis RigidChips Renoise Strata 3D Tachyon TileMan ヤマハのルータ製品 - RTXシリーズ(5000/3500/1300/1220/1210/1200/830/810) NVRシリーズ、FWX120、SRT100 Vim - ビルド時に有効化することで拡張スクリプト内でLuaを使用できる、派生のNeovimではLuaJITが内部的に利用されており組み込まれている VLC Media Player VOCALOID3 - ユーザー側で歌唱合成用データを加工するエフェクタを自作できる Wireshark [脚注の使い方] ^ TecgrafはComputer Graphics Technology Groupの意。正式名称はTecgraf Institute of Technical-Scientific Software Development of PUC-Rio、IUP (ソフトウェア)を開発。 ^ Lua: version history ^ “IUP” (英語). www.wikidata.org. 2023年5月17日閲覧。 ^ 学位論文、学術論文 Noemi de la rocque rodriguez (寄与者); Renato fontoura de gusmao cerqueira (寄与者); Roberto ierusalimschy (寄与者) (2004-03-19) (ポルトガル語). Integrating the lua language and the common language runtime. Fabio mascarenhas de queiroz (製作者). MAXWELL. OCLC 181065099 （Tese ou Dissertacao Eletronica）。 ^ 学位論文、学術論文 Noemi de la rocque rodriguez (寄与者); Renato fontoura de gusmao cerqueira (寄与者); Roberto ierusalimschy (寄与者); Silvana rossetto (寄与者) (2006-09-13) (ポルトガル語). Leonardo godinho da cunha (製作者). MAXWELL. OCLC 181067295  ^ “Waldemar Celes (Filho)”. web.tecgraf.puc-rio.br. 2021年5月4日閲覧。 ^ “The Evolution of an Extension Language: A History of Lua” (英語). www.wikidata.org. 2023年5月17日閲覧。 ^ Luiz Henrique de Figueiredo (11 November 2011). “Lua言語の紹介”. staff.aist.go.jp. 産業技術総合研究所. 2021年5月4日閲覧。 ^ “Lua: authors” (英語). www.lua.org. 2021年5月4日閲覧。 ^ 原文の執筆者はRoberto Ierusalimschy、Luiz Henrique de Figueiredo、Waldemar Celes Filho ^ Ierusalimschy, Roberto; Luiz Henrique de Figueiredo; Waldemar Celes Filho (1996). “Lua—an Extensible Extension Language”. Software: Practice and Experience: 635–652. doi:10.1002/(SICI)1097-024X(199606)26:6<635::AID-SPE26>3.0.CO;2-P. ISSN 0038-0644. OCLC 5156788062.  ^ Lua公式サイトの著作者一覧。論文の日本語訳「Lua - 機能拡張のためのプログラミング言語」（編集：上野豊）産業技術総合研究所の公開期間終了は2001年12月14日時点の告知あり。翻訳の原文は『Software : practice and experience』第26巻第6号（Wiley、1996年）、635-652ページに掲載。Copyright © 1996 by John Wiley & Sons, Ltd.。 ^ Ierusalimschy, Roberto (2009-03-10). “A Text Pattern-Matching Tool Based on Parsing Expression Grammars”. Software: Practice and Experience 39: 221–258. doi:10.1002/spe.892.. ISSN 0038-0644. OCLC 5153232060.  ^ Roberto Ierusalimschy; Luiz Henrique de Figueiredo; Waldemar Celes (2001), “The evolution of an extension language: a history of Lua”, Proceedings of V Brazilian Symposium on Programming Languages, https://www.lua.org/history.html  ^ a b “x64 Ubuntu:Intel®Q6600®one core Computer Language Benchmarks Game”. 2012年9月16日時点のオリジナルよりアーカイブ。2012年9月16日閲覧。 ^ “The Lua Programming Language”, TIOBE Index, https://www.tiobe.com/tiobe-index/lua/  ^ Satori » The Engine Survey:General results ^ Lua scripting, MediaWiki, (2020-09-14), https://www.mediawiki.org/wiki/Lua_scripting  ^ “Lua: license”. www.lua.org. 2021年3月4日閲覧。 ^ Federico Biancuzzi 2010, pp. 176, 177. ^ http://luajit.org/performance.html ^ スクリプト化可能なアプリケーションに Lua を組み込む ^ toLua home page ^ Ariel Manzur (2009年2月16日). “toLua++ - binding c/c++ code to lua” (英語). 2014年8月12日時点のオリジナルよりアーカイブ。2013年4月2日閲覧。 “MIT License” ^ LuaDist/toluapp: tolua++ is an extension of toLua, a tool to integrate C/Cpp code with Lua ^ “luabind” (英語). Products. Rasterbar Software (2007年4月1日). 2013年4月2日閲覧。 “MIT License” ^ Ong, Jeremy, Selene, https://github.com/jeremyong/Selene 2013年4月2日閲覧。  ^ Danny (2023-04-19), Rapptz/sol, https://github.com/Rapptz/sol 2023年5月17日閲覧。  ^ Derpstorm, The Phantom (2023-05-16), sol2, https://github.com/ThePhD/sol2 2023年5月17日閲覧。  ^ JNLua (Java Native Lua) | Google Code Archive - Long-term storage for Google Code Project Hosting. ^ 3F/LunaRoad: Lua C API for .NET :: LunaRoad represents flexible platform for work with Lua 5.1, 5.2, 5.3 .... ^ MoonSharp ^ neolithos/neolua: A Lua implementation for the Dynamic Language Runtime (DLR). ^ a b c Federico Biancuzzi 2010, p. 173. ^ “ホムンクルス人工知能スクリプトマニュアル” (PDF). 2019年7月29日閲覧。 ^ 「FFXIV:新生エオルゼア」プロデューサー吉田直樹氏インタビュー ^ WEB+DB PRESS Vol.90 特集2 ドラゴンクエストX開発ノウハウ大公開 国民的RPGオンライン化へのチャレンジ ^ AutoTouch 公式ホームページ ^ FlashAir Developers - ドキュメント - APIガイド - Lua機能 ^ “darts/flow”. 2013年9月20日閲覧。 ^ “loader_lua(8)”. FreeBSD Manual Pages. 31 December 2023閲覧。 ^ “Components - OpenResty”. 2013年9月20日閲覧。 ^ “Osm2pgsql - OpenStreetMap Wiki”. 2013年9月20日閲覧。 ^ “TileMan”. 2013年9月20日閲覧。 ^ “Lua スクリプト機能”. ヤマハネットワーク周辺機器 技術情報ページ. ヤマハ株式会社 (2012年11月28日). 2013年3月28日閲覧。 ^ ボーカロイドストアでAPIリファレンスを配布している。 ^ Federico Biancuzzi 2010, p. 186. 上野豊『入門Luaプログラミング』ソフトバンククリエイティブ、2007年12月25日。ISBN 978-4797342727。http://www.sbcr.jp/products/4797342727.html。2013年4月2日閲覧。  浜中誠『スクリプト言語による効率的ゲーム開発:C/C++へのLua組込み実践』ソフトバンククリエイティブ、2008年9月30日。ISBN 978-4797348552。http://www.sbcr.jp/products/4797348552.html。2013年4月2日閲覧。  浜中誠『スクリプト言語による効率的ゲーム開発 新訂版:LuaとC/C++連携プログラミング』ソフトバンククリエイティブ、2010年9月29日。ISBN 978-4797361667。http://www.sbcr.jp/products/4797361667.html。2013年4月2日閲覧。  Roberto Ierusalimschy 著、新丈径 訳『Programming in Lua:プログラミング言語Lua公式解説書』アスキー・メディアワークス、2009年8月31日。ISBN 978-4048677974。http://ascii.asciimw.jp/books/books/detail/978-4-04-867797-4.shtml。2013年4月2日閲覧。「Programming in Lua. 2nd ed.」  清水美樹『はじめてのLuaプログラミング:人気の軽量スクリプトでアプリケーション開発!』工学社〈I/O books〉、2008年12月25日。ISBN 978-4777514137。http://www.kohgakusha.co.jp/books/detail/978-4-7775-1413-7。2013年4月2日閲覧。  Federico Biancuzzi、Shane Warden「7章 Lua」『言語設計者たちが考えること』伊藤 真浩, 頃末 和義, 佐藤 嘉一, 鈴木 幸敏, 村上 雅章、オライリー・ジャパン、2010年、173-191頁。ISBN 978-4-87311-471-2。https://www.oreilly.co.jp/books/9784873114712/。2019年7月29日閲覧。  Squirrel グルー言語 Wikipedia:Lua - ウィキペディアにおけるLuaの解説ページ。 SciTE 公式ウェブサイト lua - GitHub Lua 5.3 Reference Manual - 公式の言語リファレンスマニュアル （英語） Lua 5.3 リファレンスマニュアル - 原著者に無断で日本語に訳した非公式のLua 5.3リファレンスマニュアル “Lua言語の紹介”. 2021年5月9日時点のオリジナルよりアーカイブ。2021年5月9日閲覧。 - 産業技術総合研究所 Luaj - sourceforge Lua入門講座 広井誠:「お気楽 Lua プログラミング超入門」 C/C++ 言語プログラマのための Lua 入門リファレンス 表示 編集