104
最速の言語Lua ~ベスト・オブ・組み込み言語~ 2010123日土曜日

最速の言語Lua ~Python Hack-a-thon #3~

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: 最速の言語Lua ~Python Hack-a-thon #3~

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

2010年1月23日土曜日

Page 2: 最速の言語Lua ~Python Hack-a-thon #3~

自己紹介?Name:

Isoparametric(イソッパ)Blog:

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

2010年1月23日土曜日

Page 3: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

2010年1月23日土曜日

Page 4: 最速の言語Lua ~Python Hack-a-thon #3~

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日土曜日

Page 5: 最速の言語Lua ~Python Hack-a-thon #3~

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日土曜日

Page 6: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

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

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

2010年1月23日土曜日

Page 7: 最速の言語Lua ~Python Hack-a-thon #3~

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

2010年1月23日土曜日

Page 8: 最速の言語Lua ~Python Hack-a-thon #3~

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

2010年1月23日土曜日

Page 9: 最速の言語Lua ~Python Hack-a-thon #3~

公式サイト曰く

2010年1月23日土曜日

Page 10: 最速の言語Lua ~Python Hack-a-thon #3~

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

Luaは速いです

Luaはポータブルです

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

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

Luaは小さいです

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

Page 11: 最速の言語Lua ~Python Hack-a-thon #3~

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

2010年1月23日土曜日

Page 12: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

2010年1月23日土曜日

Page 13: 最速の言語Lua ~Python Hack-a-thon #3~

あ誤

良 る解

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

2010年1月23日土曜日

Page 14: 最速の言語Lua ~Python Hack-a-thon #3~

2010年1月23日土曜日

Page 15: 最速の言語Lua ~Python Hack-a-thon #3~

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

2010年1月23日土曜日

Page 16: 最速の言語Lua ~Python Hack-a-thon #3~

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

2010年1月23日土曜日

Page 17: 最速の言語Lua ~Python Hack-a-thon #3~

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

2010年1月23日土曜日

Page 18: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

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

2010年1月23日土曜日

Page 19: 最速の言語Lua ~Python Hack-a-thon #3~

VSPython Lua

2010年1月23日土曜日

Page 20: 最速の言語Lua ~Python Hack-a-thon #3~

VSPython Luaごめん、嘘

2010年1月23日土曜日

Page 21: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

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

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

2010年1月23日土曜日

Page 22: 最速の言語Lua ~Python Hack-a-thon #3~

そういえば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日土曜日

Page 23: 最速の言語Lua ~Python Hack-a-thon #3~

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

クロージャ

冗談は置いておいて

2010年1月23日土曜日

Page 24: 最速の言語Lua ~Python Hack-a-thon #3~

レジスタベース?

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

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

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

2010年1月23日土曜日

Page 25: 最速の言語Lua ~Python Hack-a-thon #3~

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

Lua言語構文の紹介

Luaのコルーチン

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

2010年1月23日土曜日

Page 26: 最速の言語Lua ~Python Hack-a-thon #3~

はじめてのLua

2010年1月23日土曜日

Page 27: 最速の言語Lua ~Python Hack-a-thon #3~

print(“Hello World”)

% lua hello.lua

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

2010年1月23日土曜日

Page 28: 最速の言語Lua ~Python Hack-a-thon #3~

-- 数値を入力させ階乗を求めるコード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日土曜日

Page 29: 最速の言語Lua ~Python Hack-a-thon #3~

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

2010年1月23日土曜日

Page 30: 最速の言語Lua ~Python Hack-a-thon #3~

コメントスタイル

2010年1月23日土曜日

Page 31: 最速の言語Lua ~Python Hack-a-thon #3~

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

2010年1月23日土曜日

Page 32: 最速の言語Lua ~Python Hack-a-thon #3~

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

2010年1月23日土曜日

Page 33: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

2010年1月23日土曜日

Page 34: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

2010年1月23日土曜日

Page 35: 最速の言語Lua ~Python Hack-a-thon #3~

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

2010年1月23日土曜日

Page 36: 最速の言語Lua ~Python Hack-a-thon #3~

nil

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

nilです

2010年1月23日土曜日

Page 37: 最速の言語Lua ~Python Hack-a-thon #3~

ブール値

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

2010年1月23日土曜日

Page 38: 最速の言語Lua ~Python Hack-a-thon #3~

数値

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

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

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

Page 39: 最速の言語Lua ~Python Hack-a-thon #3~

文字列

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

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

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

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

2010年1月23日土曜日

Page 40: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

2010年1月23日土曜日

Page 41: 最速の言語Lua ~Python Hack-a-thon #3~

Luaを柔軟にするテーブル

2010年1月23日土曜日

Page 42: 最速の言語Lua ~Python Hack-a-thon #3~

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

2010年1月23日土曜日

Page 43: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

Page 44: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

2010年1月23日土曜日

Page 45: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

2010年1月23日土曜日

Page 46: 最速の言語Lua ~Python Hack-a-thon #3~

これがLuaテーブルだ!

Header

key value“x” 9.2nil

value100200300nil

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

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

Page 47: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

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

Page 48: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

2010年1月23日土曜日

Page 49: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

2010年1月23日土曜日

Page 50: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

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

2010年1月23日土曜日

Page 51: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

2010年1月23日土曜日

Page 52: 最速の言語Lua ~Python Hack-a-thon #3~

制御構文if、while、repeat、for

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

2010年1月23日土曜日

Page 53: 最速の言語Lua ~Python Hack-a-thon #3~

if

2010年1月23日土曜日

Page 54: 最速の言語Lua ~Python Hack-a-thon #3~

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日土曜日

Page 55: 最速の言語Lua ~Python Hack-a-thon #3~

