プログラミング言語 Lua
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGhttp://www.lua.org/
0313デフォルトの名無しさん
NGNG>>309
0314デフォルトの名無しさん
NGNGrubyなら、
def foo
initialize()
result = ...
finalize()
result
end
def foo
initialize()
result = ...
finalize()
end
で、値が違ってくるでしょ?
これは、luaのreturnありなしと同じことじゃない?
それともこんな書き方は「できない」ようにした方がいい?
0315デフォルトの名無しさん
NGNGつまりこういうこと。
> a = function() return 0 end
> b = function () a() end --return付け忘れた
> b()
> print(a())
0
> print(b())
あれれ・・
0316デフォルトの名無しさん
NGNG0317デフォルトの名無しさん
NGNGやっぱり引数の数を問題にしてる?
それが問題になるのは、可変長引数の関数のときだけでしょ?
もしくは、本当に値のことなら、
def foo
0
end
def foo
0
print "debug..."
end
とか、つまらんミスだけど完全には「防止」できないよね?
(俺には「値を返す場所が1つ」で「そこにreturnを付け忘れた」なんていうミスは
上と同列(文法を理解してない)に見える。)
まぁ、関数にreturnが一つでもついていたら、
「returnで値を返さないパスが存在します。」とかの
warningくらい出してくれてもバチは当たらないだろうけどね。
0318デフォルトの名無しさん
NGNGなんか、全然理解してくれてないね。
もういいよ。
0319デフォルトの名無しさん
NGNG代入文も値を持つので a = b = 0 とか出来るようになるが、
一方で a = b == 0 も合法になるので、
if a = 0 then ... end というありがちな罠が出来るわけだがその辺はどうよ。
0320デフォルトの名無しさん
NGNG誰かもっと実際にありえそうな例で解説してくれ。
0321デフォルトの名無しさん
NGNGあんたの好きな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> b = function()end
> print(a(b()))
> print(a(0))
0
確かに危険だなこれ。
0323デフォルトの名無しさん
NGNGという事だな。
Luaは関数のくせに値を返さない可能性がある。
0324デフォルトの名無しさん
NGNG0325デフォルトの名無しさん
NGNGその場合もfunctionで書いたとき、
return忘れをチェックできないと解決しない。
全ての関数が値を返すという前提で、
return削除するのが一番簡単で楽だと思うけど。
0326デフォルトの名無しさん
NGNG0.5の方がいいんじゃないのか。
0327デフォルトの名無しさん
NGNGreturnはセミコロン(;)と同じ様に、あってもなくてもいい事にすれば、
修正も最小限で済むかな。
さらに変な言語になるけど。
0328デフォルトの名無しさん
NGNGいやいや、subroutine は本来値を持つものではないのよ。
しかし return によって値つきで戻ることが出来るわけで。
0329デフォルトの名無しさん
NGNG0330デフォルトの名無しさん
NGNG単に構文要素 procedure をケチっただけなんだろうか
0331デフォルトの名無しさん
NGNGなんじゃそりゃ。
>>329
それも問題ある。
というか問題が変わってない。
0332デフォルトの名無しさん
NGNG付き合いきれん。
0333デフォルトの名無しさん
NGNG気に入らないなら使わなきゃいい。これだけヌルいライセンスなんだから
解決策も上げずにクダクダ文句言うのはお門違いだ。キエロ
0334デフォルトの名無しさん
NGNG0335デフォルトの名無しさん
NGNG・functionで、returnがない実行パスがあった場合エラー
・procedureは引数リストや代入の中で使えない
でOK?
parserの改造くらいですみそうだが。
0336デフォルトの名無しさん
NGNG解決策は上がってるじゃん。
つーかウザそうなやつって、真っ先にお前じゃねーか(w
0337デフォルトの名無しさん
NGNGところで、ちょっと前にも話題に出したのだけどlmem.c内のメモリ
確保/開放の所をトレースすると全くと言って良いほど開放が行われて
いないのね。試しにループコード書いてみたらメモリが100M近くまで
確保されても開放する気配もなかった。っていうか通常でも良く解か
らないタイミングでメモリ確保するのね。たとえば
a=1
これだけの行でも数個のメモリを確保してる。(しかも開放しやがらねー)
生成したスレッドの開放手段も用意されてないし、クラスモドキは
作れてもデストラクタが作れないとか、いろいろと組み込みには問題が
山積みのような気がする。
betaだからだと思いたいなぁ。
0338デフォルトの名無しさん
NGNG0339デフォルトの名無しさん
NGNGgc積んでるんじゃないの?
0340デフォルトの名無しさん
NGNG互換性考えるなら、>>325 and >>327
0341デフォルトの名無しさん
NGNGそそ、GC積んでるみたいなんだけど、開放タイミングが良く解からないのね。
っていうか、メモリ周りはもうちょっとクリーンに使えないとつらいねぇって話。
出来る事ならメモリ周りはlua_openの時のみ1回の確保にして貰えると助かる。
足りないときは例外投げて再確保とかがいいな。
0342デフォルトの名無しさん
NGNGというかそもそもl_free()ってreallocでしか使われてないじゃん。
GCの後余ったメモリをOSに返すようにするGCって稀なんじゃないかな。
コンパクションのときオブジェクト再配置でかかるコストとか馬鹿にならなそう出し。
んで、確保したメモリは1回メモリプールに置いといて、足らなくなりそうだったら
改めて確保するわけだ。だからタイミングが不定に思えるんでしょう。
前にメモリの断片化を心配してたみたいだけど、オブジェクトサイズは
ほぼ一定の大きさになるようにして、文字列とか不定長のやつは別管理にする
とかいうメモリ管理をするのが一般的だと思う、インタプリタでは。
(luaがどうなってるのかは知らないが。realloc()のコストが高そうだ…。)
まぁ、組み込み用途としては失格なのかもしれんが(組み込み機器なんかで使いたい場合は特に。)
デストラクタは、自分で作って明示的に呼びましょうってことじゃない?
Javaと同じく(Javaには一応あるけど事実上使えないよね)。
0343342
NGNGどかっとメモリ確保してそれを分割して使うわけじゃないのか。
ちなみに、4.0もほぼ同じコードなのでbetaとれても変わらないでしょう。
まぁ、lmem.cのreallocを自分で固定メモリ領域から取ってくるように
改造すれば対応可能だから、まだましか…?
そういうのを作ってコントリビュートしてみてもいいかもね。
0344デフォルトの名無しさん
NGNGうん。lmem.cを見る限りでは外部のallocaterを利用する事も考慮している
みたいなんよね。ただ、開放のタイミングがちょっとアレなので例えばメモ
リプールを64kとかするとあっという間に溢れちゃう。やっぱメモリは不要に
なった先から開放して欲しいっす。
ここをなんとかしないととてもじゃないけど組み込みどころかPCでも使え
ないすね。っていうかどうゆう環境を想定してんだろ…。
個人的にはメモリブロックを取得して保存/復帰が出来るようになれば
サイコーなんだけど…。
0345デフォルトの名無しさん
NGNGvoid lua_setgcthreshold (lua_State *L, int newthreshold);
って関数があるね。
ちとLuaをガベコレレスに改造するテストしてみようと思います。上手
くいったらレポートします。
あとはスレッドの開放だな…。
void lua_closethread (lua_State *L, lua_State *thread);
はマニュアルに記述はあるのでそのうちFixされると思いたいのだが…。
0346デフォルトの名無しさん
NGNG・Baldur's Gate
・MDK2
・Angband
とかあるね。
まぁ、どこで使われてるか、ってのも問題だけど。
BGはAIのところだっけ?
0347デフォルトの名無しさん
NGNG荒らしでもなく、sage優先にしては記録的!
でも、ageると嵐が来そうなので、sageておこうっと。
0348デフォルトの名無しさん
NGNGLuaの仕様をちゃんと理解できないやつが難癖つけてただけじゃない?
0349デフォルトの名無しさん
NGNGfree()で領域がOSに返るかどうかはlibc依存なんだがそういう話ではない?
現状ではOSに返らない環境の方が多いと思う。
0350デフォルトの名無しさん
NGNGそういう話ではない。
0351デフォルトの名無しさん
NGNGメモリが足りなくなった時に追加確保しないでゴミ掃除なりして欲しいってこと?
(ちゃんとソース読んでないけど) safe-point 方式っぽいからしょうがないんじゃないのかなあ。
参照カウント方式はカンベンしてほしいし。
0352デフォルトの名無しさん
NGNGtop(1)で観察できるluaのコードは何かありますか?
0353デフォルトの名無しさん
NGNGこいつは、オブジェクトが多くなればなるほど時間がかかるという弱点を持ってる。
上の話は、言語で一括してメモリプールを取るんじゃなくて
オブジェクトを作るたびにmalloc()が走るからメモリ使用状況が
把握しにくいから嫌、って話じゃない?
んで、解決方法としては、malloc()のソースとか持ってくるなりして
アロケータを適当に書く、と。
実際には、言語内で確保したオブジェクトをプールしてるのか、
しばらくするとアロケータもGCもあんまり走らなくなるんだけどね。
(複雑なサンプルでは試してないけど、単純ループとか再帰とかでは。)
0354デフォルトの名無しさん
NGNGコード追ってみました。ほぼ353氏のいうとおりですね。不思議なのは
最後にあるようにある程度走らせたらメモリの再利用らしき挙動が起こっ
てメモリの確保が行われなくなる事かな。ガベコレってそういうもんなの
かも知れないけど、これがちょっと困り者。
ぶっちゃけ、自分が想定していた家庭用ゲームコンソールへの組み込み
はよほど扱いを限定しないとむつかしそうな感じです。PCゲーならOKかな?
0355デフォルトの名無しさん
NGNGなんかGCにいちゃもんつけてる粘着がいるみたいだけど、
第一そんなにシビアな環境でなんでインタプリタ使うんだ??
俺には信じられんが。。。(w
まぁ、PCゲーあたりが現実的なターゲットかと。。
0356デフォルトの名無しさん
NGNGLuaのWikiでは、ゲームに使うためにGCを何とかしようとかいう議論もあったけどね。
インクリメンタルGCとか世代別GCとか。
俺的には、リアルタイム性という点では、mark&sweepより参照カウントのほうが
向いてると思うんだけどね。Luaを参照カウント方式にするのはかなり労力掛かると思うが…
で、保険としてmark&sweepも入れておくと。
全体的にLuaはメモリアロケーションが少なくてすむように設計されてるように見えるので、
メモリ管理関係にあんまりこだわるのも本質じゃないのかも(もう少しソース追わんと
はっきりとしたこといえないけど。)
ただ、Luaのソース上でのGC呼び出しタイミングとか見てみると、どうもmalloc()が失敗する
ことはほぼ無いという前提で作ってるように見えるので、組み込み系はちょっときついのも
確かか。
0357sage
NGNG汎用スクリプトには向かん見たいですね。
0358デフォルトの名無しさん
NGNGLuaをガベコレレスにしようと一日格闘してみましたが、根が深くて相当
骨が折れますね。で、諦めて色々なケースでパフォーマンスのチェックをし
てみたのですが、普通の利用では30〜40kb程度で動くようです。複雑な再起
でも単純なループでも確保量があまり変わらないのでおそらくこの辺がLua
の標準プールサイズなのかと思われます。うーん…今の所はこれぐらいすね。
>>355
別にいちゃもんつけてる訳じゃなくて、Luaの正確な挙動を把握しようと
しているだけ。汎用スクリプトとしてのLuaは非常に興味深いので。
まぁメモリアルゴリズムは組み込み用途に合わせて幾つかのアルゴリズムを
選択できると理想的なんだけどね。
うーん、有意義な話題だと思ったが粘着扱いか…欝だ。
0359デフォルトの名無しさん
NGNG0360デフォルトの名無しさん
NGNG0361デフォルトの名無しさん
NGNG> Luaをガベコレレスにしようと一日格闘してみましたが、根が深くて相当
漏れも Boehm-Demers-Weiser に変えたらどうなるか調べようと思ったけど、
2時間くらいでは終らなかった。
0362デフォルトの名無しさん
NGNGガベコレレスなんてできるの?
できたら神、ってもう諦めたのかyo!
0363デフォルトの名無しさん
NGNG0364デフォルトの名無しさん
NGNGそれ以前のバージョンはライセンス読んでないから知らない。
0365デフォルトの名無しさん
NGNG0366デフォルトの名無しさん
NGNGhttp://www.lua.org/ftp/lua-5.0.tar.gz
0367デフォルトの名無しさん
NGNGGとOは何の略でいく?
GNU Objective Lua・・・じゃ面白くないし
0368デフォルトの名無しさん
NGNGGOLua is Objective Lua
Luaが土台なら使えるものができるかも!
0369デフォルトの名無しさん
NGNG0370デフォルトの名無しさん
NGNG・テーブルを作るとき
・テーブルサイズが大きくなるとき(グローバル変数定義含む)
・スレッドを作るとき
・ユーザオブジェクトを作るとき
・文字列操作をしたとき
・再起なのでスタックサイズが伸びたとき
・パーサが動いたとき(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うわ、またしても神登場だ。ただ、問題視されているのは
for i=0,10000 do a = {} end
で必要とされているメモリはa = {}だけなのにGCの開放タイミングが微妙
なお陰で十数kb近くの確保が行われちゃう事なのね。だから参照カウンタ
方式にして不必要になったらすぐ開放しちゃって欲しいって訳。
あと、1/60sceとかでループをまわすゲーム用途にはGCが働いた時に負荷
が偏るのも宜しくない訳です。
うーんでもこの調子で皆でパッチを当てあえばそのうち何とかなりそう
だね。GoLuaができる日も近そうだ。漏れも神目指してがんばるべ。
0373デフォルトの名無しさん
NGNG参照カウンタだと参照が循環してるとゴミにならないんだけどそれでいいの?
参照が循環しないように注意しながらプログラムすることに不満はない?
0374デフォルトの名無しさん
NGNG参照カウンタとGCを組み合わせればいいのでは?
0375デフォルトの名無しさん
NGNGん、もしかしてgcの基本的な動作が把握出来てない?
あれはスレショルド越えるまでオブジェクトを確保して最後に一気に要らないメモリを開放するという仕組み。
だから不定期にしか解放されないのは問題無い。
最初に数十キロ確保されるのは関数や文字列が確保されるせい。その中に無駄なメモリは無いハズ。
gcを動かさないための条件は上に書いた通り。
ま、任意のオブジェクトをその場で消す機能くらいあってもいいとおもうけどね。
0376デフォルトの名無しさん
NGNGあらかじめ十分な量のオブジェクト(テーブル)を確保しておいて、
実際のループ内では、オブジェクトプールから必要な分を取ってきて
使うという方法。テーブルじゃなくてユーザデータを使うのもいいかもしれない。
そうすれば、確保するオブジェクト量+Luaコードの複雑さで、
必要とされるメモリ量はほぼわかるはず。
あとは、独自アロケータでも用意しとけば安定した運用が出来るわけですな。
ただ、運用では、安全のために、テーブル生成子({})を使えないようにする
必要があるかも?
スクリプト中でメモリ確保を行うような動作をさせたい場合、
毎フレーム強制的にGCを呼ぶという手もあるけど、GCの速度がまだ未知数…。
暇があったら、今度計ってみようと思う。
0377デフォルトの名無しさん
NGNGそれは正しいが、そこまでする必要あるならなんでluaつかう?(
0378デフォルトの名無しさん
NGNGいや、わからんなら使わないでもいいと思うけどね。熱血で解決。
↓このへんでも読んどくといいんじゃない?PythonをPC、コンソールともに使ったところの記事。
http://www.gamasutra.com/features/20020821/dawson_01.htm
0379デフォルトの名無しさん
NGNG0380デフォルトの名無しさん
NGNG超古参ユーザーでつか?
0381379
NGNGソースはVer1のを見たっきり。。。(w
0382デフォルトの名無しさん
NGNG漏れ的には演算やループや関数呼び出しにメモリ確保がない(=GCが呼ばれない)だけで
十分に利用価値があると思うけどなぁ。
03835.0しか知らない新参者
NGNGHISTORYによるとオブジェクト指向的な要素が追加されたのは、
1.1→2.0の時のようですな。1995年ころのことらしい。
0384381
NGNG0385デフォルトの名無しさん
NGNGどういった部分にスクリプト機能を導入すると、効果的でしょうか?
いろんな例を知りたいです。宜しくお願いします。
0386デフォルトの名無しさん
NGNGLuaを含め、内部にVM持ってる系はほとんどがそうだが。
0387デフォルトの名無しさん
NGNG0388デフォルトの名無しさん
NGNG寝ぼけてた。すんません。
0389デフォルトの名無しさん
NGNGttp://www.lua.org/uses.html
0390デフォルトの名無しさん
NGNG0391デフォルトの名無しさん
NGNGうん。で、言語的に他に遜色ない記述能力を持ち、かつ、処理系が小さい。
だから、Luaに注目してるわけだが…。
0392デフォルトの名無しさん
NGNG小さいつったら、他にも沢山ありそうだけど。
あえてLuaに拘る理由って何?
0393デフォルトの名無しさん
NGNGよければ他のよさげな候補を教えてクレー。
0394デフォルトの名無しさん
NGNGまぁ、別にどうしても拘ってるってわけじゃないけどね。そう見えた?
組み込みというと、PythonやRubyがそういうのを意識したつくりになってるね。
Perlはどうなんだろう?
Pythonは世代別GCをもってるみたいなんで、Luaよりはリアルタイムな組み込み系に
向いてるかもしれない。そういう実績もあるみたいだし。
Rubyも世代別GCが実装されて、バイトコード化もされたんだっけ?詳しく追ってない。
あとは、Mozillaなんかに使われてるJavaScriptエンジンとか、
Netscapeで使われてたJavaScriptエンジン(njs)とかあたりも、ブラウザ以外の
アプリに組み込みで使われることを意識して作られてるね。
njsは実行効率も結構良いらしい(というのはとある日記の受け売りだけど…)。
言語の速度比較サイトとかみてみると興味深いかも。
http://www.bagley.org/~doug/shootout/
あと、LISPとかScheme系で使えそうなのがいろいろありそうだけど調べてない。
おれも情報求む。
0395デフォルトの名無しさん
NGNG誰でも使いこなせるほどにはコンパクトな仕様じゃない。
あと、ライブラリのスクリプトも同梱しなきゃなんないし。
0396デフォルトの名無しさん
NGNGlua思ったより早いですよね。
0397394
NGNGglueとしてのスクリプトだけじゃなくて、各オブジェクトの振る舞い記述にも使えそう
かなぁ、と。だから拘って見えるのは正解だ。
ちなみにpythonもstackless pythonという実装があって、こいつもおんなじ様なことが
できるみたいね。
http://www.stackless.com/spcpaper.htm
0398デフォルトの名無しさん
NGNGって仕組みがあってコルーチン的に使えるんだが、
これ以上はスレ違いなのでsage
0399デフォルトの名無しさん
NGNGこの速さ(と小ささ)は ruby も見習って欲しいです
0400デフォルトの名無しさん
NGNGPythonは気軽に使うにはちと繁雑。Rubyはライセンスうざいから無視。
あと、複数帰り値や可変引数の扱いが非常にイイ。そんな訳でGCに絡む
メモリ周りはなんとかしたいですね…。
0401デフォルトの名無しさん
NGNGArtisticライセンス(Perlで使われてるもの)使えばいいでしょ。
0402デフォルトの名無しさん
NGNG言語の大きさはほとんどがライブラリの大きさだよ。
0403デフォルトの名無しさん
NGNG比較するならなんかデータを示してほしーなーとか。
ポインタでもいいから。
0404デフォルトの名無しさん
NGNG0405デフォルトの名無しさん
NGNG組み込み型やクラスを外すとその型やクラスに関係した文法の
意味論が無効になるわけだがその場合同じ言語と呼べるのか否か。
0406デフォルトの名無しさん
NGNG0407デフォルトの名無しさん
NGNG0408デフォルトの名無しさん
NGNGどの辺が、"some internal modifications"なんだろ?
http://lua-users.org/lists/lua-l/2002-10/msg00191.html
> what is the current plan for GC in Lua 5 [...]
We are planning to release 5.0, and then to start working in a
generational GC for 5.1. To make a new GC for 5.0 would delay too much
its final release.
-- Roberto
http://lua-users.org/lists/lua-l/2003-01/msg00147.html
>"incremental garbage collection"? Are there plans for an incremental
>collector or is the generational one being summerised (wrongly?) as an
>incremental one? Did I miss something?
You read it right, we plan to have incremental garbage collection in 5.1.
Lua 5.0 already has some internal modifications to allow this but the real
work will begin as soon as Lua 5.0 (final) is released officially.
--lhf
0409デフォルトの名無しさん
NGNGsmallとかどうですか?
http://www.compuphase.com/small.htm
parser無しで50Kくらい。
JIT、デバッガつき。ポインタ、GCが無い。Cライク文法。
実績:
halflife admin mod
NoX: free Ultima Online Server
他
0410デフォルトの名無しさん
NGNGいいねこれ。
#if とか使えるのが特に。
まさに組み込み向け?
0411デフォルトの名無しさん
NGNGttp://ici.sf.net/
0412デフォルトの名無しさん
NGNG■ このスレッドは過去ログ倉庫に格納されています