トップページtech
582コメント172KB

プログラミング言語 Lua

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
Lua について語ろう。

http://www.lua.org/
0286デフォルトの名無しさんNGNG
つーかエラーの意味がさっぱりわかんねえ。
これでどうしろと。
0287デフォルトの名無しさんNGNG
$ lua -v
Lua 5.0 (beta) Copyright (C) 1994-2002 Tecgraf, PUC-Rio
$ lua -e 'print((function()end)())'

$ lua -e 'a=(function()end)(); print(a)'
nil
0288デフォルトの名無しさんNGNG
>287
-eつかわないでやりたいんだけど
0289デフォルトの名無しさんNGNG
つーか5.0ってベータじゃん。そんなの使いたくねえ
0290デフォルトの名無しさんNGNG
>>289
んじゃこれ

$ lua4
Lua 4.0.1 Copyright (C) 1994-2000 TeCGraf, PUC-Rio
> function f() end
> print(f())

> a=f(); print(a)
nil
0291デフォルトの名無しさんNGNG
>290
そっちは通った。
なんで>>282はダメなの?
なんかLuaって構文的に変だよな。
0292デフォルトの名無しさんNGNG
>>291
ただ単に、
'(' 式 ')' '(' 引数リスト ')'
っていう構文が定義されてないだけでしょ。

5.0にあるHISTORYに
+ more general syntax for function calls (e.g. (print or write)(9)).
とか書いてあるから、>>282みたいな構文は5.0から新設されたんだと思われ。
0293デフォルトの名無しさんNGNG
>>291
4のころは
function foo() return function() end end
とは書けたけど、無名関数に適用する構文がなかった。
関数がファーストクラスオブジェクトな言語ではそれは不便なわけで、
実際5では使えるようになったわけで、喜ばしいんじゃないの。
0294デフォルトの名無しさんNGNG
>>282 は多値と値の個数の関係が気になったんでやってみた。
function f0() return end
function f2() return 1,2 end
に対して
a,b,c,d = f2(),f0(),f2(),f0() は a,b,c,d=1,2,1,2 か a,b,c,d = 1,2,nil,1,2 か。
しかし実際はどちらでもなく a,b,c,d = 1,nil,1,nil となる(>>278)。
では print(f2(),f0(),f2(),f0()) はどうか。
これは print(1,nil,1) と等価(省略可能な引数は値がなければ渡されないから)。
まあ仕組みは分かるんだけど、理屈は納得しにくい。
0295デフォルトの名無しさんNGNG
そんなことよりendがうざいんですけど。
英語メール打ってよ。
「日本ではendが不評です。
functionは長すぎです。」って。

あとさ、returnあるときと無いときってどうなってるの?
print(function()end)
ってreturn書いてないからエラーにすべきじゃないの?

a = function()end
print(a())

print(a(), 1)
nil 1
結果も違うし、おかしいよこれ。
0296デフォルトの名無しさんNGNG
print(a(),a())
nil
さっぱりわからん
0297デフォルトの名無しさんNGNG
>>295
値のない関数自体は悪くないんじゃない?
まあ明示的な return がなければ最後の値またはnilを返すというのもありだと思うが。
それから>>294もいってるように最後の引数は省略可能なので
print((function()end)()) は print() と同様の扱い。
0298デフォルトの名無しさんNGNG
もう一から設計し直した方がいい気がする・・・。
0299デフォルトの名無しさんNGNG
> function argn(...) print(arg.n) end
> function nul() end
> argn(nul())
0
> argn(nul(),nul())
1
> argn(nul(),nul(),nul())
2
0300デフォルトの名無しさんNGNG
>>297
そういうことじゃなくて、つまりさあ、
a()は値を返さない関数なわけだから、
他の関数の引数として使われた時点でエラーにでもしないと
辻褄合わないでしょって事。これじゃバグ埋めこみまくり。

print(a())
error: 値を返さない関数a()を引数に適用しました

