Lua

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
Lua
Lua-logo-nolabel.svg
パラダイム マルチパラダイム
設計者 TeCGraf
最新リリース 5.3.0 / 2015年1月6日(2か月前) (2015-01-06
型付け ダック・タイピング
主な処理系 Lua、LuaJITLLVM-LuaLua Alchemy
プラットフォーム クロスプラットフォーム
ライセンス MIT License
ウェブサイト www.lua.org
拡張子 lua
LuaJIT
作者 Mike Pall
最新版 2.0.3 / 2014年3月12日(12か月前) (2014-03-12
プログラミング言語 C言語
対応OS LinuxWindowsMac OS X、*BSDなど
対応言語 Lua
サポート状況 開発中
ライセンス MIT License
公式サイト luajit.org
テンプレートを表示

Lua(ルア)は、リオデジャネイロカトリカ大学の情報工学科コンピュータグラフィックステクノロジーグループTeCGrafによって設計開発されたスクリプト言語である。

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

Luaという名前は、ポルトガル語に由来する。

概要[編集]

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

TIOBE Programming Community Indexの2011年6月版では10番目に人気なプログラミング言語である[2]2007年に人気が急上昇した[3]。2009年2月の調査で、ゲーム開発者がイベントスクリプト等の内部処理に利用する言語として、最も利用例が多いと報告されるなど、近年はゲーム産業での利用が広がっている。[4]

MITライセンスのもと配布されているため商用プロダクトにも組み込みやすい点も高く評価されている。

特徴[編集]

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

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

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

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

また、Lua C++言語で記述されたホストプログラムへ組み込むための省力化ツールとして、 tolua++[5]Luabind(5.2非対応)[6]などが開発されている。

また、LuajというJava仮想マシン向けの実装もある。これは、Lua 5.1相当の仕様をJavaで実装しなおしたものであり、Javaのクラスからバインダ無しでインスタンスを生成したりメソッドを呼び出したりすることが可能である。

LuaJIT[編集]

LuaのJITコンパイラである LuaJITがMike Pallにより開発されている。変数に型がないにもかかわらず、Javaよりも少し遅くなる程度の速度で動いている[1]静的単一代入などをつかった高度な最適化が行われている。

Lua言語自体は、変数が型がなかったり、連想配列と配列が同じ表記法・オブジェクトだったり、クラスベースオブジェクト指向言語ではない点などが、JavaScript と似ているが(JavaScript はプロトタイプベース、Lua はメタテーブルベース)、2009年頃からJITコンパイラを搭載して高速化したJavaScriptの処理系と比べても大きく速い[要出典][7]

Lua の歴史[編集]

Lua[編集]

LuaJIT[編集]

コード例[編集]

Hello World[編集]

print("Hello World")

Lua と C/C++ の相互運用[編集]

Lua から C/C++ の関数を呼び出すためには以下の方法を用いる。

#include <stdio.h>
#include <stdlib.h>
#include <lua.h>
#include <lauxlib.h>
 
int my_add(lua_State* L)
{
    int x = (int)lua_tonumber(L, 1); // 第1引数の取得。
    int y = (int)lua_tonumber(L, 2); // 第2引数の取得。
    lua_settop(L, 0); // スタックのクリア。
    int ret = x + y; // C/C++ 側での演算。
    lua_pushnumber(L, ret); // 返却値をプッシュ。
    return 1;
}
 
int main(void)
{
    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 を閉じる。
        exit(EXIT_FAILURE); // エラー終了。
    }
    lua_close(L);
    return 0;
}

逆に、C/C++ から Lua 関数を呼び出す際にもスタック操作が必要となる。

#include <stdio.h>
#include <stdlib.h>
#include <lua.h>
#include <lauxlib.h>
 
int main(void)
{
    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 を閉じる。
        exit(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 0;
}

挿入ソート[編集]

a = {5, 3, 1, 4, 2}
for i = 2, #a do
    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を採用している製品[編集]

ゲーム[編集]

ゲーム以外[編集]

脚注[編集]

[ヘルプ]
  1. ^ a b x64 Ubuntu : Intel® Q6600® one core Computer Language Benchmarks Game
  2. ^ TIOBE Programming Community Index
  3. ^ The Lua Programming Language - TIOBE Software: The Coding Standards Company
  4. ^ Satori » The Engine Survey: General results
  5. ^ Ariel Manzur (2009年2月16日). “toLua++ - binding c/c++ code to lua” (英語). 2013年4月2日閲覧。 “MIT License
  6. ^ luabind” (英語). Products. Rasterbar Software (2007年4月1日). 2013年4月2日閲覧。 “MIT License(5.2非対応)
  7. ^ Lua LuaJIT ÷ JavaScript V8 − x64 Ubuntu : Intel® Q6600® one core Computer Language Benchmarks Game
  8. ^ 「FFXIV: 新生エオルゼア」プロデューサー吉田直樹氏インタビュー
  9. ^ darts/flow”. 2013年9月20日閲覧。
  10. ^ Components - OpenResty”. 2013年9月20日閲覧。
  11. ^ Osm2pgsql - OpenStreetMap Wiki”. 2013年9月20日閲覧。
  12. ^ TileMan”. 2013年9月20日閲覧。
  13. ^ Lua スクリプト機能”. ヤマハネットワーク周辺機器 技術情報ページ. ヤマハ株式会社 (2012年11月28日). 2013年3月28日閲覧。
  14. ^ ボーカロイドストアでAPIリファレンスを配布している。

関連書籍[編集]

関連項目[編集]

外部リンク[編集]