Lua

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。Sendagaya428 (会話 | 投稿記録) による 2022年11月19日 (土) 04:15個人設定で未設定ならUTC)時点の版 (→‎ゲーム以外)であり、現在の版とは大きく異なる場合があります。

Lua
Lua
Luaのロゴ
パラダイム マルチパラダイムプログラミング、オブジェクト指向プログラミング関数型プログラミング手続き型プログラミングプロトタイプベース命令型プログラミング ウィキデータを編集
登場時期
  • 1993年 ウィキデータを編集
開発者 ロベルト・イエルサリムスキー ウィキデータを編集
最新リリース 5.4.4/ 2022年1月26日 (2年前) (2022-01-26)[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日 (6年前) (2017-05-01)
最新評価版
2.1.0-beta3 / 2017年5月1日 (6年前) (2017-05-01)
リポジトリ https://github.com/LuaJIT/LuaJIT
プログラミング
言語
C言語
対応OS LinuxWindowsmacOS*BSDなど
対応言語 Lua
サポート状況 開発中
ライセンス MIT License
公式サイト luajit.org
テンプレートを表示

Lua(ルア)はスクリプト言語およびその処理系の実装で、主にリオデジャネイロ・カトリカ大学英語版コンピュータ科学科 (Department of Computer Science) および/または同大学附属研究所のTecgraf/PUC-Rio[2][3]に所属する、Roberto IerusalimschyWaldemar Celes[4]Luiz Henrique de Figueiredo[5]らによって設計開発された[6][7]

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

名称の由来

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

概要

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

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

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

特徴

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

文法的な特徴としては、Pascalによく似た構文を採用していること、コルーチン協調的マルチタスク)のサポート[14]、数値型は整数浮動小数点数の区別がないこと(ただしLua 5.3では整数型が導入された)、関数を変数として扱えることなどが挙げられる。

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

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

LuaJIT

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

Luaの歴史

Lua

  • 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 リリース。

LuaJIT

  • 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 リリース。

コード例

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標準の正規表現とは異なる独自のカスタムパターンマッチングをサポートする[16]

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++言語で記述されたホストプログラムへ組み込むための省力化ツール(コードジェネレーター)および言語バインディングとして、toLua[17]、 tolua++(Lua 5.2非対応)[18][19]、Luabind(Lua 5.2非対応)[20]、Selene[21]、Sol[22]、Sol2[23]などが開発されている。

以下に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

Java

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

.NET

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

Luaを採用している製品

ゲーム

ゲーム以外

脚注

  1. ^ Lua: version history
  2. ^ Tecgraf Institute of Technical-Scientific Software Development of PUC-Rio
  3. ^ TecgrafはComputer Graphics Technology Groupの意。
  4. ^ Waldemar Celes (Filho)”. web.tecgraf.puc-rio.br. 2021年5月4日閲覧。
  5. ^ Luiz Henrique de Figueiredo (2011年11月11日). “Lua言語の紹介”. staff.aist.go.jp. 産業技術総合研究所. 2021年5月4日閲覧。
  6. ^ Lua: authors
  7. ^ Roberto Ierusalimschy、Luiz Henrique de Figueiredo、Waldemar Celes Filho「Lua - 機能拡張のためのプログラミング言語」上野豊(訳と編集)、産業技術総合研究所。公開期間終了の告知は2001年12月14日付。翻訳の原文は『Software Practice & Experience』第26巻第6号、1996年、635-652ページ。Copyright © 1996 by John Wiley & Sons, Ltd.
  8. ^ 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 
  9. ^ a b x64 Ubuntu:Intel®Q6600®one core Computer Language Benchmarks Game[リンク切れ]
  10. ^ “The Lua Programming Language”, TIOBE Index, https://www.tiobe.com/tiobe-index/lua/ 
  11. ^ Satori » The Engine Survey:General results
  12. ^ Lua scripting, MediaWiki, (2020-09-14), https://www.mediawiki.org/wiki/Lua_scripting 
  13. ^ Lua: license”. www.lua.org. 2021年3月4日閲覧。
  14. ^ Federico Biancuzzi 2010, pp. 176, 177.
  15. ^ http://luajit.org/performance.html
  16. ^ スクリプト化可能なアプリケーションに Lua を組み込む
  17. ^ toLua home page
  18. ^ Ariel Manzur (2009年2月16日). “toLua++ - binding c/c++ code to lua” (英語). 2013年4月2日閲覧。 “MIT License[リンク切れ]
  19. ^ LuaDist/toluapp: tolua++ is an extension of toLua, a tool to integrate C/Cpp code with Lua
  20. ^ luabind” (英語). Products. Rasterbar Software (2007年4月1日). 2013年4月2日閲覧。 “MIT License
  21. ^ jeremyong/Selene: Simple C++11 friendly header-only bindings to Lua
  22. ^ Rapptz/sol: A C++11 Lua wrapper
  23. ^ ThePhD/sol2: Sol v2.0 - a C++ <-> Lua API wrapper with advanced features and top notch performance - is here, and it's great! Documentation:
  24. ^ JNLua (Java Native Lua) | Google Code Archive - Long-term storage for Google Code Project Hosting.
  25. ^ 3F/LunaRoad: Lua C API for .NET :: LunaRoad represents flexible platform for work with Lua 5.1, 5.2, 5.3 ....
  26. ^ MoonSharp
  27. ^ neolithos/neolua: A Lua implementation for the Dynamic Language Runtime (DLR).
  28. ^ a b c Federico Biancuzzi 2010, p. 173.
  29. ^ ホムンクルス人工知能スクリプトマニュアル” (PDF). 2019年7月29日閲覧。
  30. ^ 「FFXIV:新生エオルゼア」プロデューサー吉田直樹氏インタビュー
  31. ^ WEB+DB PRESS Vol.90 特集2 ドラゴンクエストX開発ノウハウ大公開 国民的RPGオンライン化へのチャレンジ
  32. ^ AutoTouch 公式ホームページ
  33. ^ FlashAir Developers - ドキュメント - APIガイド - Lua機能
  34. ^ darts/flow”. 2013年9月20日閲覧。
  35. ^ Components - OpenResty”. 2013年9月20日閲覧。
  36. ^ Osm2pgsql - OpenStreetMap Wiki”. 2013年9月20日閲覧。
  37. ^ TileMan”. 2013年9月20日閲覧。
  38. ^ Lua スクリプト機能”. ヤマハネットワーク周辺機器 技術情報ページ. ヤマハ株式会社 (2012年11月28日). 2013年3月28日閲覧。
  39. ^ ボーカロイドストアでAPIリファレンスを配布している。
  40. ^ Federico Biancuzzi 2010, p. 186.

関連書籍

関連項目

外部リンク