とかなんとか。
もうだめぽ。
0301デフォルトの名無しさんNGNG
まー、確かに関数呼び出しの戻り値の評価のされ方が文脈依存ってのは、
ちょっと気持ち悪いかもな。
C言語APIいじってるとそのうち違和感なくなったりするんだがw
0302デフォルトの名無しさんNGNG
> a
error: `=' expected;
last token read: `<eof>' at line 1 in string "a"

もういいや。
疲れただけだった。
0303デフォルトの名無しさんNGNG
こんな感じで処理されてるんよ。多分。

・リスト(引数リスト、多値代入リスト)の途中に現れた場合、1個の戻り値が要求される
・リストの最後に現れた場合、戻り値がそのままリストに加えられる
・どちらの場合でも、戻り値が要求された個数に満たない場合はnilが補完される。
 また、多すぎる場合、先頭から要求された個数のみ使用される。
5.0からは次の場合が追加されてる。
・()で括られた場合、1個の戻り値が要求される。

んで、要求された個数だけ値がリストに加えられて、多値代入なり、
関数コールに使われるわけだね。
0304デフォルトの名無しさんNGNG
>>300
うーむ、どういうバグを埋め込んでしまうんだろう。。。?
0305デフォルトの名無しさんNGNG
>>304
値を返すつもりがreturn書いて無かった

エラー出ない

気付かない

動かない
0306デフォルトの名無しさんNGNG

Lua使えねえ

作者にスパムメール

タイーホ

(´・ω・`) ショボーン

仮釈放

復讐のオニ(`・ω・´)

作者にスパムメール

(繰り返し)
0307デフォルトの名無しさんNGNG
>>305
動的型付けの言語でそれを期待する方がおかしいと思うが…。
luaだけの問題じゃないし。
(というか、インタプリタでそういうえら出すやつってあんまりないような。)
0308デフォルトの名無しさんNGNG
っと、動的型付けはあんまり関係ないか。
0309デフォルトの名無しさんNGNG
>>307
ちゃんと読んでよ。
問題はそこじゃないくて、returnの付け忘れで値が変化することだろ。
防止できないならreturnなんて構文は無い方がいい。
ということ。
0310デフォルトの名無しさんNGNG
LISPとかRubyは全ての構文が値を返すという前提があるから
こういう問題は起きない。
0311デフォルトの名無しさんNGNG
ああ、なるほど。
>>298に同意。
0312デフォルトの名無しさんNGNG
RubyだってLISPだって「値を返すための処理」を付け忘れたら同じことになるんじゃない?

それともそのバグのある関数をほかの関数呼び出しの引数の最後にくっつけたとき、
渡される引数の個数が異なるのことを問題にしてる?
0313デフォルトの名無しさんNGNG
>>312
>>309
0314デフォルトの名無しさんNGNG
結局何が言いたいのかよく分からん

rubyなら、
def foo
 initialize()
 result = ...
finalize()
result
end
def foo
 initialize()
 result = ...
finalize()
end
で、値が違ってくるでしょ?
これは、luaのreturnありなしと同じことじゃない?
それともこんな書き方は「できない」ようにした方がいい?
0315デフォルトの名無しさんNGNG
>>312 >>314
つまりこういうこと。

> a = function() return 0 end
> b = function () a() end --return付け忘れた
> b()
> print(a())
0
> print(b())


あれれ・・
0316デフォルトの名無しさんNGNG
やっぱ設計し直した方がいいよこれ
0317デフォルトの名無しさんNGNG
>>315
やっぱり引数の数を問題にしてる?
それが問題になるのは、可変長引数の関数のときだけでしょ?

もしくは、本当に値のことなら、
def foo
 0
end
def foo
 0
 print "debug..."
end
とか、つまらんミスだけど完全には「防止」できないよね?
(俺には「値を返す場所が1つ」で「そこにreturnを付け忘れた」なんていうミスは
上と同列(文法を理解してない)に見える。)

