トップページtech
981コメント297KB

【Lua】組み込み系言語総合 その4【Squirrel】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2011/03/30(水) 01:00:58.93
LuaやSquirrelやAngelScriptなどアプリケーションへの組み込み用途で
使われるプログラミング言語についてのスレッドです
まとめwiki(なにか質問する前に必ずみること!)
http://wikiwiki.jp/lua/

その他の参考URLは>2から

■前スレ
【Lua】組み込み系言語総合 その3【Squirrel】
http://hibari.2ch.net/test/read.cgi/tech/1272643397/

■過去スレ
その2 http://pc12.2ch.net/test/read.cgi/tech/1243210301/
その1 http://pc12.2ch.net/test/read.cgi/tech/1205208141/

プログラミング言語 Lua
その3 http://pc11.2ch.net/test/read.cgi/tech/1160799232/
その2 http://pc8.2ch.net/test/read.cgi/tech/1063711237/
その1 http://pc5.2ch.net/tech/kako/1034/10341/1034182349.html
0552デフォルトの名無しさん2011/08/06(土) 01:00:20.80
これといった標準がないときには、自分勝手に決めてしまう性格の方が迷いがないね
0553デフォルトの名無しさん2011/08/06(土) 09:08:54.34
>>550
はいはい。業界君乙。
0554デフォルトの名無しさん2011/08/06(土) 09:10:50.78
Luaはスレッドセーフな運用ができる。これで満足か?
0555デフォルトの名無しさん2011/08/06(土) 09:11:43.39
業界君ってめんどくさい
0556デフォルトの名無しさん2011/08/06(土) 09:14:47.50
>>550
つまりお前のプログラムのバグでスレッドアウトってだけだろ?
Luaのせいにすんなよ
0557デフォルトの名無しさん2011/08/06(土) 09:54:20.58
業界に限らずオレオレ用語君は実際困るんだが
0558デフォルトの名無しさん2011/08/06(土) 09:54:52.31
鉛筆削りで代用できる言語。それがLua
0559デフォルトの名無しさん2011/08/06(土) 10:01:43.94
荒れてるようなのでまとめると
スレッドごとにlua_stateを独立して保持してやれば、スレッド毎に独立して動きます。
こういう意味でLua(のDLL)はスレッドセーフです。
なお、各lua_state間(各スレッド間)で情報共有(グローバルj変数などの共有)が
できるかどうかまでは確認していません。
0560デフォルトの名無しさん2011/08/06(土) 11:28:47.23
スレッドセーフって意味は、複数のスレッドからアクセスして大丈夫かっていう意味だろ。
0561デフォルトの名無しさん2011/08/06(土) 11:49:24.27
>>560
はい
0562デフォルトの名無しさん2011/08/06(土) 11:53:31.69
スレッドセーフにするには、ロックするか
書き込み可の共有変数を無くすか
Luaは後者
0563デフォルトの名無しさん2011/08/06(土) 11:58:08.53
>>562
はい
0564デフォルトの名無しさん2011/08/06(土) 12:00:59.78
共有変数のないライブラリなんかも
「スレッドセーフなライブラリだ」とか普通に使うよなぁ。
業界君の業界ってどこなんだろ?
四次元の世界のプログラマとかか?
0565デフォルトの名無しさん2011/08/06(土) 12:15:10.67
四次元の世界から書き込みご苦労です
0566デフォルトの名無しさん2011/08/06(土) 12:33:46.57
スクリプト言語の実装だと、スレッドセーフかどうか、ってのは同一VMに対する操作に対してを指すのが一般的じゃね?
ruby しかり python しかり。
lua とか squirrel はそもそもスタック操作が atomic じゃないわけで、最初からそういう点でのスレッドセーフを確保するつもりが全く無い実装だよね

