Lua
Lua | |
---|---|
128px | |
拡張子 |
lua |
パラダイム | マルチパラダイム |
設計者 | TeCGraf |
最新リリース | 5.3.4 [1]/ 2017年1月12日 |
型付け | ダック・タイピング |
主な処理系 | Lua、LuaJIT、LLVM-Lua、Lua Alchemy |
プラットフォーム | クロスプラットフォーム |
ライセンス | MIT License (5.0以降) |
ウェブサイト | www.lua.org |
Lua(ルア)は、リオデジャネイロ・カトリカ大学の、主としてDepartment of Computer Science(コンピュータ科学科)and・or Computer Graphics Technology Group (Tecgraf) に属する、Roberto Ierusalimschy, Waldemar Celes, Luiz Henrique de Figueiredo らによって設計開発されたスクリプト言語およびその処理系の実装である。
手続き型言語として、また、プロトタイプベースのオブジェクト指向言語としても利用することができ、関数型言語、データ駆動型としての要素も併せ持っている。
Contents
概要
Luaは、C言語のホストプログラムに組み込まれることを目的に設計されており、高速な動作と、高い移植性、組み込みの容易さが特徴である。いったんバイトコードにコンパイルされ、Lua VMで実行される。LuaJITは The Computer Language Benchmarks Game によると、変数に型のないスクリプト言語では最速の言語・処理系である[2]。
TIOBE Programming Community Indexの2011年 6月版では10番目に人気なプログラミング言語である[3]。2007年に人気が急上昇した[4]。2009年 2月の調査で、ゲーム開発者がイベントスクリプト等の内部処理に利用する言語として、最も利用例が多いと報告されるなど、はゲーム産業での利用が広がっている[5]。
MITライセンスのもと配布されているため商用プロダクトにも組み込みやすい点も高く評価されている。
特徴
Luaの特徴としては、汎用性が高いが比較的容易に実装が可能である、というものである。実際のところLuaは、オブジェクト指向などといった他の要素としての働きを明白にはサポートしていないが、サポートしていない範囲においても容易に拡張が可能である。また前述のような、動作の高速性や優れた移植性なども大きな特徴である。
文法的な特徴としては、Pascalによく似た構文を採用していること、コルーチン(協調的マルチタスク)のサポート、数値型は整数と浮動小数点数の区別がないこと、関数を変数として扱えることなどが挙げられる。
Luaはいわゆる汎用スクリプト言語であり、特定の用途に限定されない性質を持つが、同じく汎用スクリプト言語である Perl、Python、Rubyと比較して高速に動作する。これはLuaの理念である、簡素、高効率、高移植性を目指した実装の産物である。また、Luaにおけるテーブル(連想配列)の実装はかなり最適化されており、特にキーに数値のみを使用した場合は、単純な配列としてさらに高速に動作するようになる。
Lua 5.0以前はメモリ管理にマーク & スイープ方式のガベージコレクションが使用されていたが、Lua 5.1ではメモリ管理にインクリメンタル・ガベージコレクションが採用され、リアルタイム用途における性能の改善が図られている。ガベージコレクションの実装形態も Lua の高速動作および高リアルタイム性能に一役買っている。
また、LuaをC++言語で記述されたホストプログラムへ組み込むための省力化ツールとして、 tolua++[6]、Luabind(5.2非対応)[7]などが開発されている。
また、LuajというJava仮想マシン向けの実装もある。これは、Lua 5.1相当の仕様をJavaで実装しなおしたものであり、Javaのクラスからバインダ無しでインスタンスを生成したりメソッドを呼び出したりすることが可能である。
LuaJIT
LuaのJITコンパイラである LuaJITがMike Pallにより開発されている。変数に型がないにもかかわらず、Javaよりも少し遅くなる程度の速度で動いている[2]。静的単一代入などをつかった高度な最適化が行われており、バイトコードを実行する場合と比べて、数倍から数100倍の高速化が期待できる[8]。
Lua の歴史
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 リリース。整数型およびビット演算子のサポートなど。
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 リリース。
コード例
Hello World
print("Hello World")
挿入ソート
-- `--´から行末までコメント
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
doActionAsync = coroutine.wrap(doAction)
-- コルーチンの動作テスト。
-- 実際にはフレームごとに1回だけ呼び出す。
while doActionAsync() ~= 0 do
end
正規表現
LuaはPOSIXやECMAScript標準の正規表現とは異なる独自のカスタムパターンマッチングをサポートする[9]。
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/C++の関数を呼び出すためには以下の方法を用いる。下記のコードはC/C++の関数をLua VMに登録し、Luaスクリプト側から呼び出している。
#include <stdio.h>
#include <stdlib.h>
#include <lua.h>
#include <lauxlib.h>
int my_add (lua_State *L)
{
int const x = (int) lua_tonumber (L, 1) ; // 第1引数の取得。
int const y = (int) lua_tonumber (L, 2) ; // 第2引数の取得。
lua_settop (L, 0) ; // スタックのクリア。
int const 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++ 関数を登録。
if (luaL_dostring (L, "print(my_add(5, 3))")) // Lua スクリプトを実行。
{
lua_close (L) ; // Lua VM を閉じる。
return EXIT_FAILURE ; // エラー終了。
}
lua_close (L) ;
return EXIT_SUCCESS ;
}
逆に、C/C++からLua関数を呼び出す際にもスタック操作が必要となる。
#include <stdio.h>
#include <stdlib.h>
#include <lua.h>
#include <lauxlib.h>
int main (int argc, char *argv[])
{
lua_State *L = luaL_newstate () ; // Lua VM の初期化。
if (luaL_dostring (L, "function add_func(x, y) return x + y end")) // Lua スクリプトを実行。
{
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 ;
}
C++の定義関数を呼び出す場合
Sol2というC++用のバイディングツールを使うと 上記で書いたことが簡単に実装できる(C++11とen:C++14の規格に沿って作られているので自然なバインドが可能になる)。
#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(sol::error& e){
std::cout << e.what() << std::endl;
}
}
これを呼び出す Lua側
print(add(100,200)) -- 「300」と表示される
Luaの定義関数をC++から呼び出す場合
以下のような Luaの定義関数を C/C++から呼び出すのも 先述した Luaから呼び出す関数と同じように呼び出すことができる。
function add(a, b)
return a + b
end
このLuaの定義関数 add をC++から呼び出すプログラムは以下のようになる。
#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(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;
}
Luaを採用している製品
ゲーム
- Blue Mars
- CRYSIS
- Far Cry
- Factorio
- From the depths
- Garry's MOD
- Lost Wind
- RagnarokOnline
- Roblox
- 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[10]
- ドラゴンクエストX[11]
ゲーム以外
- 3DMLWプラグイン
- Adobe Photoshop Lightroom
- Aegisub
- Anime Studio
- Apache mod_lua
- Asterisk extensions.lua
- AviUtl
- Computercraft - MinecraftのMOD
- FlashAir - 無線LAN機能を搭載した東芝製SDHCメモリーカード[12]
- FLOW - 設定に使われている [13]
- MediaWiki(Scribunto拡張により)
- MySQL Proxy
- Nginx
- nmap
- OpenResty[14]
- OpenWrt
- osm2pgsql - OpenStreetMap のデータをPostGISに読み込むユーティリティ[15]
- Redis
- RigidChips
- Renoise
- Strata 3D
- Tachyon
- TileMan[16]
- ヤマハのルータ (RTX1200、RTX810、SRT100、NVR500、FWX120)[17]
- LuaTeX
- Vim - ビルド時に有効化することで拡張スクリプト内でLuaを使用できる、派生のNeovimではLuaJITが内部的に利用されており組み込まれている
- VLC Media Player
- VOCALOID3 - ユーザー側で歌唱合成用データを加工するエフェクタを自作できる[18]
- Wireshark
- (ドキュメントはを参照)。
脚注
- ↑ Lua:download area
- ↑ 2.0 2.1 x64 Ubuntu:Intel®Q6600®one core Computer Language Benchmarks Game
- ↑ TIOBE Programming Community Index
- ↑ The Lua Programming Language - TIOBE Software:The Coding Standards Company
- ↑ Satori » The Engine Survey:General results
- ↑ Ariel Manzur (2009年2月16日). “toLua++ - binding c/c++ code to lua” (英語). . 2013閲覧. “MIT License”
- ↑ “luabind” (英語). Products. Rasterbar Software (2007年4月1日). . 2013閲覧. “MIT License”
- ↑ http://luajit.org/performance.html
- ↑ スクリプト化可能なアプリケーションに Lua を組み込む
- ↑ 「FFXIV:新生エオルゼア」プロデューサー吉田直樹氏インタビュー
- ↑ WEB+DB PRESS Vol.90 特集2 ドラゴンクエストX開発ノウハウ大公開 国民的RPGオンライン化へのチャレンジ
- ↑ FlashAir Developers - ドキュメント - APIガイド - Lua機能
- ↑ “darts/flow”. . 2013閲覧.
- ↑ “Components - OpenResty”. . 2013閲覧.
- ↑ “Osm2pgsql - OpenStreetMap Wiki”. . 2013閲覧.
- ↑ “TileMan”. . 2013閲覧.
- ↑ “Lua スクリプト機能”. ヤマハネットワーク周辺機器 技術情報ページ. ヤマハ株式会社 (2012年11月28日). . 2013閲覧.
- ↑ ボーカロイドストアでAPIリファレンスを配布している。
関連書籍
- 上野豊 『入門Luaプログラミング』 ソフトバンククリエイティブ、2007-12-25。ISBN 978-4797342727。アクセス日 2013-04-02。
- 浜中誠 『スクリプト言語による効率的ゲーム開発:C/C++へのLua組込み実践』 ソフトバンククリエイティブ、2008-09-30。ISBN 978-4797348552。アクセス日 2013-04-02。
- 浜中誠 『スクリプト言語による効率的ゲーム開発 新訂版:LuaとC/C++連携プログラミング』 ソフトバンククリエイティブ、2010-09-29。ISBN 978-4797361667。アクセス日 2013-04-02。
- Roberto Ierusalimschy 『Programming in Lua:プログラミング言語Lua公式解説書』 新丈径訳、アスキー・メディアワークス、2009-08-31。ISBN 978-4048677974。アクセス日 2013-04-02。「Programming in Lua. 2nd ed.」
- 清水美樹 『はじめてのLuaプログラミング:人気の軽量スクリプトでアプリケーション開発!』 工学社〈I/O books〉、2008-12-25。ISBN 978-4777514137。アクセス日 2013-04-02。
関連項目
- Squirrel
- グルー言語
- Wikipedia:Lua - ウィキペディアにおけるLuaの解説ページ。
- SciTE