まぁ、関数にreturnが一つでもついていたら、
「returnで値を返さないパスが存在します。」とかの
warningくらい出してくれてもバチは当たらないだろうけどね。
0318デフォルトの名無しさんNGNG
>>317
なんか、全然理解してくれてないね。
もういいよ。
0319デフォルトの名無しさんNGNG
ふうむ、もし return を無意味にするためにすべての構文が値を持つようにしたら、
代入文も値を持つので a = b = 0 とか出来るようになるが、
一方で a = b == 0 も合法になるので、
if a = 0 then ... end というありがちな罠が出来るわけだがその辺はどうよ。
0320デフォルトの名無しさんNGNG
うぅ。ほんとに理解できないんだよ。俺が馬鹿なのか?
誰かもっと実際にありえそうな例で解説してくれ。
0321デフォルトの名無しさんNGNG
>>320
あんたの好きなrubyの場合、
def a(x) print(x) end と def a(x) return print(x) end で a(1) は nil を返すし、
lispならそもそも return がないが、lua の場合、
function a(x) print(x) end と function a(x) return print(x) end は違うのが危ない
っていってんだろ。
0322デフォルトの名無しさんNGNG
> a = function(x) if x == 0 then return 0 else b() end end
> b = function()end
> print(a(b()))

> print(a(0))
0

確かに危険だなこれ。
0323デフォルトの名無しさんNGNG
PascalやVBで言う、「手続き」と「関数」がいっしょくたに書けてしまう
という事だな。
Luaは関数のくせに値を返さない可能性がある。
0324デフォルトの名無しさんNGNG
function やめて subroutine にすれば解決
0325デフォルトの名無しさんNGNG
>>324
その場合もfunctionで書いたとき、
return忘れをチェックできないと解決しない。
全ての関数が値を返すという前提で、
return削除するのが一番簡単で楽だと思うけど。
0326デフォルトの名無しさんNGNG
5.0とかバージョン番号は立派だが、まだ使える段階の言語じゃないな。
0.5の方がいいんじゃないのか。
0327デフォルトの名無しさんNGNG
>>325
returnはセミコロン(;)と同じ様に、あってもなくてもいい事にすれば、
修正も最小限で済むかな。
さらに変な言語になるけど。
0328デフォルトの名無しさんNGNG
>>325
いやいや、subroutine は本来値を持つものではないのよ。
しかし return によって値つきで戻ることが出来るわけで。
0329デフォルトの名無しさんNGNG
リターンなかったらnilを返すようにすればいい。
0330デフォルトの名無しさんNGNG
そもそも値を返さない function を用意したのはなぜなんだろ
単に構文要素 procedure をケチっただけなんだろうか
0331デフォルトの名無しさんNGNG
>>328
なんじゃそりゃ。

>>329
それも問題ある。
というか問題が変わってない。
0332デフォルトの名無しさんNGNG
作ったやつに大きな欠陥があるな。これは。
付き合いきれん。
0333デフォルトの名無しさんNGNG
 なんかウゼーやつが粘着してんな。ruby厨はどこ行ってもこうだよな。
気に入らないなら使わなきゃいい。これだけヌルいライセンスなんだから
解決策も上げずにクダクダ文句言うのはお門違いだ。キエロ
0334デフォルトの名無しさんNGNG
ruby厨逝ってよしには同意だが見てる限りじゃ文句いってるのはruby厨ではなさそう
0335デフォルトの名無しさんNGNG
・functionとprocedureを分ける。
・functionで、returnがない実行パスがあった場合エラー
・procedureは引数リストや代入の中で使えない
でOK?

