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
Lua
Luaのロゴ
パラダイム マルチパラダイムプログラミング、オブジェクト指向プログラミング関数型プログラミング手続き型プログラミングプロトタイプベース命令型プログラミング ウィキデータを編集
登場時期
  • 1993年 ウィキデータを編集
開発者 ロベルト・イエルサリムスキー ウィキデータを編集
最新リリース 5.4.6/ 2023年5月2日 (14か月前) (2023-05-02)[1]
型付け ダック・タイピング
主な処理系 Lua、LuaJITLLVM-LuaLua Alchemy
影響を受けた言語 C++CLU、Simple Object Language、DEL、SNOBOL、Modula、Modula-2Scheme ウィキデータを編集
影響を与えた言語 Io, JavaScript, Julia, Ruby, Squirrel, MoonScript
プラットフォーム クロスプラットフォーム ウィキデータを編集
ライセンス MIT License ウィキデータを編集
ウェブサイト www.lua.org ウィキデータを編集
拡張子 lua、luna、lunaire、anair ウィキデータを編集
テンプレートを表示
LuaJIT
作者 Mike Pall
最新版

2.0.5 / 2017年5月1日 (7年前) (2017-05-01)

最新評価版

2.1.0-beta3 / 2017年5月1日 (7年前) (2017-05-01)

リポジトリ https://github.com/LuaJIT/LuaJIT
プログラミング
言語
C言語
対応OS LinuxWindowsmacOS*BSDなど
対応言語 Lua
サポート状況 開発中
ライセンス MIT License
公式サイト luajit.org
テンプレートを表示

手続き型言語として、またプロトタイプベースオブジェクト指向言語としても利用することができ、関数型言語としての要素も併せ持っている[12]

名称の由来

編集

LuaLuaDEL (data entry language) SOL (simple object language) 2SOLLua[13]

概要

編集

LuaCLua VMLuaJIT The Computer Language Benchmarks Game [14]

TIOBE Programming Community Index20072011610[15]20092調[?][16]20133Lua[17]

MIT[18]

特徴

編集

LuaLua

Pascal調[19]Lua 5.3

LuaPerlPythonRuby[]LuaLua使

Lua 5.0 & 使Lua 5.1 Lua 

LuaJIT

編集

LuaJIT LuaJITMike PallJava[14]100[20]

Luaの歴史

編集

19930728 - Lua 1.0 

19950207 - Lua 2.1 

19970701 - Lua 3.0 

20001106 - Lua 4.0 

20030411 - Lua 5.0 MIT

20060221 - Lua 5.1 GC

20080822 - Lua 5.1.4 

20100514 - Lua 5.1.4-2 

20111216 - Lua 5.2.0 

20120614 - Lua 5.2.1 

20130327 - Lua 5.2.2 

20131207 - Lua 5.2.3 

20150106 - Lua 5.3.0 

20200629 - Lua 5.4.0 

LuaJIT

編集

20050908 - LuaJIT 1.0.3 

20060313 - LuaJIT 1.1.0 Lua 5.1

20060624 - LuaJIT 1.1.2 

20070524 - LuaJIT 1.1.3 

20080205 - LuaJIT 1.1.4 

20081025 - LuaJIT 1.1.5 

20100328 - LuaJIT 1.1.6 

20110505 - LuaJIT 1.1.7 

20120416 - LuaJIT 1.1.8 

20121108 - LuaJIT 2.0.0 

20130219 - LuaJIT 2.0.1 

20130603 - LuaJIT 2.0.2 

20140312 - LuaJIT 2.0.3 

20150514 - LuaJIT 2.0.4 

20170501 - LuaJIT 2.0.5 

コード例