VM わけてスレッドセーフなのはあたりまえすぎるというか、そうなってない言語実装とかはずかしくて表にだせないような
0567デフォルトの名無しさん2011/08/06(土) 12:43:36.75
SafeLua
http://sourceforge.net/p/safelua/wiki/Home/
SandBox? TryLuaみたいなサイトでも作るんかな
0568デフォルトの名無しさん2011/08/06(土) 12:45:18.95
何が一般的かはよくわかりませんが、とにかく
Luaはlua_sate毎に別スレッドで動かせることを確認した次第です。
それ以外のことは知りません。
0569デフォルトの名無しさん2011/08/06(土) 13:11:29.76
スレッドセーフでないことの確認はともかく
スレッドセーフであることの確認って
ソースコードチェックする以外にどうやるの?
0570デフォルトの名無しさん2011/08/06(土) 13:21:50.16
>>569
実際に使ってみるとか。
0571デフォルトの名無しさん2011/08/06(土) 13:23:14.44
>>566
RubyやPythonってひとつのプロセスに複数VM持てたっけ?
0572デフォルトの名無しさん2011/08/06(土) 13:39:14.58
例えばCの関数 strtok_r は strtok のリエントラント版でな、
こいつは本質的にはLuaと同じ方法でスレッドセーフを実現してる
0573デフォルトの名無しさん2011/08/06(土) 13:56:53.74
>>569
ストレステストです。
0574デフォルトの名無しさん2011/08/06(土) 14:09:01.86
>>571
グローバルに一つやね。スレッドセーフは GIL で確保する実装

ruby はマルチVMの研究はやってたと思うけど詳しいことは知らない
マルチVMでシームレスに使うには結局メッセージパッシングの機構を
つくりこむ必要があってそこで難航してたんじゃなかったっけか

lua や squirrel はその点は総スルーしてるから、使う側はあきらめるか独自に頭をひねる必要がある
0575デフォルトの名無しさん2011/08/06(土) 14:16:15.19
そろそろ erlang 使いが乱入してこないかしら
0576デフォルトの名無しさん2011/08/06(土) 14:20:57.31
レースコンディションを自身で解消できるものしか
スレッドセーフと呼ばない、というのが業界標準なのか?www
それどこ業界よ?
0577デフォルトの名無しさん2011/08/06(土) 16:59:20.24
>>574
lua_stateが別でも相互に参照し合いたいってことか?
イラネ
そんなマイナーな議論よそでやってくれよ
0578デフォルトの名無しさん2011/08/06(土) 17:02:54.39
Lua鹿使えないSEなんていないんだから、
Luaをコントロールする言語側でロックなり何なりして情報を共有すればいいだけ。
Lua言語ですべてやろうとする馬鹿は消えてほしい
0579デフォルトの名無しさん2011/08/06(土) 17:09:56.18
まとめ
Luaはlua_state毎に別スレッドで動作させることができます。
そういう意味でLuaはスレッドセーフです。
異なるlua_satateで情報を共有できるか否か、というのはまた別の話になりますです。
普通は母体となるC言語なり何なりでロックしてから情報を書き換えるなどすればよいだけなので、
一般的な意味でも、Luaはスレッドセーフであるといえると思います。
0580デフォルトの名無しさん2011/08/06(土) 17:15:36.47
なお、スレッドセーフに関しの Lua Programming Gemsの著者である
Luiz Henrique de Figueiredoのコメント。

http://lua-users.org/lists/lua-l/2011-07/msg00072.html

Lua states, created with lua_newstate or luaL_newstate are completely
separate and thread safe.
0581デフォルトの名無しさん2011/08/06(土) 17:19:02.57
なお、レースコンディションを自身で解消できる言語しか
スレッドセーフと呼ばない、という業界が存在するらしく
話がかみ合わない場合があるので注意。
0582デフォルトの名無しさん2011/08/06(土) 17:54:26.45
wikipediaのスレッドセーフの実現手法の中の
スレッドローカルデータってのにあたるのかな?

