最速の言語lua ~python hack-a-thon #3~

Post on 10-May-2015

14.001 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Python Hack-a-thon #3でLuaについて発表したときの資料です

TRANSCRIPT

最速の言語Lua~ベスト・オブ・組み込み言語~

2010年1月23日土曜日

自己紹介?Name:

Isoparametric(イソッパ)Blog:

神様なんて信じない僕らのためにhttp://d.hatena.ne.jp/Isoparametric/

2010年1月23日土曜日

はじまりはじまり一部、某世界一言語トークスby Python

の関係者にはご迷惑をおかけしますがご了承ください

2010年1月23日土曜日

LuaLua(ルア)は、リオデジャネイロ・カトリカ大学の情報工学科コンピュータグラフィックステクノロジーグループ TeCGraf

によって設計開発された手続き型言語である。手続き型言語の他、オブジェクト指向、関数型、データ駆動型としての要素も可能となっており、近年はゲーム産業などでの普及が加速している。Luaという名前は、ポルトガル語で月を意味する。Cのホストプログラムに組み込まれることを目的に設計されており、高速な動作と、高い移植性、組み込みの容易さが特徴である。いったんバイトコードにコンパイルされ、Lua VM で実行される。また、MIT Licenseのもと配布されているため商用プロダクトにも組み込みやすい点も高く評価されている。Luaの特徴としては、汎用性が高いが比較的容易に実装が可能である、というものである。実際のところLuaは、オブジェクト指向などといった他の要素としての働きを明白にはサポートしていないが、サポートしていない範囲においても容易に拡張が可能である。また前述のような、動作の高速性や優れた移植性なども大きな特徴である。文法的な特徴としては、Pascalによく似た構文を採用していること、コルーチン(協調的マルチタスク)のサポート、関数を変数として扱えることなどが挙げられる。

Luaはいわゆる汎用スクリプト言語であり、特定の用途に限定されない性質を持つが、同じく汎用スクリプト言語であるPythonやRubyと比較して高速に動作する。これはLuaの理念である、簡素、高効率、高移植性を目指した実装の産物である。また、Luaにおけるテーブル(連想配列)の実装はかなり最適化されており、特にキーに数値のみを使用した場合は、単純な配列としてさらに高速に動作するようになる。Lua5.0以前はメモリ管理にマーク&スイープ方式のガベージコレクション(GC)が使用されていたが、Lua5.1ではメモリ管理にインクリメンタルGCが採用され、リアルタイム用途における性能の改善が図られている。 なお、Pythonは参照カウント方式、Rubyは主にマーク&スイープ方式のGCを採用しているが、GCの実装形態もLuaの高速動作および高リアルタイム性能に一役買っている。また、LuaをC++言語で記述されたホストプログラムへ組み込むための省力化ツールとして、 tolua++、Luabind(ともにライセンス形態はMIT License)などが開発されている。2010年1月23日土曜日

LuaLua(ルア)は、リオデジャネイロ・カトリカ大学の情報工学科コンピュータグラフィックステクノロジーグループ TeCGraf

によって設計開発された手続き型言語である。手続き型言語の他、オブジェクト指向、関数型、データ駆動型としての要素も可能となっており、近年はゲーム産業などでの普及が加速している。Luaという名前は、ポルトガル語で月を意味する。Cのホストプログラムに組み込まれることを目的に設計されており、高速な動作と、高い移植性、組み込みの容易さが特徴である。いったんバイトコードにコンパイルされ、Lua VM で実行される。また、MIT Licenseのもと配布されているため商用プロダクトにも組み込みやすい点も高く評価されている。Luaの特徴としては、汎用性が高いが比較的容易に実装が可能である、というものである。実際のところLuaは、オブジェクト指向などといった他の要素としての働きを明白にはサポートしていないが、サポートしていない範囲においても容易に拡張が可能である。また前述のような、動作の高速性や優れた移植性なども大きな特徴である。文法的な特徴としては、Pascalによく似た構文を採用していること、コルーチン(協調的マルチタスク)のサポート、関数を変数として扱えることなどが挙げられる。