編集

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はPOSIXECMAScript標準の正規表現とは異なる独自のカスタムパターンマッチングをサポートする[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の他言語用バインディングは公式には提供されていないが、有志によるサードパーティ製ライブラリやツールがいくつか存在する。バインディングを使うと、前述のような煩雑なスタック操作を明示的に記述することなく、簡潔に相互運用できるようになる。


LuaC++toLua[22] tolua++Lua 5.2[23][24]LuabindLua 5.2[25]Selene[26]Sol[27]Sol2[28]

Sol2使C++11C++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

LuajJavaLuaj 3.0Lua 5.2JavaJavaLuaC APIJNIJavaJNLua[29]

C#VB.NET.NET FrameworkLunaRoad[30]C#LuaMoonSharp[31]DLRNeoLua[32]

Luaを採用している製品

編集

ゲーム

編集

ゲーム以外

編集

脚注

編集

注釈

編集
  1. ^ TecgrafはComputer Graphics Technology Groupの意。正式名称はTecgraf Institute of Technical-Scientific Software Development of PUC-RioIUP (ソフトウェア)を開発[2]

出典

編集


(一)^ Lua: version history

(二)^ IUP (). www.wikidata.org. 2023517

(三)^  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. 202154

(六)^ The Evolution of an Extension Language: A History of Lua (). www.wikidata.org. 2023517

(七)^ Luiz Henrique de Figueiredo (20111111). Lua. staff.aist.go.jp. . 202154

(八)^ Lua: authors (). www.lua.org. 202154

(九)^ Roberto IerusalimschyLuiz Henrique de FigueiredoWaldemar Celes Filho

(十)^ Ierusalimschy, Roberto; Luiz Henrique de Figueiredo; Waldemar Celes Filho (1996). Luaan Extensible Extension Language. Software: Practice and Experience: 635652. doi:10.1002/(SICI)1097-024X(199606)26:6<635::AID-SPE26>3.0.CO;2-P. ISSN 0038-0644. OCLC 5156788062. 

(11)^ Lua[8]Lua - 20011214[9][10]Software : practice and experience266Wiley1996635-652Copyright © 1996 by John Wiley & Sons, Ltd.

(12)^ Ierusalimschy, Roberto (2009-03-10). A Text Pattern-Matching Tool Based on Parsing Expression Grammars. Software: Practice and Experience 39: 221258. doi:10.1002/spe.892.. ISSN 0038-0644. OCLC 5153232060. 

(13)^ 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 

(14)^ abx64 Ubuntu:Intel®Q6600®one core Computer Language Benchmarks Game. 20129162012916

(15)^ The Lua Programming Language, TIOBE Index, https://www.tiobe.com/tiobe-index/lua/ 

(16)^ Satori » The Engine Survey:General results

(17)^ Lua scripting, MediaWiki, (2020-09-14), https://www.mediawiki.org/wiki/Lua_scripting 

(18)^ Lua: license. www.lua.org. 202134

(19)^ Federico Biancuzzi 2010, pp. 176, 177.

(20)^ http://luajit.org/performance.html

(21)^  Lua 

(22)^ toLua home page

(23)^ Ariel Manzur (2009216). toLua++ - binding c/c++ code to lua (). 2014812201342 MIT License

(24)^ LuaDist/toluapp: tolua++ is an extension of toLua, a tool to integrate C/Cpp code with Lua

(25)^ luabind (). Products. Rasterbar Software (200741). 201342 MIT License

(26)^ Ong, Jeremy, Selene, https://github.com/jeremyong/Selene 201342 

(27)^ Danny (2023-04-19), Rapptz/sol, https://github.com/Rapptz/sol 2023517 

(28)^ Derpstorm, The Phantom (2023-05-16), sol2, https://github.com/ThePhD/sol2 2023517 

(29)^ JNLua (Java Native Lua) | Google Code Archive - Long-term storage for Google Code Project Hosting.

(30)^ 3F/LunaRoad: Lua C API for .NET :: LunaRoad represents flexible platform for work with Lua 5.1, 5.2, 5.3 ....

(31)^ MoonSharp

(32)^ neolithos/neolua: A Lua implementation for the Dynamic Language Runtime (DLR).

(33)^ abcFederico Biancuzzi 2010, p. 173.

(34)^  (PDF). 2019729

(35)^ FFXIV:

(36)^ WEB+DB PRESS Vol.90 2X RPG

(37)^ AutoTouch 

(38)^ FlashAir Developers -  - API - Lua

(39)^ darts/flow. 2013920

(40)^  loader_lua(8). FreeBSD Manual Pages. 20231231

(41)^ Components - OpenResty. 2013920

(42)^ Osm2pgsql - OpenStreetMap Wiki. 2013920

(43)^ TileMan. 2013920

(44)^ Lua .  .  (20121128). 2013328

(45)^ API

(46)^ Federico Biancuzzi 2010, p. 186.

関連書籍

編集

Lua20071225ISBN 978-4797342727http://www.sbcr.jp/products/4797342727.html201342 

:C/C++Lua2008930ISBN 978-4797348552http://www.sbcr.jp/products/4797348552.html201342 

 :LuaC/C++2010929ISBN 978-4797361667http://www.sbcr.jp/products/4797361667.html201342 

Roberto Ierusalimschy  Programming in Lua:Lua2009831ISBN 978-4048677974http://ascii.asciimw.jp/books/books/detail/978-4-04-867797-4.shtml201342Programming in Lua. 2nd ed. 

Lua:!︿I/O books20081225ISBN 978-4777514137http://www.kohgakusha.co.jp/books/detail/978-4-7775-1413-7201342 

Federico BiancuzziShane Warden7 Lua ,  ,  ,  ,  2010173-191ISBN 978-4-87311-471-2https://www.oreilly.co.jp/books/9784873114712/2019729 

関連項目

編集

外部リンク

編集