この方法でLuaはスレッドセーフといえるのであれば、
広域変数もスレッドセーフであると言えるってこと?
0583デフォルトの名無しさん2011/08/06(土) 17:58:03.76
Luaはリエントラントだっつーとろーが
0584デフォルトの名無しさん2011/08/06(土) 18:13:08.71
>>583
ああスマソ。理解した。
lua APIはスレッドセーフだけど、lua_stateはスレッドセーフじゃないよってことか
0585デフォルトの名無しさん2011/08/06(土) 18:23:43.54
なんだよlua_Stateがスレッドセーフじゃないって
スレッドセーフってのはAPIとかコードの性質であって変数のじゃない
お前は全然分かってない
0586デフォルトの名無しさん2011/08/06(土) 19:06:40.86
いずれにせよLuaはCorei7対応だね
0587デフォルトの名無しさん2011/08/06(土) 19:07:50.79
>>574
Do not confuse Lua threads with OS threads.
www
0588デフォルトの名無しさん2011/08/06(土) 20:46:00.83
>>545
AngelScript|Д`)ジー
0589デフォルトの名無しさん2011/08/06(土) 23:21:08.88
StackTraceないのLuaって?
0590デフォルトの名無しさん2011/08/06(土) 23:28:43.00
組み込み言語って主にどういう場面で使うの?
0591デフォルトの名無しさん2011/08/07(日) 01:39:17.21
>>589
http://lua-users.org/wiki/DebuggingLuaCode
http://lua-users.org/wiki/LuaIntegratedDevelopmentEnvironments
0592デフォルトの名無しさん2011/08/07(日) 08:42:26.79
Android OSで動くLuaはまだないんだよね?
0593デフォルトの名無しさん2011/08/07(日) 08:53:57.78
>>591
スタックトレースっちゅうよりユニットテストじゃん。
0594デフォルトの名無しさん2011/08/07(日) 10:45:31.82
>>593
また業界用語は厳密に使うべき君か?
0595デフォルトの名無しさん2011/08/07(日) 12:16:40.81
>>594
スタックトレースとユニットテストは別物だよね?
0596デフォルトの名無しさん2011/08/07(日) 14:11:40.03
>>592
javaの皮だけ用意すれば
ふつうにコンパイルしてc/c++とLua使えるんじゃないの?
ndk?
http://www.google.com/search?q=lua+ndk&hl=ja
0597デフォルトの名無しさん2011/08/07(日) 20:34:11.99
スタックトレース → エラーがおきたらスタックの中身表示するVMの機能。
ユニットテスト → クラスが正常に動作するかチェックするためのクラス?
0598デフォルトの名無しさん2011/08/07(日) 23:01:53.34
なんでluaのbreakって最後にしか置けないの?
なんかメリットあるの?
0599デフォルトの名無しさん2011/08/08(月) 06:24:28.05
5.2betaならblock途中にも置けるよ
gotoのないバージョンで置けて
なんかメリットあるの?
0600デフォルトの名無しさん2011/08/08(月) 17:00:26.36
インクリメントとか複合代入演算子とか実装してほしい
0601デフォルトの名無しさん2011/08/08(月) 17:58:56.66
luaのリファレンスで stat ::= 〜 って書いてあるけど
::= の部分ってなにを意味しているの?
0602デフォルトの名無しさん2011/08/08(月) 18:17:12.41
>>600
イラネ
0603デフォルトの名無しさん2011/08/08(月) 18:59:39.21
>>601
BN記法でぐぐれ
0604デフォルトの名無しさん2011/08/08(月) 19:58:01.99
>>603
ありがとうございます
いままで知らなかったのが嘘の様なほどの基本なんですね
0605デフォルトの名無しさん2011/08/08(月) 20:38:51.81
>>602
なんで?サイズが大きくなるから?
0606デフォルトの名無しさん2011/08/08(月) 21:27:29.26
>>600
AngelScript|Д`)ジー
0607デフォルトの名無しさん2011/08/08(月) 21:29:24.91
>>601
BNF記法でイコールみたいな感じらしい
0608デフォルトの名無しさん2011/08/08(月) 22:37:40.90
定義だろ。
0609デフォルトの名無しさん2011/08/09(火) 07:59:00.89
>>605
コーディング時間が長くなるとかより、コード解析速度ダウンのほうが痛いから。
0610デフォルトの名無しさん2011/08/09(火) 17:50:24.15
複合代入はともかくインクリメントは流石に要らんな
0611デフォルトの名無しさん2011/08/09(火) 18:55:10.81
>>592
フツーにあるし
http://code.google.com/p/android-scripting/
0612デフォルトの名無しさん2011/08/09(火) 22:10:48.62
Luaはスクリプト言語なんだから全部の式に戻り値付けてほしい。
X = if Y < 0 then -1 else 1 end みたいに。
あとメタテーブルがあるんだから演算子は必ず代入しないといけないのもやめてほしい
Table + {1,2,3} とか
0613デフォルトの名無しさん2011/08/09(火) 22:13:14.72
スクリプト言語 → 全部の式に戻り値

この論理がどう繋がってるのかわからんのだが 
0614デフォルトの名無しさん2011/08/09(火) 22:28:57.95
確かにw

