【Lua】組み込み系言語総合 その2【Squirrel】
at TECH
[前50を表示]
100:デフォルトの名無しさん
09/07/12 22:06:29
sqrat0.7
101:デフォルトの名無しさん
09/07/13 15:25:37
>>96
URLリンク(sugarpot.sakura.ne.jp)
102:デフォルトの名無しさん
09/07/13 23:27:37
>>100
うほっ。更新内容見てフイタ。
IronPythonは事実上.NET側のオーバーロードをサポートできてないみたいだな。
明示的に書けば読めないことも無いようだが、
これで実用になるとはとても信じられない。
URLリンク(blogs.msdn.com)
103:デフォルトの名無しさん
09/07/14 01:06:33
>>102
MessageBoxあたりで試せばすぐわかるが普通に呼べんぞ?
てゆーかなんでいきなりIronPython?
104:デフォルトの名無しさん
09/07/14 09:26:14
>>95
Lisp には演算子っていう概念がないからちょっと違うけど、inc ならあるよ。
Lua の代入文の = も演算子じゃないんだよな。代入文は式じゃないから。
>>96
Lua は変数の値が nil なら定義されていないっていう意味になるので、
値を取得してみて nil かどうかを調べればいいんじゃないかな。
厳密には、グローバル変数はテーブルのフィールドとして定義されていて、
値が nil ならそのキーは存在しないことと同値なので。
105:デフォルトの名無しさん
09/07/14 10:16:10
>>103
MessageBoxは試してなかったけど、確かにそうだよなぁ。
IronPython呼び出し用に再定義してあげないといけないかも。
オレ、以前はSquirrel党だったんだけど今はIronPython方面に。
組み込みスクリプトとしてはアリだと思うんだけど、どうだろう。
106:デフォルトの名無しさん
09/07/14 15:38:04
Lua > Python:
PythonはC関数を登録してスクリプトから呼び出すのが結構めんどくさい。
コルーチンに制限がある。同じ関数内でしか yieldできないし、yield で引数や戻り値の指定ができない。
独自のローダーを使った import 実装がとにかく面倒。 lua なら lua_load に自分定義のロード関数わたすだけでOK
Pyhton > Lua:
スタックではなく、C上でLua変数はすべて PyObject として表現されるのでCソースの可読性が高い。
関数も整数も全部 PyObject としてC側の変数に保存する事ができる。
環境が充実。
ゲーム用途で組み込んでいる自分としては、コルーチンの使いやすさと、
自作ローダーでのロードが楽(ゲーム用の圧縮ファイルから直接スクリプトを呼び出す必要がある)
な点でLua圧勝。
もしツールに組み込むんだったらソースの読みやすさ+ライブラリ充実さで断然 Python
Eclipse + PyDevが使いやすいのも勝ち点。
107:デフォルトの名無しさん
09/07/14 18:43:12
わざわざ.NETやMonoに依存したくない
108:デフォルトの名無しさん
09/07/14 21:40:20
>>100
2日で0.71に上がってるからバグでもあったのかと思ったら、
バインドしたC++の関数の引数にSquirrel関数を渡せるようにしてほしいと
要望もらって一日で作ってきてるんですね。
Kanryuさんのパッチも入ったし仕事はやいぞ。
109:デフォルトの名無しさん
09/07/15 00:50:51
AngelScript|Д`)<俺らの話題全然ないな
GameMonkey|Д`)<全くだ
CRIScript|Д`)<全くだ
110:デフォルトの名無しさん
09/07/15 01:41:13
URLリンク(www.chaiscript.com)
> ChaiScript | Easy to use scripting for C++
111:デフォルトの名無しさん
09/07/15 02:24:00
チャイってミルクティーやん
と思ったらロゴがほんとにミルクティーだw
112:デフォルトの名無しさん
09/07/15 02:28:39
Squirrelってリスやん
113:デフォルトの名無しさん
09/07/15 06:59:47
Luaを組み込んである字幕作成ソフトAegisub
URLリンク(www.aegisub.net)
URLリンク(g-mark.jpn.org)
字幕スクリプトの整形やエフェクトにLuaを利用してる
ライセンスはBSD、ソースは、
URLリンク(svn.aegisub.net)
114:デフォルトの名無しさん
09/07/15 19:21:30
>>106
Python のyield は引数や戻り値の指定できるよ
Stackless Python なら同じ関数でしかyield使えないという制限もなかった気がするけどうろ覚え
115:デフォルトの名無しさん
09/07/16 10:35:29
>>114
レスを見てジェネレータ関係を触ってみたら、
Pythonのバージョンによる挙動の差異が如実に出ててビビッた。
3.0系はprint文が関数化されて書式に互換性が無いとか、
ジェネレータのnext()メソッドが使えなくなってるとか。
IronPythonの現行版はまだ2.5系で、今年中に2.6系互換になる予定なのか。
オレには3.0はまだ新しすぎたようだ!
116:デフォルトの名無しさん
09/07/16 13:54:53
>Python のyield は引数や戻り値の指定できるよ
URLリンク(www.python.jp)
本当だ、気づかなかった.... orz
117:デフォルトの名無しさん
09/07/29 10:08:15
lua_newthread だとグローバル変数が共有されちゃうけど、
グローバル変数を独立させるようにできないの?
コードを共有して変数だけ独立させたいんだけど。
... って書いてて思ったけど、結局関数もグローバル変数と同じなんだから
lua_newstate でいいのか。
118:デフォルトの名無しさん
09/07/30 02:48:48
LUAのコルーチンの中から、C++側で定義された構造体を取得し、
そのメンバの値を変更したいのですが、変更するコードをスクリプトに
記述した場合、そのコルーチンをresumeするLUAの関数をC++から何度か呼ぶと
luabind::detail::unrefというところで例外が出てしまいます
struct Test { int a; Test(){} }; という構造体があって、luabindで
luabind::module(L) [
luabind::class_<Test>("Test")
.def(luabind::constructor<>())
.def_readwrite("a", &Test::a)
として、コルーチンの中で t=Test() t.a=0 の2行を書くと例外になります
この2行をコメントアウトすると、何度呼んでも例外が出ません
また、この2行をコルーチンでない普通の関数に記述してC++から呼んでも
例外が出ません
なぜコルーチン内から構造体を使用するコードを書くと例外が出るのでしょうか
119:デフォルトの名無しさん
09/07/30 06:10:29
luabind は使ったことがないので想像ですが、
コルーチンから C の関数が呼ばれるときは lua_State(L の値)が違うから、
それが問題になってたりしないかな?
120:デフォルトの名無しさん
09/07/30 07:27:21
>>119
ありがとうございます
すみません、質問しておいて何ですが、以下のフォーラムの記事に
よるとどうやらluabindにバグがあったみたいで、仰るとおりlua_Stateの
値が関係してるようです(英語がよく分からないので間違っているかもしれません)
それでluabind/detail/ref.hppを記事の下にあるものに置き換えたところ、
今のところ例外が出ずに動いています。。
URLリンク(www.nabble.com)
121:デフォルトの名無しさん
09/07/31 16:36:17
lua_resume(ls, ...) で中断しているスクリプトがあるんだけど、
再開するのではなく、リセットして最初から実行しなおしたい場合がある。
このとき、どうすればいい?
マニュアルには lua_newthread で作ったスレッドは解放しなくていい、
GCが管理すると書いてあるけど、さすがにいきなり
ls = lua_newthread(..);
って上書きするんだと、いつまでたっても古い ls の内容が削除されないよね?
だってLua側からしてみれば、古い ls はあくまでも中断してるのであって、
いつ再開されるかわからないからGCで回収できないし、
古い ls はもはや不要になったよー ってことをまったく Lua 側に知らせてないし。
かといって、明示的に ls が不要になったことを伝えるために
lua_close(ls);
ls = lua_newthread(...);
lua_resume(ls, ...);
とやってみると、lua_newthread で内部エラーが発生する(メモリ違反ぽい)
どうすればいいですか?
122:デフォルトの名無しさん
09/07/31 18:37:55
>>121
>いつ再開されるかわからないからGCで回収できない
んな事はない。
スレッドでも他のデータでも、参照できなくなったらGCで回収される
という事に変わりはない。
123:デフォルトの名無しさん
09/07/31 18:56:50
>>122
でも C のレベルでは、参照されているかどうかってわからないんじゃない?
つまり、lua_newthread() した直後は、
Lua のオブジェクトからは参照されていない thread ができるわけですよね。
逆にいうと、lua_newthread() しただけだとどこからも参照されていない事になるから、
lua_setglobal か何かを使って、どこかから参照してあげないといけないとか?
124:デフォルトの名無しさん
09/07/31 19:50:44
どこのlua_newthreadの解説読んでるのか知らんが、
「新しいスレッドを"スタックに積み"……」って書いてないか?
125:デフォルトの名無しさん
09/07/31 19:59:52
URLリンク(www.lua.org)
ここみてますけど、でもさすがに、スタックに積んだままじゃほかのことできないでしょ。
元の質問された方がどういう風に使っていたかによるけど。
126:デフォルトの名無しさん
09/07/31 20:09:46
lua_newthreadの直後はC関数のスタックから「参照」されてるし
そのあとLuaで参照したいなら戻り値なりグローバル環境なりに押し込めばいいし
C側だけで管理したいならレジストリ+luaL_refとか使えばいいだろ
何がしたいんだかわかんねーよ
127:デフォルトの名無しさん
09/07/31 20:12:10
新しいスレッドを積むのはいいんだけど、
古いスレッドが不要になったということをどうやってLUAに知らせるの?
最初に
ls = lua_newthread(...);
lua_resume(ls, ...)
を実行したとして、ls は中断状態のまま残っていると。
で、中断状態をやめて、最初から実行したいということで、いきなり
ls = lua_newthread(...);
lua_resume(ls, ...)
をもう一度呼び出すと、古い ls が上書きされるけど、古い ls への参照も、
なにもかもまったくいじっておらず、ただ単に新しいスレッドを追加しただけにすぎないわけで。
古い ls の参照カウンタをデクリメントするなり、古い ls への参照を
削除するなりの処理がまったく入っていないと。
128:デフォルトの名無しさん
09/07/31 20:38:13
C++とLuaスクリプトの連携をしたいお年頃なんですが、
toluaとluabindだったらどちらが安定してる感じですか?
129:デフォルトの名無しさん
09/07/31 21:20:37
>>127
だから削除したいならスレッドの参照を潰せばいいだけでしょ?
自分で最後に答え書いてるじゃん!
中断中のコルーチンが参照されなくなった場合に GC 対象になるかどうかは
マニュアルにも明言されてない、どっちなの? って質問なら確かにわかりにくいとは思うが。
int main(int argc, char* argv[])
{
lua_State* L = lua_open();
luaL_openlibs(L);
lua_State* thread = lua_newthread(L);
luaL_loadstring(thread, "print('co1'); coroutine.yield(); print('co2');");
lua_resume(thread, 0);
//lua_settop(L, 0);
lua_gc(L, LUA_GCCOLLECT, 0);
lua_resume(thread, 0);
lua_close(L);
return 0;
}
lua_newthreadで積んだスレッドを潰す処理であるlua_settopの行のコメントを削除すると
二回目のlua_resumeの時点で落ちるところから「GC対象になる」が正解みたいやね。
130:デフォルトの名無しさん
09/07/31 21:27:07
>>127 は根本的なところを理解してないようだ。スタックにあるんだからpop すればいいんだよ。
まず
lua_State *base = lua_newstate();
lua_State *ls = lua_newthread(base);
は、
lua_State *base = lua_newstate();
lua_newthread(base);
lua_State *ls = lua_tothread(base, -1)
と意味的には等価ね。
ここで ls は、あくまでスタック上にあるスレッドの情報を、
直接ポインタとして参照してるだけで、別にリファレンスを持ってるわけではない
lua_newthread がこれを返してるのは、単に便利だからにすぎない
この状態で、lua_pop(base,1) することで、スタックの末尾にあるもの=さっき作ったスレッドが
破棄されて解放されることになる。これでスレッドが破棄された後に ls にアクセスすると、
実体がなくなってるポインタの参照になるから誤動作を引き起こす
一般的には、スレッドをスタックにつんだままにしとくのはわけわかになるので、
>>126の言ってる通りに管理することになる
131:デフォルトの名無しさん
09/07/31 21:52:47
>>129
お前も使い方間違ってるよ・・・
132:131
09/07/31 21:59:29
と思ったけど、俺が間違ってる気がしてきた・・・
メインスレッドのスタックに、新しいスレッドと関数と引数を積んでlua_resumeを呼ぶ
と思ったけど、違うのか
133:デフォルトの名無しさん
09/07/31 22:01:02
>>131
え? それだけ言われてもわかんない、どこどこ、教えて!
134:デフォルトの名無しさん
09/07/31 22:04:32
>>132
ってなんじゃいゴルァ!w
いやそこは合ってるはずだよ、とゆーかみんなCで組み込むなら標準ライブラリのソース読もうぜ
組み込みの基本からトリッキーなものまで一通りそろってるぜ
135:デフォルトの名無しさん
09/08/01 20:41:44
lbaselib.cのauxresume(L, co, narg)の所を見るとlua_resume(co, narg)となっている。
1番目の引数がLではなくcoだということがマニュアルを読んだだけではわからなかった。
136:デフォルトの名無しさん
09/08/10 17:41:02
C++でPython組み込んでて
例えば
Pythonのソースにスペルミスがあったとして
それをC++側で知る方法が全く分からない
どなたか分かりませんか
137:デフォルトの名無しさん
09/08/10 17:52:13
∩_
〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ Lua!!
彡、 |∪| /
/ __ ヽノ /
(___)
138:デフォルトの名無しさん
09/08/10 17:57:43
>>136
Pythonスクリプトのコンパイルエラーやら実行時エラーを取得したいっていうこと?
139:デフォルトの名無しさん
09/08/10 18:02:39
>>138
そのとおりです。
PyErr_Print () の出力先を変えればいいのだと思うのですが。。。うまくいきません
140:デフォルトの名無しさん
09/08/10 18:44:19
>>139
PyErr系はstdoutに出力するけど、これはcで定義されたstdoutではなく
python で定義されたsys.stdout を呼んでいるので、その変数を上書きすれば良い。
sys.stdout 変数を書き換えるコードを最初に実行する。
const char *s = "\
import sys\n\
sys.stdout = MyStdout\n\
class MyStdout:\n\
def write(s):\n\
call_c_function(s)\n";
てやって s を実行すれば、Python側の sys.stdoutが自作クラスで上書きされる。
もちろんあらかじめ自作C関数を call_c_function で呼び出せるように登録しておく。
141:デフォルトの名無しさん
09/08/10 21:11:59
>>139
PyErr_Occurred で存在を確認して、PyErr_Fetch で取得
142:デフォルトの名無しさん
09/08/10 22:22:23
AngelScript2.17記念カキコ
143:デフォルトの名無しさん
09/08/10 23:09:19
>>140-141
ありがとうございます
出来ました
144:デフォルトの名無しさん
09/08/11 07:43:44
∩_
〈〈〈 ヽ
〈⊃ }
∩___∩ | |
| ノ ヽ ! !
/ ● ● | /
| ( _●_) ミ/ Lua!!
彡、 |∪| /
/ __ ヽノ /
(___)
145:デフォルトの名無しさん
09/08/13 01:25:43
IronPython……。
開発効率はそんなに悪くないんだが、
スクリプトで書いたメソッドの実行のレスポンスが悪いような気がするなぁ。
最初の実行時に引っかかる感じ。2回目以降は問題ないんだが……。
146:tor1.digineo.de
09/08/17 17:46:38
Q. 自動保守#K9K?_D[L とは一体何なのか?
A. 外部サイトへの突撃大好きな真性厨房
韓国突撃でお馴染みの自動保守
最近は自動焼人 ★として2ちゃんねるのボランティアにも精を出す日々
だがそんな彼にも、人間らしい部分はあったのだ…
名言集
『アパッチ砲はワシが作った』
『お前が規制系キャップ取れるか審査してやるよ』
『いつもサボってばかりのキャップがウゼえ』
『俺、100人規模の集団サイバーテロの主犯だったこともあるんだぜ』
『俺の経歴カックイイだろ?』
最近のニュース
8月15日の韓国突撃の際に歴史的大敗を喫する。ラジオでの敗戦宣言のときに声が震えていた
本人は体調不良と言っているが…
----------------------------------------------
この自動焼人 ★メールマガジンの配信停止をご希望される方は
スレリンク(sec2chd板)
にて自動焼人 ★までご連絡ください
147:デフォルトの名無しさん
09/08/19 22:37:23
Xtalが 1.0.0.0になった気配
148:デフォルトの名無しさん
09/08/19 22:48:59
\ l´⌒\⌒\ \\ \
\ ヽ ) ) \\ \\
( \ \∩___∩ \\
\ \ ⌒⌒| ノ ヽ \\
\ \ / ● ● ト、\ \\\
\ Y | ( _●_) ミ\ \\\
\ / 彡、_ |∪| ノ \ \\\
(____)―ヽノ' ヽ  ̄ ̄ ヽ\\
\, j l l .l }
Lua! l (_ノノノノ
149:デフォルトの名無しさん
09/08/20 00:02:36
なん・・・だと・・・
150:デフォルトの名無しさん
09/08/20 08:49:22
修正点まだあるみたいだね
151:デフォルトの名無しさん
09/08/20 13:51:23
XtalってC++以外からは使いにくくない?
っていうか使えるんだろうか
152:デフォルトの名無しさん
09/08/20 14:17:00
>>151
バインド部分がテンプレートべったりなんだから、そのままではC++以外で使えるわけがない。
ぼやき。
Squirrelを.NET向けに移植しようかと考えたこともあったが、
この分野ではIronPythonが便利すぎてやる気が失せた。
起動が重過ぎる点を除けば処理速度以外は特に不満点はない。
Luaに関しては.NET判処理系のNuaがあるみたいね。
153:デフォルトの名無しさん
09/08/20 16:54:28
>>152
ですよねー
もうちょい汎用的なバインド方法が欲しいところだ
154:デフォルトの名無しさん
09/08/20 19:43:09
>>151
試してないけど
extern "C" {}
でC言語リンケージに変換してみるとか。
155:デフォルトの名無しさん
09/08/26 05:27:30
IronRubyも0.6まで着てたな。Ruby on Railsが動くまでになったらしい。
Rubyも楽に組み込めるといいんだけどね。例えば、スクレイピングの部分だけまかせるとかさ
156:デフォルトの名無しさん
09/09/07 08:56:09
IGDAで Xtal を扱う勉強会があるみたい。
URLリンク(www.igda.jp)
157:デフォルトの名無しさん
09/09/07 11:13:19
Xtalっておいしいの?
158:デフォルトの名無しさん
09/09/07 11:31:58
食わず嫌いはいけませんよ
159:デフォルトの名無しさん
09/09/07 11:45:23
4時間で6テーマか。
Xtalに特に興味があるなら別のイベントに期待って感じかな。
160:デフォルトの名無しさん
09/09/07 12:08:05
JITコンパイルでC並の速度で動く組み込み言語とかない?
161:デフォルトの名無しさん
09/09/07 12:19:50
AngelScriptがJITコンパイルできるようになったらしいが、やり方がわからない…
162:デフォルトの名無しさん
09/09/07 12:24:07
>>160
言語じゃないけど、NativeClient
163:デフォルトの名無しさん
09/09/08 00:34:11
昔は高速な組み込み言語はLispだったな。
JITコンパイルじゃないが。
164:デフォルトの名無しさん
09/09/08 12:15:39
>>160
URLリンク(www.compuphase.com)
165:デフォルトの名無しさん
09/09/08 23:51:16
>>164
これ良さそうだけど人気ないのかな
166:164
09/09/09 02:11:46
164 書いた後で発見
URLリンク(pawn.my-sv.net)
167:デフォルトの名無しさん
09/09/11 08:52:36
現状Pythonの組み込みで満足してるというのに、他の言語を検討する必要性をまったく感じない……。
168:デフォルトの名無しさん
09/09/11 11:08:55
>>167
帰れ
169:デフォルトの名無しさん
09/09/12 12:24:04
>>160
LuaJIT 速いらしいよ。
C ほどじゃないだろうけど、Python には大体勝ってるみたい。
URLリンク(shootout.alioth.debian.org)
170:デフォルトの名無しさん
09/09/12 14:17:34
Lua は JIT じゃなくても python より速いよ
171:デフォルトの名無しさん
09/09/12 14:30:54
IronPythonはLuaより倍ほど速いがな。(2.0.1)の場合。
2.6系ならさらに速くなってる。
ただし速いのは数値計算で、文字列計算などはPythonより遅かったりするが。
172:デフォルトの名無しさん
09/09/12 15:36:57
組み込み言語って
「Cで書いた (だから速い)」と喧伝しながらこっそりと組み込むものではないのか?
173:デフォルトの名無しさん
09/09/12 15:43:13
たぶn Luaやリス使っている人はゲームの組み込みが多いと思われるのですが、
Pythonを組み込みに使っている人は、どんなアプリに使ってますか?
174:デフォルトの名無しさん
09/09/12 17:14:54
>>171
マジで!? IronPython スゴイんだな。
数値計算に関してなら、以前に計測したとき Lua は Python より2〜5倍速かったんだけど。
数値計算については .NET すごいということなのかな?
175:デフォルトの名無しさん
09/09/12 19:32:49
LuaJITとかCに比べたら桁違いに遅いんじゃない?
176:デフォルトの名無しさん
09/09/12 19:37:08
というか、Cで各プログラムと速度面で執拗に比較するやつがいるが、意味が分からない。
C/C++にスクリプト言語の動作を追加するのは柔軟性を増やすことで
開発・運用を容易にするためであって速度のためではない。
スクリプト言語で実装した部分が重いなら改めてC/C++側に移植することを考えればいいだけのこと。
177:デフォルトの名無しさん
09/09/12 19:43:51
ユーザがプログラムを拡張するのに使えるだろ
178:デフォルトの名無しさん
09/09/12 19:55:55
組込み言語に今注目してる業界にゲーム業界があるが、
ユーザによる拡張をばりばり推進するぜ派(洋ゲー、リアルタイム物メイン)と、
そんなもん完全にアウトオブ眼中だぜ派(和ゲー、アドベンチャー系メイン)で、
まっぷたつですな。
179:デフォルトの名無しさん
09/09/12 20:10:01
社風の違いだからどうにもならない。
プログラマの部長級が開放的という幸運なケースであってさえ、
総務営業やら会社も巻き込むとやっぱり日本的感覚で
ゲームの内情を客に見せるのは御法度になるね。
プログラマ出身のワンマン社長のところしかありえないでしょう。
180:デフォルトの名無しさん
09/09/13 09:18:47
プラットフォームの違いもある。
洋ゲーと言えども、360やPS3でMODを許しているものは少ないだろう。
>>178の(和ゲー、アドベンチャー系メイン)ってPCのエロゲ・ギャルゲのことを
指してるんだろうけど、俺としては違和感があるなぁ。
181:デフォルトの名無しさん
09/09/15 23:34:31
URLリンク(www.amazon.co.jp)プログラミング言語Lua公式解説書-Roberto-Ierusalimschy/dp/4048677977/
この本持ってる人いる?
luaを始めて見ようと思ってamazonで検索して出てきて最新ぽいから買おうと思ってるんだけど
182:デフォルトの名無しさん
09/09/16 21:34:58
>>181
読んでみようと思って大きな本屋まで行ってきたが、
SQLiteの本とDirectXの本読んでたら満足しちゃってそのまま帰ってきてしまった。
183:デフォルトの名無しさん
09/09/17 05:14:33
>>181
リファレンスマニュアルの日本語訳も収録してるなら長く使えそうかも。
リファレンス読んでよくわからないところを本文で確認とかできそうだし。
URLリンク(sugarpot.sakura.ne.jp)
よくここにお世話になるんだけど、内容が古いのか、
本家の英語版にくらべると結構抜けがあるんだよね。
184:デフォルトの名無しさん
09/09/17 10:12:06
>>182
おいw
185:デフォルトの名無しさん
09/09/17 18:27:44
URLリンク(blog-imgs-26.fc2.com)
このSSで使用してるソフトご存知の方いたら教えていただけませんか
186:デフォルトの名無しさん
09/09/17 21:15:21
URLリンク(mystone.jp)
URLリンク(tibid.seesaa.net)
187:186
09/09/17 21:23:49
もしかしてエディタの方なら
URLリンク(www.vector.co.jp)
188:デフォルトの名無しさん
09/09/17 21:23:50
>>185
NoEditor
189:デフォルトの名無しさん
09/09/18 12:39:47
ご回答ありがとうごじあましたー
190:デフォルトの名無しさん
09/09/25 16:57:06
メインアプリ起動後に裏で常にLuaを複数同時に動かして
プラグインのようなことをさせたいのですが
何か参考になるサイトやソースコードはないでしょうか?
191:デフォルトの名無しさん
09/09/26 06:26:45
>>190
メインと切り離す必要が本当にあるならプロセス間通信。
メインの内部で別スレッドを作って回すだけでいいならマルチスレッド。
192:デフォルトの名無しさん
09/09/26 09:17:46
マルチスレッドだと今度はリソースのロックとかがめんどくさいから、
コルーチンで協調的マルチスレッドにするとかどうですか?
193:デフォルトの名無しさん
09/09/26 09:51:46
>>191-192
貴重な意見ありがとうございます
コルーチンで実装してみて上手く行かないようなら
マルチスレッドを試す方向で行こうと思います
194:デフォルトの名無しさん
09/09/26 14:57:40
オレの場合、最初はコルーチンで実装してたが早々にCPUリソースが足りなくなって
マルチスレッドに移行したがな。
ゲームで使用するリソースを開始前に一括してロードするような
FPS的な仕様にしないと単独スレッドの実装は難しい。
195:デフォルトの名無しさん
09/09/28 13:19:32
>>190が言ってるような
一つのソフト上で同時に複数の
Luaスクリプトを動かす事って可能なの?
変数やスタックがバッティングしそうな気もするし
実際そういうことをしてるアプリ見たことないな
196:デフォルトの名無しさん
09/09/28 13:21:09
lua_Stateを複数作ってそれぞれ別管理すればいいだけじゃ?
197:デフォルトの名無しさん
09/09/28 13:59:39
ですね。
Luaはインタプリタの状態がグローバルにならない作りになってる。
198:デフォルトの名無しさん
09/09/28 21:44:36
V8も以前は・・・
199:デフォルトの名無しさん
09/09/29 09:55:14
Lua Programming Gems に、
Lua のコルーチンを改造してマルチスレッドにするという記事があるみたい。
URLリンク(www.lua.org)
本は読んでないけど、サンプルコードがダウンロードできる。
Enhanced Coroutines in Lua
Patrick Rapin
200:デフォルトの名無しさん
09/09/29 14:32:03
何かが引っかかると思ったら、コルーチンでLuaを複数回して
更にLua内でもコルーチンを使うからか
なんか富豪だな
201:デフォルトの名無しさん
09/09/29 15:38:36
総合的な処理速度はSquirrelとLuaではどちらが上ですか?
202:デフォルトの名無しさん
09/09/29 15:49:56
>>201
単純な数値計算ではLuaの方が倍くらい早い。
が、いずれにせよCなどの静的型付言語よりは10分の1以下のスピードなので、
あまりヘビーな処理はさせないようにすること。
とはいえ、80:20の法則で大部分のコードはスクリプト側に移行できるはず。
処理能力が足りなくなったら下回りからC/C++に再度移植していく。
203:デフォルトの名無しさん
09/09/29 15:55:21
>>202
そうですか、一見するとSquirrelはLuaの欠点を補い
構文もC/C++に近いなど利点ばかりかと思っていたけど
それなりに欠点があってゲーム用に改良された割には
未だ使用例が少ないのが現状みたいですね
204:デフォルトの名無しさん
09/09/29 16:14:07
>>203
いや、C++で書いてたころは普通にSquirrel使ってたよ。
とりあえず基本的なレベルでの不満はない。
オブジェクトの寿命は常に問題になるけどね。
今はもうC++でプログラムは書かないようにしてるから関係なくなった。
205:デフォルトの名無しさん
09/09/30 18:40:24
>>204
気になるなw
> 今はもうC++でプログラムは書かないようにしてるから関係なくなった。
今は何で書いてるんですか?
.NET系?
206:デフォルトの名無しさん
09/10/02 05:46:32
>>204
C#+IronPythonだ。レポはこのスレに何回も書いてるのでログを見てくれ。
しかし静的型付言語でいいならBooでもいいかも……(はっきり言ってこっちの方が速いし)
まあ今回は途中まで作ったからIronPythonでやってしまう予定だけど。
207:デフォルトの名無しさん
09/10/02 05:47:14
204 → 205
208:デフォルトの名無しさん
09/10/03 12:21:55
Luaステートを増やした(同時実行した)場合のGC負荷は
単純計算でステート数分増えるのかな?
検証してるサイトないか探したけど見当たらない
209:デフォルトの名無しさん
09/10/03 12:29:14
そりゃ当たり前のことを検証する人は居ないだろう
210:デフォルトの名無しさん
09/10/04 13:35:48
たまにLuaではcontinueやbreakは出来ないが
それを可能にするパッチがある、とあるけど
実際どこで配布されてます?
ここ数日ずっと探してるけど見つからず
211:デフォルトの名無しさん
09/10/04 16:57:50
breakはできるだろ
continueは
URLリンク(lua-users.org)
とか
URLリンク(lua-users.org)
だな。
212:デフォルトの名無しさん
09/10/04 18:56:28
初心者な質問なのですが、
VC++6.0でLua環境を構築しています。
「スクリプト言語による効率的ゲーム開発- C/C++へのLua組込み実践」 の中で
紹介されているtolua++を適応しています。
あるクラスの関数をtolua++を用いてLuaに公開しようと実装したのですが、
extern宣言した関数がリンカエラーでビルドする事が出来ません。
やりたい事は下記の様な感じです。
class CHoge
{
public:
char* GetName( CHage* pHage );
};
このGetName関数をtolua++でグルーコードに出力して、
VCのプロジェクトに登録しています。
出力したグルーコードに記述されている、GetName関数がリンカエラーになってしまいます。
*今はグローバル関数にして、extern宣言で対応しています。
クラスの関数をLuaに公開するには何か特別な方法が必要なのでしょうか?
上記の本にはクラスの関数の場合について記述されていない様なので質問しました。
宜しくお願いします。
213:デフォルトの名無しさん
09/10/04 20:20:58
>>211
thx、無事適用完了しました
214:デフォルトの名無しさん
09/10/06 04:29:51
>>212
URLリンク(www.codenix.com)
ここみると、クラスごとバインドするしかなさそう。
あるいは、登録したい関数をクラスメソッド(static 宣言)にするといいのかな。
215:デフォルトの名無しさん
09/10/06 17:54:33
Luaでチャンクの区切りを改行ではなく ; (セミコロン)にしたいのだけど
それを可能にするパッチとか出てたりします?
自分で改造しようにも手に負えなくて
216:デフォルトの名無しさん
09/10/06 18:01:45
配列を0から扱えるように悪銭苦闘したオレに似てるな
オレの場合は自力でやったけど複雑過ぎて無理だった orz
Luaってなんで配列が1からなのかね
いまでもムズムズ、どうにかならないものか
217:デフォルトの名無しさん
09/10/06 18:28:12
lparser.cのstatement()のswitch文のreturnの前に
check(ls, ';');
って書けばいいんじゃないかな
218:デフォルトの名無しさん
09/10/06 22:06:32
社会常識は1からだからな。
219:デフォルトの名無しさん
09/10/06 23:39:10
マジでLuaの配列を0から扱えるようにするpatchありませんかね?
220:デフォルトの名無しさん
09/10/07 01:28:23
>>214
回答ありがとうございます。
クラスのバインドで試してみます。
221:デフォルトの名無しさん
09/10/07 12:03:44
>>216
ニューメリカルレシピ・イン・C っていう本にその逆のことが書いてあったな。
一般的な数学では添え字は 1 からはじまるのに C だと 0 からだから困ると。
で、その本では添え字を 1 から始めるように、配列のポインタを 1 つ前にずらしてた。
つまり、int arr[10] みたいな配列をつくったら、
int *arr1 = arr - 1 と定義しておけば、arr1[1]、arr1[2]、……、arr1[10]
っていうふうにアクセスできる。
222:デフォルトの名無しさん
09/10/07 12:29:33
Fortranな人のための小ワザだけど、
厳密には、配列の範囲から外れたところを指してるポインタに
まつわる動作は未定義なので、仕様に煩い人には不評。
(C FAQ より URLリンク(c-faq.com) )
223:デフォルトの名無しさん
09/10/07 13:11:48
>>215
>>219
SquirrelとかAngelScriptじゃダメなの?
224:デフォルトの名無しさん
09/10/07 13:16:16
そもそも0とか1とかいうマジックナンバーを使ってはいけない。
パッチではなく、リファクタリングするべき。
#define FIRST 1
225:デフォルトの名無しさん
09/10/07 13:16:36
言語はそのままの仕様で使うのが無難ではあるよなー
226:デフォルトの名無しさん
09/10/07 13:21:29
>>223
Lua以外にするとメモリ消費や処理速度が劣ってしまうのが嫌で
やっぱり仕様に従って使うしかないですか
227:デフォルトの名無しさん
09/10/07 14:04:47
∩∩ ;
;|ノ||` ┬-‖
__,/●●| __ | | ‖ L...Lua..
| ; |`(_●)/ ミ . Y ‖
| .彡|∪||、 , .| | ‖
/:~ ̄ ̄ ̄ ̄:/.| | ‖
,|:::::. .......::/>> / ‖
/.::::: .. ...::::::|'(/\_/ ‖
../:.::: .. :.:::/.:/ /‖\
/.:::. ....:::..:::/.:/
' ̄ ̄ ̄ ̄ ̄ _/
|_| ̄ ̄ ̄ ̄|_|
228:デフォルトの名無しさん
09/10/07 18:31:00
BASICでも配列作ると0からなのに・・・・
229:デフォルトの名無しさん
09/10/07 18:57:15
ここは中間をとって0.5に
230:デフォルトの名無しさん
09/10/07 19:28:51
BASIC はたいていの実装が OPTION BASE とかで配列の開始インデックスを変更できるぜ
231:デフォルトの名無しさん
09/10/07 20:37:21
もう連想配列だけにしちゃおうぜ
232:デフォルトの名無しさん
09/10/07 23:24:33
>>230
なつかしすぎてどっかから鼻血でたわw
233:デフォルトの名無しさん
09/10/07 23:41:07
0からってのはポインタ的な発想で好かんわ
234:デフォルトの名無しさん
09/10/08 13:50:08
Pythonでシステム組んでるが、配列のインデクスが何番からかほとんど意識することないな。
for文ではそのままイテレータをまわしてしまうし。
235:デフォルトの名無しさん
09/10/09 19:50:43
Lua標準だと1ステートあたりのスタックサイズは1Kだけど
消費を抑えたくて手動設定する場合
どれくらいの値がベストだろう?
236:デフォルトの名無しさん
09/10/09 23:42:36
デフォで使用メモリ量が80MBを越える俺の構築した処理系からすれば、
数十キロバイトの仮想スタックなんて小さな問題だ。
237:デフォルトの名無しさん
09/10/11 01:41:47
新しい必殺技を思いついた
>>236 に捧ぐ
"O"zapper!!
238:デフォルトの名無しさん
09/10/11 03:42:20
次こそはうまくやりますコンピューター!
239:デフォルトの名無しさん
09/10/11 19:42:49
>>232
「どっかから」てお前はケツから鼻血がでるのかよw
>>236
RubyでフレームワークとしてRailsを搭載したかのようなメモリ消費量だなおいw
240:デフォルトの名無しさん
09/10/11 19:52:53
>>239
IronPythonがもりもりメモリ食うからな。
ほんと環境にやさしくないスクリプトエンジンだぜ。
まあ、C#で組むにはこれが一番「普通」なスクリプティングエンジンなので。
241:デフォルトの名無しさん
09/10/11 21:24:50
IronPythonすげえwそんなにメモリ食いすぎなのかw
242:デフォルトの名無しさん
09/10/14 02:42:38
luaについてちょっと質問なんだけど、
乱数を表示させたあとに、もう一度同じプログラムを実行すると
シード値が変わらずにまったく同じ乱数が表示されてしまう。
どうすればこのシード値を初期化して、実行するたびに違う乱数を
表示させられるの?
243:デフォルトの名無しさん
09/10/14 02:54:44
それこそシード値を「適当に」初期化してやればいい。
一般的には、タイマーの値とか、ユーザ入力の時間差を測定したりして、それを srand() につっこんで対応する。
244:デフォルトの名無しさん
09/10/14 03:04:26
>>243
レスありがとう
まだはじめたばっかりでホームページさがしながらの手探り状態なんだけど、
math.random()で()の中に1から10までの値をいれるよね?
そしたらそれ以外にmath.randomseedを書けばいいってこと?
245:デフォルトの名無しさん
09/10/14 03:16:42
そう。
プログラムの頭で math.randomseed(os.time()) とでもしておきなされ。
246:デフォルトの名無しさん
09/10/14 03:22:08
できました!
本当にありがとうございました。
これからもっと勉強してきます
247:デフォルトの名無しさん
09/10/14 13:48:26
実行中のLuaスクリプトを停止させるには
lua_errorで強制的に例外を発生させる方法以外に
何かありませんか?
1つのスクリプトを実行する一般的な使い方なら問題ないのですが
スレッド毎で同時に複数のスクリプトを実行させる場合
リソースの保護をしても違うスレッドからスクリプト(ステート)を閉じようとすると
原因不明のエラーで強制終了してしまいます
248:デフォルトの名無しさん
09/10/14 14:52:00
>>247
コルーチン化していつでも終了できるように作っておくのがLWL流 :)
249:デフォルトの名無しさん
09/10/14 14:57:04
つlua_yield
250:デフォルトの名無しさん
09/10/14 15:03:25
>>248
肝心な部分を説明し忘れてました
私が今作ってるのは>>190の方が言われたような
luaを同時実行させてプラグイン機能を実現するもので
それをコルーチンでやるとなると実質スレッド1つで
全処理をすることになるのでCPUリソースの消費が激しく
ステートも一つだから変数の重複などが問題になって
それらを回避するためにマルチスレッド上で
それぞれスクリプトを動かす必要があるのです
しかしあるプラグインでエラーが起こり
それに関連するスクリプトを全部停止(解放)したい時
現スレッドから他スレッドのステートを閉じようとすると
強制終了につながるエラーが起きてしまう状況で
251:デフォルトの名無しさん
09/10/14 15:35:28
>>250
ちがうよー。
コルーチンというのはプログラマが入力した任意のタイミングで
動作を中断できるようにした仕組み(yield)のことであって、
それを使って複数の仕事を1スレッドで同時に実行というのは二次的なものに過ぎないんだよ。
したがって複数のスレッドで実行しても(エンジンの実装に問題が無いなら)問題ない。
で、中断されて制御が戻ってきたタイミングでそのまま開放してあげればいい。
252:デフォルトの名無しさん
09/10/14 15:54:24
>CPUリソースの消費が激しく
>変数の重複などが問題
↓
>強制終了につながるエラーが起きてしまう状況
戦況が悪化してるが、今さら撤退する気はない
典型的なパターンですね
253:デフォルトの名無しさん
09/10/14 16:07:52
>>250
lua はスレッドセーフじゃないから、別スレッドからの制御は根本的にできないよ
コルーチンでうごかせってのは、呼び出しに lua_call を使うんじゃなくて、lua_resume と while
ループでスクリプトを駆動させて、スクリプト側では定期的に yield するようにすれば、
その区切りで安全に実行中断できるよ、ってこと。
それぞれのスクリプトはそれぞれのスレッドで立ち上げて、ほかのスレッドから停止させるときは
フラグをたてておいて、そのフラグがたってたらwhileを抜けて速やかにスレッドを自滅させる
ような書き方にする。
コルーチン駆動&記述が面倒ってことなら、裏技チックだけど、lua_sethook を使って、
関数呼び出し、ないしは行ごとに終了フラグチェックさせて、もしフラグたってたら
lua_error で速やかにスクリプトを abort させるという手もある。
残念ながらhookにユーザパラメータは存在してないので、変数かレジストリに
参照するフラグのCポインタを格納しておく、とかの小ざかしいテクが必要。
254:デフォルトの名無しさん
09/10/14 16:12:26
なるほど
Luaスクリプトを同時実行する際は
マルチスレッドのみでの制御は無理ということですか
改めてコルーチンについて勉強し直してきます
どうも助かりました
255:デフォルトの名無しさん
09/10/14 17:04:30
スレッドって名前が紛らわしいな。
関係ないかもしれないが、非推奨な手法を使いにくくするとかいう話を思い出した。
256:デフォルトの名無しさん
09/10/14 23:15:46
Luaは普通の呼び出しと、lua_yieldで一時停止して再度呼び出す場合とで使う関数が違うのが面倒くさくて逃げちゃったな俺…
AngelScriptだと同じ呼び出し方でOKなんだよなぁ…
257:デフォルトの名無しさん
09/10/15 05:43:27
>>256
coroutine.wrap をつかえば、普通の関数呼び出しと同じように resume もできるよ。
258:デフォルトの名無しさん
09/10/15 11:25:20
変態文法&バイトコードがエンディアン依存なluaを広めるのやめようぜ
手間が増えてスクリプトにしてる意味がねえよ
259:デフォルトの名無しさん
09/10/15 11:27:46
luaって、oracleにアクセスするライブラリないですか?
260:デフォルトの名無しさん
09/10/15 22:50:58
JavaからLuaを使うことってできる?
261:デフォルトの名無しさん
09/10/15 23:24:54
JavaからC言語を使うことってできる?
262:デフォルトの名無しさん
09/10/16 10:56:47
>>259
URLリンク(www.keplerproject.org)
Lua for Windows についてくるよ。使ったことないけど。
URLリンク(luaforwindows.luaforge.net)
263:デフォルトの名無しさん
09/10/16 11:14:25
>>259
というかそんな『重い』プロダクトを扱うなら、
素直にPythonやRubyなんかのライブラリの整備されたスクリプト言語使ったほうがよくなくね?
264:デフォルトの名無しさん
09/10/16 11:16:27
まあそんなこといいつつ、俺もPythonで軽量なDBラッパー探したら見つからなかったので
ActiveRecord互換のORMライブラリを自作したんだがな。
265:デフォルトの名無しさん
09/10/16 11:24:25
>>258
Luaの速度に魅力を感じてる人がなんとなく多い気がするね。
あとは、リスとかに比べるとドキュメントの多さなんかが人気の秘訣?
266:デフォルトの名無しさん
09/10/16 11:27:28
某MMORPGで使っているからだったりして。
267:デフォルトの名無しさん
09/10/16 12:17:07
ああ、別にROに限らず採用実績っていうのは使う基準に十分なるだろうし。
268:デフォルトの名無しさん
09/10/16 12:25:08
組み込みに求められるのは速度と少ないメモリ消費だから
多少なりと癖があろうとlua使っちゃうんだよね
他に比べて採用例も多い分、多言語との連携も充実してるし
269:デフォルトの名無しさん
09/10/16 12:53:36
ORMの次は、C/C++とスクリプトのマッピングだ、というアナロジーだけで
動いてるやつがいるような気がしてきた
270:デフォルトの名無しさん
09/10/16 13:04:45
>>組み込みに求められるのは速度と少ないメモリ消費だから
なんで? 別にそれは前提条件にならないと思うけど。
オレはゲームシステムを組んでいるところだが別にメモリ消費量は大して気にしてないぞ。
速度は大切だが、どうせ1スレッドでは間に合わなくなるのでマルチスレッド化するし、
ボトルネックはスクリプト部分ではないので問題ない。
271:デフォルトの名無しさん
09/10/16 13:14:26
ヤマハ RTX1200 に Lua 実行機能搭載だってさ
URLリンク(www.rtpro.yamaha.co.jp)
272:デフォルトの名無しさん
09/10/16 13:17:06
AngelScript使おうぜ
273:デフォルトの名無しさん
09/10/16 13:37:08
まぁ、なんだかんだでluaが一番なんだけどね
274:デフォルトの名無しさん
09/10/16 13:58:37
>>273
俺はそうは思わないけどな……。
触ったことあるけど文法がちょっと癖あるし、整数型がないし。
Pythonの方がよっぽどいい。
275:デフォルトの名無しさん
09/10/16 14:01:01
>>274
いやいや、個人的にではなく一般的にね
上でも出てるけど書籍や採用例が多いとかさ
276:デフォルトの名無しさん
09/10/16 16:06:28
このスレはIronPython使いと、AngelScript使いが一人ずつ常駐してるんだなw
277:デフォルトの名無しさん
09/10/16 17:20:01
こんだけで組み込み言語として使えるわけで、
URLリンク(alpha.mixi.co.jp)
でもphpに組み込みってなんだ。
URLリンク(www.mediawiki.org)
まあPECL拡張は2年前で止まってるみたいだけど
278:デフォルトの名無しさん
09/10/17 00:50:19
PHPはインタプリタを組み込めないライセンスだからなー。
この制限さえなければ今までなかった用途が色々できると思うんだけど。
279:デフォルトの名無しさん
09/10/17 15:11:07
>>278
??どういうこと?
280:デフォルトの名無しさん
09/10/17 15:38:39
>>279
うう〜ん……。問われたので改めて調べてみたが、どうやら間違った認識が一部あったようだ。
PHPインタプリタ本体はPHP License 3.01で配布されていて、
こいつは
・配布するソースコードまたはドキュメントに著作権表示、ラインセンス本文を記載すること
・PHP Groupから許可を得ずにPHPという名前を使用しないこと
(PHP Fooやphpfooはだめ。Foo for PHPはOK)
・文言の表示強制("This product includes PHP, freely available from <URLリンク(www.php.net)")
だけだな。インタプリタ自体を内蔵することは問題なさそう。
契約なしに内蔵できないのはZendライブラリなんだそうな。
(Zend Frameworkは修正BSDライセンス。Zendライブラリとは何ぞや?)
281:デフォルトの名無しさん
09/10/17 23:30:49
ここでzlibライセンスのSquirrelとAngelScriptの出番ですね!
282:デフォルトの名無しさん
09/10/18 01:54:10
luaスクリプト上でコルーチンを作成をした場合は
明確的に破棄する方法はないようなのだけどC側から
//コルーチンを実行するのスレッド(ステート)を作る
lua_State *L = lua_newthread(luaL_newstate());
//C側からコルーチンの操作
//コルーチンのスレッドを閉じる
lua_close(L);
とした場合はコルーチンを実行する為に確保されたメモリは解放されますよね?
283:デフォルトの名無しさん
09/10/18 03:54:02
そいや、Ioって言語はどうよ?
シンプル、軽量というのが売りらしいが。
284:デフォルトの名無しさん
09/10/18 09:02:18
>>282
lua_newthreadで作成したコルーチンはlua_closeしちゃ駄目だよ。
開放はGCにまかせる。>>121あたりから同じ様な質問出てるから見てみ。
285:デフォルトの名無しさん
09/10/18 09:33:44
>>284
指摘ありがとうございます
つまりスタックに積まれたコルーチンのスレッドを
lua_popで削除すればいいのですか
でもそれだとGCまかせでスグにコルーチン破棄はされないので
>>282のを
//コルーチンを実行するのスレッド(ステート)を作る
lua_State *L = luaL_newstate();
lua_State *T = lua_newthread(L);
//C側からコルーチンの操作
//ステートを閉じる
lua_close(L);
とすれば閉じるのはコルーチンのステートではないものの
lua_newthread は元のステートのオブジェクトを共有するみたいなので
コルーチンで確保されたメモリも同時に解放されますよね?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4275日前に更新/247 KB
担当:undef