Luaはいわゆる汎用スクリプト言語であり、特定の用途に限定されない性質を持つが、同じく汎用スクリプト言語であるPythonやRubyと比較して高速に動作する。これはLuaの理念である、簡素、高効率、高移植性を目指した実装の産物である。また、Luaにおけるテーブル(連想配列)の実装はかなり最適化されており、特にキーに数値のみを使用した場合は、単純な配列としてさらに高速に動作するようになる。Lua5.0以前はメモリ管理にマーク&スイープ方式のガベージコレクション(GC)が使用されていたが、Lua5.1ではメモリ管理にインクリメンタルGCが採用され、リアルタイム用途における性能の改善が図られている。 なお、Pythonは参照カウント方式、Rubyは主にマーク&スイープ方式のGCを採用しているが、GCの実装形態もLuaの高速動作および高リアルタイム性能に一役買っている。また、LuaをC++言語で記述されたホストプログラムへ組み込むための省力化ツールとして、 tolua++、Luabind(ともにライセンス形態はMIT License)などが開発されている。

Wikipedia 見といて!!

注意:パクリです

2010年1月23日土曜日

1993年にリオデジャネイロ・カトリカ大学のTecgrafというグループが設計開発しました

Tecgrafは情報工学科コンピュータグラフィックステクノロジーグループだそうです

Luaとはポルトガル語で「月」を意味しています

スクリプト言語の中で最速の中の一つ!

C -> Lua -> Cなんて感じで既存の環境を拡張できる高い拡張性が売り!

2010年1月23日土曜日

某世界一言語トークスでPythonについて語った紅い人風に言うと

2010年1月23日土曜日

Pythonのように動的型付けのLLで、Cを簡単に拡張できて、自分自身もCで拡張でき、最速のLLで、非常にシンプルかつ強力、オブジェクト指向だってできるし、ANCI Cだけで書かれているのでCコンパイラがあればコンパイルでき、制御可能なインクリメンタルGCも持っていて、JavaScriptのprototype的な事もできる言語がLua

2010年1月23日土曜日

公式サイト曰く

2010年1月23日土曜日

Lua は強健な言語で、様々な採用実績があります

Luaは速いです

Luaはポータブルです

Luaは組み込むことができます

Luaはパワフルですが、シンプルです

Luaは小さいです

Luaはフリーです(MIT license)2010年1月23日土曜日

Luaのために作られたポスターですhttp://www.schulze-mueller.de/download/lua-poster-090207.pdf

2010年1月23日土曜日

Luaのために作られたポスターですhttp://www.schulze-mueller.de/download/lua-poster-090207.pdf

こんな環境でも動くんです!!(苦労はあると思うけどね)

2010年1月23日土曜日

あ誤

良 る解

*世界一言語トークスbyPythonのパクリです

2010年1月23日土曜日

2010年1月23日土曜日

たまに本気でそういうことを言う人がいますが当たり前なので気にしない

2010年1月23日土曜日

はい、冷静にこんな感じで「十倍以上遅いですが何か?」

2010年1月23日土曜日

一言で言うと非常に使いやすい言語ですオススメ!

2010年1月23日土曜日

採用実績は?組み込みシステム、モバイルデバイス、Webサーバ、ゲームなど、エトセトラエトセトラ

公式サイト曰く「Adobe's Photoshop Lightroom」や「ブラジルのデジタルテレビのGinga middleware」ゲームの「World of Warcraft」

高速で小さい言語なので非常に組み込みやすいです

グルー(糊)言語としても使われますよ

2010年1月23日土曜日

VSPython Lua

2010年1月23日土曜日

VSPython Luaごめん、嘘

2010年1月23日土曜日

言っておいてなんですが、比べる意味はあまりないです

一緒に使うこともあるかもしれませんが、あまりないかと思います(しかし、PerlやRubyと一緒に使われた事があるらしい)

日常で使うならPythonの方が色々できるでしょう! でも組み込みならLua!

ただ、Pythonも組み込み言語として使われますよね

Mayaとか、Inkscapeとか、ツールに組み込み易いのがPythonで、アプリに組み込み易いのがLuaとか思って戴けるといいね!

2010年1月23日土曜日