要は3項演算子が欲しいんだろ?
0615デフォルトの名無しさん2011/08/09(火) 23:01:07.79
好きなように改造してしまえばいいじゃない
0616デフォルトの名無しさん2011/08/09(火) 23:14:02.07
X = Y < 0 and -1 or 1
でいいんじゃなかったっけ
0617デフォルトの名無しさん2011/08/10(水) 00:10:49.21
>>613
Ruby脳なんだよ
0618デフォルトの名無しさん2011/08/10(水) 00:17:16.81
AngelScript|Д`)<インクリメント演算子欲しい子よっといで
0619デフォルトの名無しさん2011/08/10(水) 00:21:33.23
マイナーすぎるからやだ(´・д・`)
0620デフォルトの名無しさん2011/08/10(水) 00:26:46.59
んで、luaの三項演算子もどきのソレだけど、確か何か欠点が無かったっけ
0621デフォルトの名無しさん2011/08/10(水) 01:10:41.77
素直にand/orとして解釈すれば欠点はないが、もどきとしての解釈は自己責任
f(x and g(y) or z)
自己責任で適当な f, g を選ぶ
0622デフォルトの名無しさん2011/08/10(水) 01:27:08.33
天使さん不憫すぐるw
0623デフォルトの名無しさん2011/08/10(水) 02:03:13.96
>>620
true and false or true
0624デフォルトの名無しさん2011/08/10(水) 02:14:37.63
>>623
ソレダ
真のときの返値が偽値のときにおかしくなるんだな
0625デフォルトの名無しさん2011/08/10(水) 08:53:45.48
Pythonでは (x and [y] or [z])[0] とする
0626デフォルトの名無しさん2011/08/10(水) 11:40:58.81
Prologではカットを使う
Schemeでは(call/cc (lambda (k) (or (and x (k y)) z)))
0627デフォルトの名無しさん2011/08/10(水) 19:26:22.15
>>625
今のPythonには、そもそも三項演算子がある
ちょっと珍しい書法だが

条件が真の際の返値 if 条件式 else 条件が偽の際の返値
0628デフォルトの名無しさん2011/08/10(水) 20:59:09.92
なんでそこまで1行にこだわるのかね何回も使うなら関数定義すりゃいいのに。
F(条件、真、偽)とかじゃ駄目なの?
0629デフォルトの名無しさん2011/08/10(水) 21:24:49.30
そりゃ遅延評価の言語ならIFだって関数にできるけどさ
0630デフォルトの名無しさん2011/08/10(水) 21:28:05.19
>>628
それだと返値に関数が指定されたとき
関数に全く副作用が無く、かつ
呼ばれることによるオーバーヘッドが気にならない程度の小さい関数ならば良いが

呼ばれることによって何らかの状態が変わってしまうものや
呼ぶことによって大量の処理が動く場合はマズいことになる
0631デフォルトの名無しさん2011/08/10(水) 22:03:12.74
スピード求めるならCにでもやらせればいいと思うんだが・・・
今さら気がついたんだけど1行でも動くんだな。関数なんか書かなくていいっすね
もっとリファレンスきちんと読み直してくるわ



0632デフォルトの名無しさん2011/08/10(水) 22:39:02.20
>>631
スピードって、複合代入やインクリメントの話?
06336282011/08/10(水) 22:48:23.43
話の内容勘違いしてるの気がついて逃げようとしただけだから
もうほっといてくれー(ノ_・。)
0634デフォルトの名無しさん2011/08/13(土) 06:59:24.23
結局luaってゲームぐらいしか活用できるとこないの?
0635デフォルトの名無しさん2011/08/13(土) 07:55:39.27
ゲーム用なら値を倍精度じゃなくて単精度にして欲しいんだが。

結局、Basicにチン毛が生えた程度の誰得言語だなLua。
0636デフォルトの名無しさん2011/08/13(土) 07:58:33.32
>>635
??
0637デフォルトの名無しさん2011/08/13(土) 08:38:05.84
別にゲーム専用じゃないし、ゲーム開発者のLua紹介だと数値表現変更できるって書いてあるよ。
http://sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.html#2.2
> 数値 は実数 (double) を表現する。 (しかし数値の内部表現としてfloatやlongなど他の型を使うよう
> Luaインタプリタをビルドし直すのは簡単である。ファイル luaconf.h を参照。)
0638デフォルトの名無しさん2011/08/13(土) 08:46:12.16
ゲーム作らないからよくわからないけど、x86基準にしたら単精度ってメモリがない環境向けじゃないかな。
http://boinc.oocp.org/benchmark.php
> Intel x86 プロセサでは、単精度でも倍精度でも速度の差はあまりありません。
http://lua-users.org/wiki/FloatingPoint

