Lua
Lua(ルア)はスクリプト言語およびその処理系の実装で、主にリオデジャネイロ・カトリカ大学のコンピュータ科学科 (Department of Computer Science) および/または同大学附属研究所のTecgraf/PUC-Rio[注 1]に所属するロベルト・イエルサリムスキー Roberto Ierusalimschy[3][4]、Waldemar Celes[5][6]、Luiz Henrique de Figueiredo[7]らによって設計開発された[11]。
![]() Luaのロゴ | |
パラダイム |
マルチパラダイムプログラミング、オブジェクト指向プログラミング、関数型プログラミング、手続き型プログラミング、プロトタイプベース、命令型プログラミング ![]() |
---|---|
登場時期 | |
開発者 |
ロベルト・イエルサリムスキー ![]() |
最新リリース | 5.4.6/ 2023年5月2日[1] |
型付け | ダック・タイピング |
主な処理系 | Lua、LuaJIT、LLVM-Lua、Lua Alchemy |
影響を受けた言語 |
C++、CLU、Simple Object Language、DEL、SNOBOL、Modula、Modula-2、Scheme ![]() |
影響を与えた言語 | Io, JavaScript, Julia, Ruby, Squirrel, MoonScript |
プラットフォーム |
クロスプラットフォーム ![]() |
ライセンス |
MIT License ![]() |
ウェブサイト |
www |
拡張子 |
lua、luna、lunaire、anair ![]() |
作者 | Mike Pall |
---|---|
最新版 |
2.0.5 / 2017年5月1日 |
最新評価版 |
2.1.0-beta3 / 2017年5月1日 |
リポジトリ | https://github.com/LuaJIT/LuaJIT |
プログラミング 言語 | C言語 |
対応OS | Linux、Windows、macOS、*BSDなど |
対応言語 | Lua |
サポート状況 | 開発中 |
ライセンス | MIT License |
公式サイト |
luajit |
手続き型言語として、またプロトタイプベースのオブジェクト指向言語としても利用することができ、関数型言語としての要素も併せ持っている[12]。
名称の由来
編集概要
編集特徴
編集LuaJIT
編集Luaの歴史
編集Lua
編集LuaJIT
編集コード例
編集Hello World
編集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標準の正規表現とは異なる独自のカスタムパターンマッチングをサポートする[21]。
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/C++の相互運用
編集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の他言語用バインディングは公式には提供されていないが、有志によるサードパーティ製ライブラリやツールがいくつか存在する。バインディングを使うと、前述のような煩雑なスタック操作を明示的に記述することなく、簡潔に相互運用できるようになる。
C++
編集- 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
Java
編集.NET
編集Luaを採用している製品
編集ゲーム
編集- Blue Mars
- CRYSIS[33]
- Far Cry
- Factorio
- From the depths
- Garry's MOD
- Lost Wind
- RagnarokOnline[34]
- Roblox
- Stomworks
- Xenepic Online Revo
- ソニック・ザ・ヘッジホッグ (2006年のゲーム)
- ソニック ワールドアドベンチャー(北米版のタイトルはSonic Unleashed)
- ティアーズ・トゥ・ティアラ 花冠の大地
- THE IDOLM@STER 2
- Warhammer Online:Age of Reckoning
- World of Warcraft[33]
- カンパニー・オブ・ヒーローズ
- GRAVITY DAZE
- ニンテンドークラシックミニ ファミリーコンピュータ (エミュレータシステム kachikachi のゲーム選択画面で使用)
- PHANTASY STAR ONLINE 2
- ファイナルファンタジーXIV[35]
- ドラゴンクエストX[36]
ゲーム以外
編集- 3DMLWプラグイン
- Adobe Photoshop Lightroom[33]
- Aegisub
- Anime Studio
- Apache mod_lua
- Asterisk extensions.lua
- AutoTouch[37]
- AviUtl
- Computercraft - MinecraftのMOD
- FlashAir - 無線LAN機能を搭載した東芝製SDHCメモリーカード[38]
- FLOW - 設定に使われている[39]
- FreeBSD - ブートローダのUI等を実装[40]
- LuaTeX
- MediaWiki(Scribunto拡張により)
- MySQL Proxy
- Nginx
- nmap
- OpenResty[41]
- OpenWrt
- osm2pgsql - OpenStreetMapのデータをPostGISに読み込むユーティリティ[42]
- Premake
- Redis
- RigidChips
- Renoise
- Strata 3D
- Tachyon
- TileMan[43]
- ヤマハのルータ製品 - RTXシリーズ(5000/3500/1300/1220/1210/1200/830/810) NVRシリーズ、FWX120、SRT100[44]
- Vim - ビルド時に有効化することで拡張スクリプト内でLuaを使用できる、派生のNeovimではLuaJITが内部的に利用されており組み込まれている
- VLC Media Player
- VOCALOID3 - ユーザー側で歌唱合成用データを加工するエフェクタを自作できる[45]
- Wireshark[46]
脚注
編集注釈
編集- ^ TecgrafはComputer Graphics Technology Groupの意。正式名称はTecgraf Institute of Technical-Scientific Software Development of PUC-Rio、IUP (ソフトウェア)を開発[2]。
出典
編集関連書籍
編集関連項目
編集- 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 入門リファレンス