while

2010年1月23日土曜日

Page 56: 最速の言語Lua ~Python Hack-a-thon #3~

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

while

2010年1月23日土曜日

Page 57: 最速の言語Lua ~Python Hack-a-thon #3~

repeat

2010年1月23日土曜日

Page 58: 最速の言語Lua ~Python Hack-a-thon #3~

-- 空行以外の行が入力されたらそれを表示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日土曜日

Page 59: 最速の言語Lua ~Python Hack-a-thon #3~

for

2010年1月23日土曜日

Page 60: 最速の言語Lua ~Python Hack-a-thon #3~

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日土曜日

Page 61: 最速の言語Lua ~Python Hack-a-thon #3~

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

2010年1月23日土曜日

Page 62: 最速の言語Lua ~Python Hack-a-thon #3~

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

2010年1月23日土曜日

Page 63: 最速の言語Lua ~Python Hack-a-thon #3~

2010年1月23日土曜日

Page 64: 最速の言語Lua ~Python Hack-a-thon #3~

コルーチン(co-routine)?

2010年1月23日土曜日

Page 65: 最速の言語Lua ~Python Hack-a-thon #3~

子・ルーチン?

2010年1月23日土曜日

Page 66: 最速の言語Lua ~Python Hack-a-thon #3~

違います

2010年1月23日土曜日

Page 67: 最速の言語Lua ~Python Hack-a-thon #3~

接頭辞co-は協調を意味

2010年1月23日土曜日

Page 68: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

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

2010年1月23日土曜日

Page 69: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

2010年1月23日土曜日

Page 70: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

2010年1月23日土曜日

Page 71: 最速の言語Lua ~Python Hack-a-thon #3~

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

suspended(中断)=初期状態

running(実行中)

dead(終了)

normal(通常)

2010年1月23日土曜日

Page 72: 最速の言語Lua ~Python Hack-a-thon #3~

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日土曜日

Page 73: 最速の言語Lua ~Python Hack-a-thon #3~

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日土曜日

Page 74: 最速の言語Lua ~Python Hack-a-thon #3~

croutine.createで生成する

croutine.resumeで開始再開する

croutine.yieldで中断する

最後まで実行したら終了

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

2010年1月23日土曜日

Page 75: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

好きに使うのが正義っす

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

2010年1月23日土曜日

Page 76: 最速の言語Lua ~Python Hack-a-thon #3~

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

2010年1月23日土曜日

Page 77: 最速の言語Lua ~Python Hack-a-thon #3~

スタック置き場C Lua

関数

文字列

文字列

数値実行

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

2010年1月23日土曜日

Page 78: 最速の言語Lua ~Python Hack-a-thon #3~

スタック置き場C Lua

関数

文字列 文字列

数値

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

実行

2010年1月23日土曜日

Page 79: 最速の言語Lua ~Python Hack-a-thon #3~

スタック置き場C Lua

関数

文字列

文字列

数値

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

実行

2010年1月23日土曜日

Page 80: 最速の言語Lua ~Python Hack-a-thon #3~

スタック置き場C Lua

関数

文字列

文字列

数値

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

実行

2010年1月23日土曜日

Page 81: 最速の言語Lua ~Python Hack-a-thon #3~

スタック置き場C Lua

関数

文字列

文字列

数値

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

実行

2010年1月23日土曜日

Page 82: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

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

2010年1月23日土曜日

Page 83: 最速の言語Lua ~Python Hack-a-thon #3~

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

2010年1月23日土曜日

Page 84: 最速の言語Lua ~Python Hack-a-thon #3~

意外とメモリを食う

ばりばりmalloc/free/reallocする

バインドが大変

デバッグが大変

動的エラーが大変

2010年1月23日土曜日

Page 85: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

意外とメモリ食い?

2010年1月23日土曜日

Page 86: 最速の言語Lua ~Python Hack-a-thon #3~

ばりばりアロケート

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

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

自分はdlmallocを使いました

2010年1月23日土曜日

Page 87: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

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

2010年1月23日土曜日

Page 88: 最速の言語Lua ~Python Hack-a-thon #3~

デバッグが大変

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

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

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

2010年1月23日土曜日

Page 89: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

2010年1月23日土曜日

Page 90: 最速の言語Lua ~Python Hack-a-thon #3~

予備知識

2010年1月23日土曜日

Page 91: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

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

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

2010年1月23日土曜日

Page 92: 最速の言語Lua ~Python Hack-a-thon #3~

インクリメンタルGC

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

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

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

2010年1月23日土曜日

Page 93: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

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

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

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

2010年1月23日土曜日

Page 94: 最速の言語Lua ~Python Hack-a-thon #3~

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

2010年1月23日土曜日

Page 95: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

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

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

2010年1月23日土曜日

Page 96: 最速の言語Lua ~Python Hack-a-thon #3~

弱いキーのサンプル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日土曜日

Page 97: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

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

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

2010年1月23日土曜日

Page 98: 最速の言語Lua ~Python Hack-a-thon #3~

オブジェクト指向

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

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

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

2010年1月23日土曜日

Page 99: 最速の言語Lua ~Python Hack-a-thon #3~

テーブルとメタメソッドを使った疑似クラス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日土曜日

Page 100: 最速の言語Lua ~Python Hack-a-thon #3~

標準ライブラリ

2010年1月23日土曜日

Page 101: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

2010年1月23日土曜日

Page 102: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

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

2010年1月23日土曜日

Page 103: 最速の言語Lua ~Python Hack-a-thon #3~

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

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

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

2010年1月23日土曜日

Page 104: 最速の言語Lua ~Python Hack-a-thon #3~

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

2010年1月23日土曜日