プログラミング言語 Lua
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGhttp://www.lua.org/
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デフォルトの名無しさん
NGNG0413デフォルトの名無しさん
NGNGlight wight 言語萌え
0414デフォルトの名無しさん
NGNG0415デフォルトの名無しさん
NGNGLua5.1か…。意外とリリースは早いのかな?ところで次世代GCと呼ばれる
ものはどういうものを指すのかな?GC+SmartPointerと見て問題なさげ?
smallって開発止まってたと思い込んでいたけどそうでもなかったのね。
ところで軽量スクリプト言語でリコンストラクトをサポートしているモノ
ってありますか?記憶領域ブロックを保存することで同じ状態を再現でき
るようなもの。
Unrealに使われているスクリプトエンジンがそんな感じっぽかったんだ
けど、さすがに汎用ではそんなのないか…。
0416デフォルトの名無しさん
NGNGsin()とかcos()とかを自前の奴に差し替えたいんですがどうしたらいいんでしょうか?
0417デフォルトの名無しさん
NGNG>次世代GC
ナニソレ?
>記憶領域ブロックを保存することで同じ状態を再現できるようなもの。
これは永続化の事を言ってるの?だとしたら、全てのオブジェクトを
GCのマークフェーズの様に辿れる状況であれば、オブジェクトの
アドレスをインデックスに変換するだけでファイルから読み書きできる。
自作の言語でも使ってるけど、昔いくつかのLISP処理系でも見かけた。
あと、この機能を抜き出した単体製品もあった。
ただし、ポインタを辿らせる関係で色々設定が必要。
0418デフォルトの名無しさん
NGNGgenerational GC のことを言っているなら「次世代 GC」じゃなくて「世代別 GC」
どういうものかは Paul R. Wilson の
Uniprocessor Garbage Collection Techniques あたりでも参照してください。
0419デフォルトの名無しさん
NGNG0420デフォルトの名無しさん
NGNGttp://lua-users.org/wiki/BindingCodeToLua
0421デフォルトの名無しさん
NGNGゴミになるオブジェクトのほとんどが新規作成されたオブジェクトであるという
仮定の元に作られたGC。通常は新しいオブジェクトのみを対象としたGCを
行うことで、対象オブジェクト数を減らしGCのスピードを稼いでいる。
http://ruri.csys.ce.hiroshima-cu.ac.jp/~masato/research/master-slide/
http://www.atmarkit.co.jp/fjava/rensai2/webopt06/webopt06.html
インクリメンタルGC(Incremental GC):
GCを分割して行えるようにしたもの。GC時間が分割できるのでリアルタイム向け。
全体のGC時間は大きくなる。
http://members.tripod.co.jp/zzyyb/gc/incremental-collector.html
両方の手法をあわせたものもあるみたい。
>>408のlhfが言ってるincremental garbage collectionがどれをさしてるのかは
分からないが。ただ、参照カウントにはならなそうだね。オーバーヘッドやら
実装の複雑性やらが云々とか書いてあった。
0422デフォルトの名無しさん
NGNGメッチャ、サンスコ。
0423デフォルトの名無しさん
NGNGmarkを世代別にすればさらに無駄が少なくなる。
0424デフォルトの名無しさん
NGNGまぁなんていうか知らないけど、漏れは再構築機構と呼んでます。漏れの
Luaのな使い方はアプリケーションのステータスやインストラクション情報の
構築なんかなんだけど(ゲームで言えばステージセットや敵の配置やイベント
処理ね)、これをLuaコードで吐き出すのではなくLuaに確保した配列情報を
そのままLuaバイナリイメージで保存してそのまま復元できたりすると便利だろうなぁと。
例えばアプリのコンフィグデータを扱うような場合を考えてみると便利
さが解ると思います。更に将来的にデータが拡張されたりユーザ数によって
サイズが可変したりなんて場合にも連想配列で扱えると便利ですよね?
0425デフォルトの名無しさん
NGNGしかしインタプリタの実装が変わったらアウトなんでは?
コルーチンを永続化したいのでない限りは、
単にテーブルをシリアライズして持っとけば十分と思うんだが。
0426山崎渉
NGNG0427デフォルトの名無しさん
NGNG0428デフォルトの名無しさん
NGNGつーか主語が何なのか書けよ。質問する前に日本語なんとかしろ。
0429デフォルトの名無しさん
NGNG0430デフォルトの名無しさん
NGNG0431デフォルトの名無しさん
NGNG演算(+-*/)とif文だけ作って、strip しても既に30kB
luaは脅威だ!!
0432デフォルトの名無しさん
NGNGネタですか?
手元にある、
read.eval.gc.cons.car.cdr.quit.defun.lambda.quote.setq.eq.null.atom.
numberp.print.terpri.rplaca.rplacd.progn.cond.and.or.not.list.+.-.*./.divide.>.<
が組み込まれた習作LISPの実行ファイルは19kb、
quote.if.lambda.set!.macro.begin.define.while.with-input-from-file.with-output-to-file.
and.or.quasiquote.unquote.unquote-splicing.sharp-hook.car.cdr.cons.read.write.load.eq?.
strcat.gc.oblist.pair?.null?.symbol?.string?.number?.macro?.newline.memq.apply.substring.
read-char.write-char.list->string.string->list.not.add2.sub2.mul2.div2.mod2.<.>.<=.>=.display.
string-length.string->symbol.symbol->string.length.string->number.number->string.eqv?.
peek-char.back-char.getd.procedure?.closure?.set-car!.set-cdr!.eval.append2.identity
が組み込まれたSchemeの実行ファイルは26kbですが。
ちなみにUPXで圧縮するとそれぞれ10kb, 14kb,。
ソースは両方ともC言語で700行以下。mingw -O2 strip
0433デフォルトの名無しさん
NGNGってそういう話題じゃないか…。
0434431
NGNGでも700行でなにがでるんだろう?
今の段かいでwc-lしてみたけど、約2000行いってた。
もちろん、これを1行で書くことも出来るわけだが。。。(w
0435431
NGNG足し算して合計を求めてみたが。。。
<2000行>
real0m1.234s
user0m1.230s
sys0m0.010s
<lua>
real0m1.538s
user0m1.530s
sys0m0.010s
<ruby>
real0m8.752s
user0m8.710s
sys0m0.010s
と、とりあえずは早いみたい。32ビットコードに変換して
実行させてるからかな?(大きさ&速度)
激しくオフトピなのでsage
0436デフォルトの名無しさん
NGNGrubyってもっと遅くない? >>32
0437デフォルトの名無しさん
NGNG書けることが実証されていますが…
ttp://www.ioccc.org/1990/dds.c
0438デフォルトの名無しさん
NGNGBASICではないように見えるが…
0439>>436
NGNG十分遅いとおもうけど?(w
0440デフォルトの名無しさん
NGNGうpしる!!!!
ていうかして下さいお願いします(=´ω`)
0441デフォルトの名無しさん
NGNGなにいれてもOkしか帰って来ない?
0442デフォルトの名無しさん
NGNG0443デフォルトの名無しさん
NGNG$ ./dds
Ok
100 S = 0
Ok
120 FOR I = 1 TO 100
Ok
130 S = S + I
Ok
140 NEXT I
Ok
150 PRINT S
Ok
RUN 100
5050
Ok
0444デフォルトの名無しさん
NGNGttp://www0.us.ioccc.org/1990/LANDER.BAS
0445デフォルトの名無しさん
NGNG0446デフォルトの名無しさん
NGNGすまそ。自己解決。
日本語マニュアル良い感じで訳されて( ・∀・)イイ!!
0447>>443
NGNGなるほど出来た、たいしたもんだね。
100万回ループさせたら、桁溢れしたけど(桁溢れを考慮すると)
値は正しいものだった。
ちなみに、速度は。。。
同一環境で。。。
real0m4.990s
user0m4.980s
sys0m0.000s
こちらも、このソースを考えればすごい!
rubyは、オブジェクト指向なので単純比較は出来ないのかもしれんが、
やはり遅いようだね。
0448デフォルトの名無しさん
NGNG0449デフォルトの名無しさん
NGNGfunction loop()
local i = 1000000
while i > 0 do
i = i - 1
end
return i
end
2) 700行scheme: while
(define (a)
(let ((i 1000000))
(while (> i 0)
(set! i (- i 1)))
i))
3) 700行scheme: tail call
(define (b)
(let loop ((i 1000000))
(if (> i 0) (loop (- i 1))
i)))
1) 842msec
2) 973msec
3) 2108msec
誤差はあるけど順位は変わらないです。
schemeはread時点でmacro-expand済み。
3)はgcの影響。ちゃんとフロー解析して2)に近づけるのが目標。
0450デフォルトの名無しさん
NGNGやっぱり、こういうことするには大学の情報系出てるか、
独学で難しい理論しってる必要あるの?
0451デフォルトの名無しさん
NGNG0452デフォルトの名無しさん
NGNGその次に経験が重要で、それらがあれば知識は自然に付いてくる。
ちがうかなぁ?
0453デフォルトの名無しさん
NGNGソース見てみると結構煩雑に見えるけど。
0454デフォルトの名無しさん
NGNGたしか、上のほうで誰かがHP書いてくれてたけど、
他のスクリプトと比べてもかなり良い線入ってる漢字がした。
配列がやや遅い漢字もするが、これはハッシュと同一なので
納得できるきもする。
いかが?>ALL
0455デフォルトの名無しさん
NGNG0456デフォルトの名無しさん
NGNGend
萎える
あと、 functionなんで古スペル?
0457デフォルトの名無しさん
NGNGお前もか。
俺も、
if ... then begin
end
でないと、と思ったよ。
> function
さすがに、funcとか、fnだと萎えるだろ?
0458デフォルトの名無しさん
NGNGLuaは生涯、この手の話題で無限ループだな。
■ このスレッドは過去ログ倉庫に格納されています