そういえばPy(ryとかいう言語が少ないとかいう事で有名な予約語Py(ry 2.6: and as assert break class continue def del elif else except exec finally for from global if import in is lambda not or pass print raise return try while with yield

Lua 5.1: and break do else elseif end false for function if in local nil not or repeat return then true until while

比べることすらおこがましい! 31 vs 21

だからどうだということはありませんが! 2010年1月23日土曜日

具体的なLuaの利点中間コードによるVM実行で高速、ミニマム(VMはレジスタベース)高速なハッシュテーブル柔軟な動的型付けコルーチンをサポートインクリメンタルGC

クロージャ

冗談は置いておいて

2010年1月23日土曜日

レジスタベース?

JavaVMも.NETのVMもスタックベース、というか伝統的なVMはほぼスタックベース

Perl6がレジスタベースだそうな

Lua曰く、広く使用される初めてのレジスタベースVMだろう!!

2010年1月23日土曜日

今日サクッと紹介すること

Lua言語構文の紹介

Luaのコルーチン

LuaとCとの連携時の注意点とか

2010年1月23日土曜日

はじめてのLua

2010年1月23日土曜日

print(“Hello World”)

% lua hello.lua

ハロワとか参考にならんし……

2010年1月23日土曜日

-- 数値を入力させ階乗を求めるコードfunction fact (n) if n == 0 then return 1 else return n * fact(n-1) endend

print("enter a number:")a = io.read("*number")print(fact(a))

2010年1月23日土曜日

ざっと構文いってみようソースみてもよくわからんし

2010年1月23日土曜日

コメントスタイル

2010年1月23日土曜日

コメントスタイル-- 行コメント

2010年1月23日土曜日

コメントスタイル-- 行コメント--[[ブロックコメント]]

2010年1月23日土曜日

コメントスタイル-- 行コメント--[[ブロックコメント]]

キモい?--[[print("Hello!!")--]]↓よくある小技----[[print("Hello!!")--]]

2010年1月23日土曜日

コメントスタイル-- 行コメント--[[ブロックコメント]]

キモい?--[[print("Hello!!")--]]↓よくある小技----[[print("Hello!!")--]]実に余談

--[=[...]=]のように[[と]]の間に好きな数の=をいれ対応する[[と]]を区別できる

2010年1月23日土曜日

型nil数値(number)ブール値(boolean)文字列(string)テーブル(table)関数(function)ユーザーデータ(userdata)スレッド(thread)

2010年1月23日土曜日

nil

nilは型であって、その値は勿論nilですグローバル変数を消去したりするには参照を切る==nilを代入すればいいです(ただしGCの回収対象になるだけ)何も代入されていない変数の初期値は

nilです

2010年1月23日土曜日

ブール値

条件式ではnilとfalseだけが「偽」です。0や空文字列はtrueですよー

2010年1月23日土曜日

数値

通常の数値は実数(倍精度浮動小数点)です整数型はありません

実はこれ環境によって不便なことも整数型を使うようにするPatchもありますが……

また、設定でfloatやlongを使うこともできます2010年1月23日土曜日

文字列

Luaでも文字列は文字列です(連続した文字です)

ヌル文字終端ではないので、0を含んだ任意の文字コードを格納できます

これは、任意のバイナリデータを文字列として扱えるということですちなみにimmutable(不変値)です

“文字列” ‘文字列’ -- シングルかダブルクォート

2010年1月23日土曜日

文字列連結が .. なのは独特

a = "1" + "1"をすると型変換で2になっちゃうb = "a" + "b"はエラーになる

b = “a” .. “b”が正解

2010年1月23日土曜日

Luaを柔軟にするテーブル

2010年1月23日土曜日

テーブル==ハッシュテーブル概ねそういう理解で良いんですが

2010年1月23日土曜日

そう、Luaで唯一のデータ構造なんです配列もレコードもテーブルで表現できるので

ないんです2010年1月23日土曜日

唯一といっても配列はほしくね?いえ、テーブルは配列としても使えるんです!ただし、インデックスは1から始まります

0から始めてはいけません配列のときだけ#(長さ)演算子が使えますまた、モジュールやパッケージの表現にも

テーブルが使われています

2010年1月23日土曜日

唯一といっても配列はほしくね?いえ、テーブルは配列としても使えるんです!ただし、インデックスは1から始まります

0から始めてはいけません配列のときだけ#(長さ)演算子が使えますまた、モジュールやパッケージの表現にも

テーブルが使われています配列のように使うと配列のようにデータを保持する最適化が入りますそこまでして配列をいれたくない!

2010年1月23日土曜日

これがLuaテーブルだ!

Header

key value“x” 9.2nil

value100200300nil

わざわざ別々に持つ!!!でもインデックスは1からだよ

忘れないで!2010年1月23日土曜日

関数関数はファーストクラス

(第一級オブジェクト)な値ですなので変数に関数を格納したり、

引数に渡したり、戻り値として返したりできます関数にはLua関数とC関数があり、

高効率が必要ならCで書けば良いんです2010年1月23日土曜日

関数には、何個引数を渡しても良いし、何個返り値を戻してもいいです

フリーダム!足りなかったりするとそれはnilになりますし、

余分だったりすると捨てられます何個引数が渡ってくるかわからないとき可変長引数 ... なんてものもありますこいつの正体もテーブルです

2010年1月23日土曜日

ユーザーデータとスレッドユーザーデータはCの任意のデータ型をLuaの変数に格納するためのものです代入と等価性テスト以外に、

事前に定義されている操作はありません新しい型を追加するために使います

スレッドはコルーチンのところでやりますね

2010年1月23日土曜日

localとdo~endLuaの変数は何も指定しないとグローバル変数になりますそこでキーワードlocal

ローカルのスコープは宣言されたブロックで、ブロックは制御構造のボディ、関数のボディ、チャンク=実行単位(変数

が宣言されているファイルもしくは文字列)になります

do -- do~endでブロック local a = 1 print(a) -- 参照できるendprint(a) -- 参照できない

2010年1月23日土曜日

算術演算子+(加算)-(減算)*(乗算) /(除算)^(累乗)%(余剰)単項-(符号反転)

関係演算子< > <= >= == ~=等価性はテーブル、ユーザデータ、関数の場合に参照が等しいかを見るので注意!

論理演算子and or notだけで、短絡評価ですよ

2010年1月23日土曜日

制御構文if、while、repeat、for

面白くないのでザッとね、ザッと

2010年1月23日土曜日

if

2010年1月23日土曜日

if op == “+” then r = a + belseif op == “-” then r = a - belseif op == “*” then r = a * belseif op == “/” then r = a / belse error(“invalid operation”)end

if

2010年1月23日土曜日

while

2010年1月23日土曜日

local i = 1while t[i] do print(t[i]) i = i + 1end

while

2010年1月23日土曜日

repeat

2010年1月23日土曜日

-- 空行以外の行が入力されたらそれを表示repeat line = io.read()untile line ~= “”print(line)-- 特色として、ループ内のlocal変数を条件部で参照できますlocal sqr = x/2repeat sqr = (sqr + x/sqr)/2 local err = math.abs(sqr^2 - x)untile err < x/10000 -- errを参照

repeat

2010年1月23日土曜日

for

2010年1月23日土曜日

for-- 数値形式for

for i=10,1,-1 do -- 初期値、上限値、増分値 print(i)end

-- ジェネリックfor

for i,v in ipairs(array) do print(v)end-- ジェネリックforはイテレータ関数が返す要素を全て走査します(この場合はipairs)

2010年1月23日土曜日

注意点breakとreturnで制御から抜けられますswitchはないよ!continueはないよ!(えどうもbreakとreturnで十分だろ? と考えているらしいcontinueを追加するPatchとかあるです隠してたけどビット演算がありません ライブラリはあるんですけど(5.2で標準ライブラリに!)

2010年1月23日土曜日

長くなるのでそろそろ割愛

2010年1月23日土曜日

2010年1月23日土曜日

コルーチン(co-routine)?

2010年1月23日土曜日

子・ルーチン?

2010年1月23日土曜日

違います

2010年1月23日土曜日

接頭辞co-は協調を意味

2010年1月23日土曜日

コルーチン(co-routine)は複数の実行スレッドを持つという意味でスレッドと似ています

独自のスタック、独自のローカル変数、独自のプログラムカウンタを持ちます

明示的な処理の継続/中断が可能です

その一方でグローバル変数などを他のコルーチンと共有します

2010年1月23日土曜日

スレッドとの大きな違いは、マルチスレッドではスレッドが並列実行されるのに対し、コルーチンは協調的に動作します

複数のコルーチンは、同時に1つのコルーチンしか動きません

コルーチンの実行が中断するのはコルーチンが明示的に中断を要求したときだけです

2010年1月23日土曜日

コルーチンはライブラリで実装されています

……が、CAPIからも作成でき、非常に便利で重要な機能です

coroutine.createcoroutine.resumecoroutine.runningcoroutine.statuscoroutine.wrapcoroutine.yield で構成されます(Lua側)

2010年1月23日土曜日

コルーチンは4つの状態を持ちます。これはcoroutine.statusで調べられます

suspended(中断)=初期状態

running(実行中)

dead(終了)

normal(通常)

2010年1月23日土曜日

co = coroutine.create( function () print("start") coroutine.yield() -- 中断 print("resume") end)-- co のtypeはthreadになりますcoroutine.resume(co) -- 開始coroutine.resume(co) -- 継続

--> start--> resume

こんな感じで使います

2010年1月23日土曜日

co = coroutine.create( function () print("start") coroutine.yield() -- 中断 print("resume") end)-- co のtypeはthreadになりますcoroutine.resume(co) -- 開始coroutine.resume(co) -- 継続

--> start--> resume

co = coroutine.create( function () print("start") local c = coroutine.create( function () print("nest coroutine start") coroutine.yield() print("nest coroutine resume") end ) coroutine.resume(c) coroutine.resume(c) coroutine.yield() print("resume") end)coroutine.resume(co) -- 開始coroutine.resume(co) -- 継続

こんな感じで使います

ネストもできるよ

2010年1月23日土曜日

croutine.createで生成する

croutine.resumeで開始再開する

croutine.yieldで中断する

最後まで実行したら終了

外部から終了させることはできない

2010年1月23日土曜日

ゲームだったらキャラクタにつき1スレッドとか持ってもいいし、1行動1スレッドでも良いし、イベントをコルーチン管理してもいい

……というか並列実行するものなら何でも使える

好きに使うのが正義っす

コルーチンってどう使う?

2010年1月23日土曜日

CとLuaのマリアージュどうやって連携するの?

2010年1月23日土曜日

スタック置き場C Lua

関数

文字列

文字列

数値実行

Lua空間にあるスタック置き場を使ってやりとりします

2010年1月23日土曜日

スタック置き場C Lua

関数

文字列 文字列

数値

CはLuaに呼んで欲しい関数とパラメータをスタックにおきます

実行

2010年1月23日土曜日

スタック置き場C Lua

関数

文字列

文字列

数値

LuaはCから依頼されるとスタックにあるものを使って実行します

実行

2010年1月23日土曜日

スタック置き場C Lua

関数

文字列

文字列

数値

LuaはCから依頼されるとスタックにあるものを使って実行します

実行

2010年1月23日土曜日

スタック置き場C Lua

関数

文字列

文字列

数値

実行が終わるとLuaは戻り値をスタックに詰みます

実行

2010年1月23日土曜日

Lua関数呼び出しに関してはラッパークラスを書くのが正解です

バインダを自動生成するプロダクトに任せると勝手にやってくれます

スタックはデフォルト20スロットですが、スタックを載せたままにしておくと直ぐ枯渇するので、なるべくC側でスタックを戻します

いちいちスタックを処理するコードを書くの?

2010年1月23日土曜日

実際に組み込んでみて編感想つーかなんつーか

2010年1月23日土曜日

意外とメモリを食う

ばりばりmalloc/free/reallocする

バインドが大変

デバッグが大変

動的エラーが大変

2010年1月23日土曜日

食うといっても数百KByteなんだけど

C関数を増やしていくだけでメモリを食ってしまう→関数名がキー、関数がエントリとなってテーブルが大きくなるから

対策として、リードオンリーテーブルを追加するLTR (Lua Tiny RAM) Patchなんてものがあります

意外とメモリ食い?

2010年1月23日土曜日

ばりばりアロケート

オブジェクトを生成破棄することが多いのでアロケートは頻繁

できるだけ小規模なアロケートに強いアロケータを使おう

自分はdlmallocを使いました

2010年1月23日土曜日

バインドが大変手でバインドを書くと大変面倒なので、バインドを自動化してくれるものを使いましょう

tolua++とか、luabindがあります

tolua++はソースの自動生成の部分がLuaで書かれていてカスタムも容易です

C++のクラスとかもバインドできますよ

2010年1月23日土曜日

デバッグが大変

専用のデバッガがないとprintfデバッグだけに

デバッグ・ライブラリがあるのでうまく使いましょう

Windowsだとデバッガ幾つかあるよ

2010年1月23日土曜日

動的エラーが大変動的言語なので仕方がないことですが、多くのエラーは動的にでます

トライ&エラーをする際に逆に面倒になることがあります

動的再読み込みをいれるか、静的解析をいれると良いです

2010年1月23日土曜日

予備知識

2010年1月23日土曜日

Cから作るLuaスレッドCからLuaのステート(実行単位)を生成すると、メインスレッドが一つできます

さらに、t = lua_newthread(L);のようにスレッドを作れます

スレッドは作成直後にはスタックにのっているので消されませんが、スタックから消えるとGCに回収されてしまいます

なので、スタックにのせたままにしておくか、レジストリに登録しておきます

Luaスレッドを明示的に破棄する手段はありませんが、参照を消しておけばやがてGCが回収してくれます

2010年1月23日土曜日

インクリメンタルGC

完全にストップしてしまうGCとは違って、段階を踏んでGCを実行できる仕組み

毎フレームちょびちょび回すとか、余裕があるときにだけ回すことも可能

ただし、その性質上GCが間に合わないこともある(ただ、実行量などカスタマイズ可能)

2010年1月23日土曜日

メタテーブルとメタメソッドテーブルに対する操作を変更できます

算術メタメソッドなら、__add, __sub, __mul, __div, __unm(符号反転),__mod(余剰),__pow(累乗)なんてのがあります

関係メタ演算子なら、__eq(等しい),__lt(より小さい),__le(以下)です

tostringといった文字列化なら__tostring

__indexを使うとテーブル参照に対するインデクス操作を変更できます

__newindexを使うとテーブル更新時の操作を変更できます

2010年1月23日土曜日

はじめてのメタメソッドmt = {}mt.__add = function (lhs, rhs) print(lhs, rhs, "mt._add") return lhsendhoge = {}foo = {}setmetatable(hoge, mt) -- メタテーブル上書きhoge = hoge + foo -- メタメソッドが呼ばれる

2010年1月23日土曜日

弱いテーブルって?ガベージコレクションの妨げにならない「弱い参照」という機能があります

Luaではこれをテーブルで実現しています

これが意味することは、弱いテーブルからしか参照されていないオブジェクトはガベコレの対象になるということです

キーも値も別々に弱くできます

メタテーブルのフィールド__modeで指定でき、ここに”k”があるとキーが弱くなり、”v”があると値が弱くなります

2010年1月23日土曜日

弱いキーのサンプルweak = {}mt = {__mode="k"} -- キーは弱くなりますsetmetatable(weak,mt) -- メタテーブルをセットしますkey = {} -- 一つ目のキーweak[key] = 1key = {} -- 二つ目のキーweak[key] = 2-- 一つ目のキーをガベコレで回収しますcollectgarbage() -- 無理矢理ガベコレfor k, v in pairs(weak) do print(v) end --> 2

2010年1月23日土曜日

グローバル変数もテーブルなんです

_Gがグローバル変数を管理するテーブル

a = “b”は_G[“a”] = “b”と同じです

通常のテーブルもa[“b”]とa.bは等価

勿論_Gにもメタテーブルが設定できますよ

2010年1月23日土曜日

オブジェクト指向

テーブルを使えばクラスも表現できるよ

クラスベースではなく、プロトタイプベースになるけどね

テーブルはt:hoge()と書くと、t.hoge(t)と書いたのと同じことになるんだ!

2010年1月23日土曜日

テーブルとメタメソッドを使った疑似クラスHoge = {value = 0}function Hoge:new(c) c = c or {} setmetatable(c, self) self.__index = self return cend

function Hoge:setValue(v) self.value = vend

h = Hoge:new()

print(h.value)h:setValue(100)print(h.value)

--> 0--> 100

h:setValue(100)はh.setValue(h,100)のシンタックスシュガーである

また、メタテーブルを使い、プロトタイプを設定できるhは自分の持ってない操作をHogeから探すようになるから

2010年1月23日土曜日

標準ライブラリ

2010年1月23日土曜日

数学ライブラリ(三角関数など)テーブルライブラリ追加/削除ソート連結

文字列ライブラリ(正規表現など)I/OライブラリOSライブラリデバッグライブラリ

2010年1月23日土曜日

Luaの現在とこれからカレントバージョンはLua 5.1.4 (2008-8-22)

開発バージョンはLua 5.2 (work2) (2010-1-13)

5.2では緊急用ガベージコレクタとか入ったり、いくつかのメタメソッド追加とかあったり、まだまだ進化するのがLua!

独自Patchも色々あるけど、たまにバグが……

2010年1月23日土曜日

まとめLuaは非常に使いやすい組み込み言語なので、アプリにスクリプトを組み込みたい場合に候補になるでしょう

スクリプトを使うだけなら気になりませんが、組み込むならそれなりのケアは必要です

でも、それでも良い言語ですよ!!

2010年1月23日土曜日

ご静聴ありがとうございました

2010年1月23日土曜日

top related