parserの改造くらいですみそうだが。
0336デフォルトの名無しさんNGNG
>>333
解決策は上がってるじゃん。
つーかウザそうなやつって、真っ先にお前じゃねーか(w
0337デフォルトの名無しさんNGNG
そだな。よく読むとただのガイキチのようだ。スマヌ>ruby厨

 ところで、ちょっと前にも話題に出したのだけどlmem.c内のメモリ
確保/開放の所をトレースすると全くと言って良いほど開放が行われて
いないのね。試しにループコード書いてみたらメモリが100M近くまで
確保されても開放する気配もなかった。っていうか通常でも良く解か
らないタイミングでメモリ確保するのね。たとえば
a=1
これだけの行でも数個のメモリを確保してる。(しかも開放しやがらねー)

 生成したスレッドの開放手段も用意されてないし、クラスモドキは
作れてもデストラクタが作れないとか、いろいろと組み込みには問題が
山積みのような気がする。

 betaだからだと思いたいなぁ。
0338デフォルトの名無しさんNGNG
Luaの中の人も変だったな。
0339デフォルトの名無しさんNGNG
>>337
gc積んでるんじゃないの?
0340デフォルトの名無しさんNGNG
>>335
互換性考えるなら、>>325 and >>327
0341デフォルトの名無しさんNGNG
>>339
そそ、GC積んでるみたいなんだけど、開放タイミングが良く解からないのね。
っていうか、メモリ周りはもうちょっとクリーンに使えないとつらいねぇって話。
出来る事ならメモリ周りはlua_openの時のみ1回の確保にして貰えると助かる。
足りないときは例外投げて再確保とかがいいな。
0342デフォルトの名無しさんNGNG
>>337
というかそもそもl_free()ってreallocでしか使われてないじゃん。

GCの後余ったメモリをOSに返すようにするGCって稀なんじゃないかな。
コンパクションのときオブジェクト再配置でかかるコストとか馬鹿にならなそう出し。
んで、確保したメモリは1回メモリプールに置いといて、足らなくなりそうだったら
改めて確保するわけだ。だからタイミングが不定に思えるんでしょう。

前にメモリの断片化を心配してたみたいだけど、オブジェクトサイズは
ほぼ一定の大きさになるようにして、文字列とか不定長のやつは別管理にする
とかいうメモリ管理をするのが一般的だと思う、インタプリタでは。
(luaがどうなってるのかは知らないが。realloc()のコストが高そうだ…。)

まぁ、組み込み用途としては失格なのかもしれんが(組み込み機器なんかで使いたい場合は特に。)

デストラクタは、自分で作って明示的に呼びましょうってことじゃない?
Javaと同じく(Javaには一応あるけど事実上使えないよね)。
0343342NGNG
ソース見てみたけど、たしかにluaのメモリ管理はちょっとアレだね。
どかっとメモリ確保してそれを分割して使うわけじゃないのか。
ちなみに、4.0もほぼ同じコードなのでbetaとれても変わらないでしょう。

まぁ、lmem.cのreallocを自分で固定メモリ領域から取ってくるように
改造すれば対応可能だから、まだましか…?
そういうのを作ってコントリビュートしてみてもいいかもね。
0344デフォルトの名無しさんNGNG
>>343
うん。lmem.cを見る限りでは外部のallocaterを利用する事も考慮している
みたいなんよね。ただ、開放のタイミングがちょっとアレなので例えばメモ
リプールを64kとかするとあっという間に溢れちゃう。やっぱメモリは不要に
なった先から開放して欲しいっす。
 ここをなんとかしないととてもじゃないけど組み込みどころかPCでも使え
ないすね。っていうかどうゆう環境を想定してんだろ…。

 個人的にはメモリブロックを取得して保存/復帰が出来るようになれば
サイコーなんだけど…。
0345デフォルトの名無しさんNGNG
 あぁ、ごめん、ちょっと迂闊な事書いたかも。GCのしきい値を決める
void lua_setgcthreshold (lua_State *L, int newthreshold);
って関数があるね。

 ちとLuaをガベコレレスに改造するテストしてみようと思います。上手
くいったらレポートします。

 あとはスレッドの開放だな…。
void lua_closethread (lua_State *L, lua_State *thread);
はマニュアルに記述はあるのでそのうちFixされると思いたいのだが…。
0346デフォルトの名無しさんNGNG
PCだと、有名どころで
・Baldur's Gate
・MDK2
・Angband
とかあるね。
まぁ、どこで使われてるか、ってのも問題だけど。
BGはAIのところだっけ?
0347デフォルトの名無しさんNGNG
>>279 4/10 8:50〜の1日だけで投稿数68か。何かあったのかな?
荒らしでもなく、sage優先にしては記録的!
でも、ageると嵐が来そうなので、sageておこうっと。
0348デフォルトの名無しさんNGNG
>>347
Luaの仕様をちゃんと理解できないやつが難癖つけてただけじゃない?
0349デフォルトの名無しさんNGNG
>>337
free()で領域がOSに返るかどうかはlibc依存なんだがそういう話ではない?
現状ではOSに返らない環境の方が多いと思う。
0350デフォルトの名無しさんNGNG
>>349
そういう話ではない。
0351デフォルトの名無しさんNGNG
どういう話なんだかよくわからないな。

メモリが足りなくなった時に追加確保しないでゴミ掃除なりして欲しいってこと?
(ちゃんとソース読んでないけど) safe-point 方式っぽいからしょうがないんじゃないのかなあ。

参照カウント方式はカンベンしてほしいし。
0352デフォルトの名無しさんNGNG
>>337
top(1)で観察できるluaのコードは何かありますか?
0353デフォルトの名無しさんNGNG
GCは単純なマーク&スィープ方式だね。
こいつは、オブジェクトが多くなればなるほど時間がかかるという弱点を持ってる。

上の話は、言語で一括してメモリプールを取るんじゃなくて
オブジェクトを作るたびにmalloc()が走るからメモリ使用状況が
把握しにくいから嫌、って話じゃない?
んで、解決方法としては、malloc()のソースとか持ってくるなりして
アロケータを適当に書く、と。

実際には、言語内で確保したオブジェクトをプールしてるのか、
しばらくするとアロケータもGCもあんまり走らなくなるんだけどね。
(複雑なサンプルでは試してないけど、単純ループとか再帰とかでは。)
0354デフォルトの名無しさんNGNG
>>353
 コード追ってみました。ほぼ353氏のいうとおりですね。不思議なのは
最後にあるようにある程度走らせたらメモリの再利用らしき挙動が起こっ
てメモリの確保が行われなくなる事かな。ガベコレってそういうもんなの
かも知れないけど、これがちょっと困り者。

 ぶっちゃけ、自分が想定していた家庭用ゲームコンソールへの組み込み
はよほど扱いを限定しないとむつかしそうな感じです。PCゲーならOKかな?
0355デフォルトの名無しさんNGNG
えらい伸びようだなぁ〜
なんかGCにいちゃもんつけてる粘着がいるみたいだけど、
第一そんなにシビアな環境でなんでインタプリタ使うんだ??
俺には信じられんが。。。(w

まぁ、PCゲーあたりが現実的なターゲットかと。。
0356デフォルトの名無しさんNGNG
>>355
LuaのWikiでは、ゲームに使うためにGCを何とかしようとかいう議論もあったけどね。
インクリメンタルGCとか世代別GCとか。
俺的には、リアルタイム性という点では、mark&sweepより参照カウントのほうが
向いてると思うんだけどね。Luaを参照カウント方式にするのはかなり労力掛かると思うが…
で、保険としてmark&sweepも入れておくと。

全体的にLuaはメモリアロケーションが少なくてすむように設計されてるように見えるので、
メモリ管理関係にあんまりこだわるのも本質じゃないのかも(もう少しソース追わんと
はっきりとしたこといえないけど。)
ただ、Luaのソース上でのGC呼び出しタイミングとか見てみると、どうもmalloc()が失敗する
ことはほぼ無いという前提で作ってるように見えるので、組み込み系はちょっときついのも
確かか。
0357sageNGNG
やはり、luaはluaであって
汎用スクリプトには向かん見たいですね。
0358デフォルトの名無しさんNGNG
>>356
 Luaをガベコレレスにしようと一日格闘してみましたが、根が深くて相当
骨が折れますね。で、諦めて色々なケースでパフォーマンスのチェックをし
てみたのですが、普通の利用では30〜40kb程度で動くようです。複雑な再起
でも単純なループでも確保量があまり変わらないのでおそらくこの辺がLua
の標準プールサイズなのかと思われます。うーん…今の所はこれぐらいすね。

>>355
 別にいちゃもんつけてる訳じゃなくて、Luaの正確な挙動を把握しようと
しているだけ。汎用スクリプトとしてのLuaは非常に興味深いので。
まぁメモリアルゴリズムは組み込み用途に合わせて幾つかのアルゴリズムを
選択できると理想的なんだけどね。

 うーん、有意義な話題だと思ったが粘着扱いか…欝だ。
0359デフォルトの名無しさんNGNG
正直HSPの方がましだな
0360デフォルトの名無しさんNGNG
最近>>355みたいな検討違いなバカ多いね。
0361デフォルトの名無しさんNGNG
>>358
>  Luaをガベコレレスにしようと一日格闘してみましたが、根が深くて相当

漏れも Boehm-Demers-Weiser に変えたらどうなるか調べようと思ったけど、
2時間くらいでは終らなかった。
0362デフォルトの名無しさんNGNG
>>358
ガベコレレスなんてできるの?
できたら神、ってもう諦めたのかyo!
0363デフォルトの名無しさんNGNG
構文変えて、違う言語として公開したら、怒られますか?
0364デフォルトの名無しさんNGNG
怒られないよ。少なくとも5.0betaであれば。
それ以前のバージョンはライセンス読んでないから知らない。
0365デフォルトの名無しさんNGNG
じゃ、GOLuaでも作るか。
0366デフォルトの名無しさんNGNG
Lua5.0正式版リリースage

http://www.lua.org/ftp/lua-5.0.tar.gz
0367デフォルトの名無しさんNGNG
>>365
GとOは何の略でいく?

GNU Objective Lua・・・じゃ面白くないし
0368デフォルトの名無しさんNGNG

GOLua is Objective Lua

Luaが土台なら使えるものができるかも!
0369デフォルトの名無しさんNGNG
GOLua is not Overwrite 'Lua'
0370デフォルトの名無しさんNGNG
さてさて、vmを少し追って見たわけだけど、reallocが呼ばれる可能性があるのは、
・テーブルを作るとき
・テーブルサイズが大きくなるとき(グローバル変数定義含む)
・スレッドを作るとき
・ユーザオブジェクトを作るとき
・文字列操作をしたとき
・再起なのでスタックサイズが伸びたとき
・パーサが動いたとき(luaのインタラクティブモードだとこれでいっぱい確保される)
くらいだと分かりました(漏れがあるかもしれんけど)。

つまり、スタックサイズが十分にあれば、
・テーブルを作らない
・テーブルのメンバを増やしたり配列を伸ばしたりしない
・「深い」関数コールや深い再帰をしない
・文字列操作をしない
という条件下ではreallocはまったく呼ばれないみたいです。
当然オブジェクトも増えないからGCも呼ばれない。

上の話題でメモリが開放されないってのはつまり確保されてないからだね。
for i=0,10000 do a = {} end
こういうのを実行すれば定期的にGCが実行されてメモリが開放されてるのも分かるはず。
0371デフォルトの名無しさんNGNG
ついでに固定メモリ(配列)からメモリ確保を行うように独自アロケータを作ってみた。
ほんとはlibcとかのmalloc.cとかまともなのもって来たほうがいいんだと思うんだけど、
読むのめんどくさいので超適当なやつ。
Luaは小さいメモリをたくさん確保するので、それにあわせてみた。

↓差分ファイル。 patchに食わせてね。
http://up.your2ch.net/1050171092.txt

メモリ確保は早くなってるみたい。
% time ./lua -e 'for i=0,10000000 do a = {} end'
4.046u 0.015s 0:04.12 98.3% 129+5465k 0+0io 0pf+0w
% time lua -e 'for i=0,10000000 do a = {} end'
6.429u 0.000s 0:06.50 98.7% 128+240k 0+0io 4pf+0w
0372デフォルトの名無しさんNGNG
>>371
 うわ、またしても神登場だ。ただ、問題視されているのは
for i=0,10000 do a = {} end
で必要とされているメモリはa = {}だけなのにGCの開放タイミングが微妙
なお陰で十数kb近くの確保が行われちゃう事なのね。だから参照カウンタ
方式にして不必要になったらすぐ開放しちゃって欲しいって訳。

 あと、1/60sceとかでループをまわすゲーム用途にはGCが働いた時に負荷
が偏るのも宜しくない訳です。

 うーんでもこの調子で皆でパッチを当てあえばそのうち何とかなりそう
だね。GoLuaができる日も近そうだ。漏れも神目指してがんばるべ。
0373デフォルトの名無しさんNGNG
>>372
参照カウンタだと参照が循環してるとゴミにならないんだけどそれでいいの?
参照が循環しないように注意しながらプログラムすることに不満はない?
0374デフォルトの名無しさんNGNG
>>373
参照カウンタとGCを組み合わせればいいのでは?
0375デフォルトの名無しさんNGNG
>>372
ん、もしかしてgcの基本的な動作が把握出来てない?
あれはスレショルド越えるまでオブジェクトを確保して最後に一気に要らないメモリを開放するという仕組み。
だから不定期にしか解放されないのは問題無い。

最初に数十キロ確保されるのは関数や文字列が確保されるせい。その中に無駄なメモリは無いハズ。
gcを動かさないための条件は上に書いた通り。

ま、任意のオブジェクトをその場で消す機能くらいあってもいいとおもうけどね。
0376デフォルトの名無しさんNGNG
んでもって、GCレスな言語としてのLuaの現実的な使い方としては、
あらかじめ十分な量のオブジェクト(テーブル)を確保しておいて、
実際のループ内では、オブジェクトプールから必要な分を取ってきて
使うという方法。テーブルじゃなくてユーザデータを使うのもいいかもしれない。

そうすれば、確保するオブジェクト量+Luaコードの複雑さで、
必要とされるメモリ量はほぼわかるはず。
あとは、独自アロケータでも用意しとけば安定した運用が出来るわけですな。
ただ、運用では、安全のために、テーブル生成子({})を使えないようにする
必要があるかも?

スクリプト中でメモリ確保を行うような動作をさせたい場合、
毎フレーム強制的にGCを呼ぶという手もあるけど、GCの速度がまだ未知数…。
暇があったら、今度計ってみようと思う。
0377デフォルトの名無しさんNGNG
>>376

それは正しいが、そこまでする必要あるならなんでluaつかう?(
0378デフォルトの名無しさんNGNG
>>377
いや、わからんなら使わないでもいいと思うけどね。熱血で解決。
↓このへんでも読んどくといいんじゃない?PythonをPC、コンソールともに使ったところの記事。
http://www.gamasutra.com/features/20020821/dawson_01.htm
0379デフォルトの名無しさんNGNG
最近luaもオブジェクト嗜好になりつつあるようで、萎え!
0380デフォルトの名無しさんNGNG
>>379
超古参ユーザーでつか?
0381379NGNG
ん?最近ってことでもないのかな?
ソースはVer1のを見たっきり。。。(w
0382デフォルトの名無しさんNGNG
>>377
漏れ的には演算やループや関数呼び出しにメモリ確保がない(=GCが呼ばれない)だけで
十分に利用価値があると思うけどなぁ。
03835.0しか知らない新参者NGNG
>>381
HISTORYによるとオブジェクト指向的な要素が追加されたのは、
1.1→2.0の時のようですな。1995年ころのことらしい。
0384381NGNG
なるほど、TNX!
0385デフォルトの名無しさんNGNG
LUAと直接関係無いですが、
どういった部分にスクリプト機能を導入すると、効果的でしょうか?
いろんな例を知りたいです。宜しくお願いします。
■ このスレッドは過去ログ倉庫に格納されています