(単精度で用意したAngelScriptとかSquirrelのプログラムと比較しないと意味ないだろうけど)
数値計算ループ自体は他のスクリプト言語より速いしLuaJITならかなり速い。
http://shootout.alioth.debian.org/u32/benchmark.php?test=mandelbrot&lang=all
http://luajit.org/performance_x86.html

ゲームみたいなフレーム単位のリアルタイム処理やってると固定小数点演算とかライブラリ使うみたいだし、
シビアでいろいろ大変ですね。
http://www2.muroran-it.ac.jp/circle/mpc/front/old1/program/algorithm/fixedpoint/index.html
0639デフォルトの名無しさん2011/08/13(土) 08:55:52.88
>256-266
ループしてるよ!
0640デフォルトの名無しさん2011/08/13(土) 11:08:49.02
PSPだと double 使うと悲惨なことになるよ
0641デフォルトの名無しさん2011/08/13(土) 14:10:24.86
       //
     /  /   パカッ
     //⌒)∩__∩
    /.| .| ノ     ヽ
    / | |  ●   ● |     
   /  | 彡  ( _●_) ミ Lua!!
   /  | ヽ  |∪|  /_
  // │   ヽノ  \/
  " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ

0642デフォルトの名無しさん2011/08/13(土) 20:44:27.38
doubleで頂点データなんか用意したら、そんな精度要らないのにメモリやキャッシュを無駄にするし、x86でもSSEを前提に設計するだろうに。
0643デフォルトの名無しさん2011/08/13(土) 21:08:55.04
LuaJITだと、JITがSSE2向けに作ってある
0644デフォルトの名無しさん2011/08/17(水) 00:13:26.24
組み込みだとdoubleはまだまだきついね
かといってLuaは整数、少数で変数分けてないからfloatにすると精度がきついので
固定少数を検討することになる

ところで蒸し返すようで悪いんだが、Luaはスレッドセーフではないよね?
リエントラントに作ってあって、アプリ実装者がやりやすいように作ってあるだけで
LuaGemsの人はState分離したらスレッドセーフにできるよって言ってるだけだし、

いや、規制で書き込めなくて、過去スレで何回かスレッドセーフではないって言われてるのに
なんか理不尽な流れだなーと思って眺めてたんだ。オレオレ君が間違った認識持って帰る分には
いいんだけどね
0645デフォルトの名無しさん2011/08/17(水) 00:15:17.22
てめえの垢で呟いてろオッサン
0646デフォルトの名無しさん2011/08/17(水) 00:33:01.21
なんでだれも実際のコードで試さないの?
0647デフォルトの名無しさん2011/08/17(水) 00:35:37.68
とっくに試して自明だからだろ

同一のstateとそれから派生した state は別スレッドからは扱えない。スレッド毎に作る分には問題ない

事実は単にこれだけ。
0648デフォルトの名無しさん2011/08/17(水) 05:04:41.03
そう。
それに対して「僕はこうだとおもいまーす」はブログに書いといてください
0649デフォルトの名無しさん2011/08/17(水) 08:38:38.61
>>644
Luaはstate単位でスレッドセーフ。
それをもってスレッドセーフでないというのは単なる言葉遊び。好きにしろ。
0650デフォルトの名無しさん2011/08/17(水) 08:41:27.32
>>644
Do not confuse Lua threads with OS threads.

By Luiz Henrique de Figueiredo
0651デフォルトの名無しさん2011/08/17(水) 08:50:19.38
>>650
そんな間違いをしてる人はこの話の流れで一人もいないぞ
0652デフォルトの名無しさん2011/08/17(水) 13:33:36.16
スレッドセーフについては、複数走らせたい場合はStateを複数作れば
いいわけで、大した問題ではない。
一つのStateを複数のスレッドから使う場合も、Mutexでアクセス権を付与すれば
いいだけだし、そもそもそんな使い方をする状況もあるのか怪しい。

複数走らせてるLuaStateから同じC変数にアクセスする必要性ならわかるが、
それはLuaがスレッドセーフになってるかは関係ないケースだし。
スレッドセーフ厨の人は、どういう状況を想定してるんだろ?
■ このスレッドは過去ログ倉庫に格納されています