【Lua】組み込み系言語総合 その7【Squirrel】 [無断転載禁止]©2ch.net

2016/09/22(木) 18:23:46.74ID:t8yALPnl
LuaやSquirrelやAngelScriptなどアプリケーションへの組み込み用途で
使われるプログラミング言語についてのスレッドです
Luaに限定してるわけではないのでレスする場合は言語を明記してください

まとめwiki(なにか質問する前に必ずみること!)
http://wikiwiki.jp/lua/

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

■前スレ
【Lua】組み込み系言語総合 その6【Squirrel】
http://echo.2ch.net/test/read.cgi/tech/1362895832/
■過去スレ
その5 http://toro.2ch.net/test/read.cgi/tech/1321063450/
その4 http://hibari.2ch.net/test/read.cgi/tech/1301414458/
その3 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/
2016/09/22(木) 19:52:44.75ID:t8yALPnl
Lua: http://www.lua.org/
Squirrel: http://www.squirrel-lang.org/
ECMAScript (JavaScript): https://en.wikipedia.org/wiki/List_of_ECMAScript_engines
AngelScript: http://www.angelcode.com/angelscript/
elastiC: http://www.elasticworld.org/
2016/09/22(木) 19:56:44.34ID:t8yALPnl
NGワードでテンプレが張れないのでざっくり削ってしまった
必要なら補完をお願い
2016/09/22(木) 21:05:12.80ID:oIZhSgnz
>前スレ999
リファレンスはあくまで言語リファレンスだから、踏み込んだ機能は Programing in Lua 読まないと駄目だよ

該当機能は13.4に解説されてる
2016/09/22(木) 23:07:14.74ID:t8yALPnl
__index と __newindex の話ならリファレンスにもある
https://www.lua.org/manual/5.3/manual.html#2.4
2016/09/23(金) 00:05:56.60ID:SHIicrTE
>>4
ありがとうございます
ttps://www.lua.org/pil/13.4.5.html
これですね。__indexは関数の節約や継承に相当する機能を実現するために
使いますけど[]の定義とこれらは両立は出来ない・・・?
__indexに[]にさせたい関数を入れてしまうとキーを参照しに行くテーブルを設定できませんし
__indexにテーブルを入れてしまうと[]にさせたい関数を書く場所がないような

>>5
すみません。気がつきませんでした。>>4を見た後に探し直したら見つかりました
2016/09/23(金) 02:26:53.79ID:cTcmD9zg
__indexメタメソッドに設定した関数の中から目的のテーブル参照すりゃ良いだけだと思うが
2016/09/26(月) 08:06:56.17ID:wXZ7/4lL
ノンプリエンプティブなマルチタスクしか実現できないLuaでファイルアクセルの
オーバーヘッドを掩蔽することは不可能ですか?
IO待ち中にタスクを切り替えられないと思いますけど何か方法があるのでしょうか
2016/09/26(月) 08:30:26.28ID:Jg/TEaNB
>>8
別スレッドで自動でファイル読み込みして、メモリへの読み込み終わったら通知が来るような仕組みを別途作ればいい
2016/09/26(月) 08:39:51.12ID:DUFqbT57
Luaだけだと無理だね ホスト側で仕組みを作るしかない
2016/09/28(水) 00:35:49.15ID:yOlfPxWj
タスクの定義がなんだかよーわからへんけど、1つのスレッドで読み込み要求を発行した後、
そのままそのスレッドで円周率ん万桁とか計算したりした後、
読み込みが終わったかどうかを確認した上で読み込んだ内容をほげほげしたい、と仮定しよう

Win32だったら::ReadFile(::ReadFileEx)はプログラマがマルチスレッドを意識する事なく非同期読み書きが可能
キーワードはReadFile、GetOverlappedResult、
あとCancelIo(一度に沢山読み込むのを例外とかでキャンセルしたりする時に重要、
キャンセルしたら即全部止まる訳じゃないからGetOverlappedResultで待ち合わせないとダメよ)
Linuxの類ならスレッドなりプロセスのフォークなりして最初に読み込んで
単純にLuaスクリプトが追いついたらWait何とかみたいな関数バインドして待たせたらどうだろうか

で、どうしてもLuaが主導で要求を発行した上で自前の他のスレッドでやりたいってんなら
Luaにクリティカルセクションか非同期読み込みに使ったイベントへのアクセス手段を
ホスト(Luaスクリプトを使う側から見た内部)で存続から何から何まで管理して
ロック待ち、ロック開放、イベントシグナル変更、シグナル待ち まで提供しとけば手っ取り早くできなくはない
ただしマルチスレッドプログラミングの注意点をLuaでも守らなきゃならなくなる

最後は>>9の手段についてだけど、これが無難と言えば無難だけど、
通知を待つ手段をコルーチンの類にすると、ちょいと突っ込んだ事を始めるとすぐに限界にぶちあたる筈
どうせ読み込みを開始して必要な処理が終わったらコルーチンか終了フラグをポーリングするんだろうから
いっその事ブロッキングしちゃった方がいいんじゃないかと思わなくもない
この時の注意点はホストからの終了要求も取りこぼさない様に2つ(複数)のハンドルをウェイトする事
2016/09/28(水) 06:29:58.49ID:Nip8sf3s
Luaに足りない機能が欲しいときはJavaScriptを参考にするといい
この2つはスクリプトエンジン部分が非常によく似ている

非同期処理が欲しいなら、Promiseのように処理完了でコールバックする形式が良い
実装は、非同期I/Oなりスレッドプールなりでご自由に

また、Lua自体を並列実行したい場合は Web Worker が参考になる
新しいStateで独立したグローバル環境を用意し、引数/返値のみマーシャリングする
ホスト側のマルチスレッドを公開する >>11 の方法は間違いで、GCが破綻する
13デフォルトの名無しさん
垢版 |
2016/09/28(水) 06:47:31.69ID:hiAJ49Og
マルチスレッドを公開する方法はluaのスタックが壊れるよな
2016/09/28(水) 11:28:17.80ID:yOlfPxWj
もちろんlua_newstate lua_newthreadは必須
2016/09/28(水) 11:31:47.14ID:RDlboUCA
luaもes6みたいにクラス構文追加すればいいのに
typescriptを改造してtypelua作れないだろうか
2016/09/28(水) 11:33:06.02ID:yOlfPxWj
てかggればQiita辺りがすぐ引っかかる筈

それと外部からの正常な中断(中断ボタンとか)はデバッグ命令かなんかで1000命令に
1回フラグ見てフラグが立ってたらスレッドの終了シーケンスに移行みたいな乱暴な事をしてる
フラグ立ててイベントをシグナル化、Luaのスクリプトから何かをウェイトする時は
そのイベントとその資源の両方をWaitForMultipleObjectsで待ってシグナル化原因を必ず判定
2016/09/28(水) 11:36:10.73ID:RDlboUCA
typescriptというよりbabelか
型があると組み込みとかで面倒な事になりそうだし
2016/09/28(水) 12:35:10.14ID:yOlfPxWj
メシ前で言葉足らずだったすまぬ

何から何まで直接APIを生で渡してそのままstate切り替えずにマルチスレッドでGoって話じゃない
lua内の変数の直接の共有はもちろんできないからグローバルでホストのユーザデータ持たせて
そこに固定で配列の排他領域持つなりstd::deque<適当>でメッセージポンプなりしなきゃダメ

で、何故WaitForMultipleObjectsかってーと、極端な話最初に実行し始めたluaのスレッドが
別スレッド用のスクリプトを起動してスレッドが動的に生成されて全部無限ループに陥ったりしたのを
止められるように〜とWin32でスレッドをabortしたりすると、実は無限ループじゃなかった時に
使ってたり待ってたりした資源次第でレアなLastErrorや例外になったりして異常なのか正常なのかわからない
luaは俺の知る限り外部からのスレッドセーフな強制中断のメソッドは持ち合わせてないし
google v8なんかも2〜3年位前?のI/Fががらりと変わった時に追加された中断メソッドで
ようやく対応ってくらいだからluaにそれを求めるのは酷かも知れない
だから自分で強制中断の手段をlua_sethookでも何でも使って準備しておくのが吉(異論は認める)
2016/09/28(水) 13:08:14.98ID:Nip8sf3s
>>15
https://github.com/andremm/typedlua
LuaJITのffi宣言は型があるけどLuaへは伝搬しないんだっけか

>>18
もう少し空気を読めるようになろうね
2016/09/28(水) 13:27:05.51ID:yOlfPxWj
CAsyncFile::~CAsyncFile( void )
{
m_bCancel = true;
if( ( !( m_ctxlist.empty() ) ) || ( 0 < m_uPendingCount ) )
{
m_file.AsyncCancelIo();
}
bool bEnd = false;
while( ( !bEnd ) && ( !( m_ctxlist.empty() ) ) )
{
_SAsyncFileHeapContext & ctx = m_ctxlist.front();
if( !( ctx.heap.bPending ) )
{
m_pfilelist->_SubUsingSize( ctx.heap.uHeapSize );
m_ctxlist.pop_front();
}
else
{
bEnd = true;
}
}
}

身バレしそうだからデストラクタしか晒さないけど丁度こういうの作ってたからさ
FILE_FLAG_OVERLAPPEDはマルチスレッドの正常終了シーケンス辿れるくらいじゃないと使いこなせない
その辺管理できないと要求発行したままスクリプト終了やどっかでエラーが起きた時に
更に追い討ちでアクセス違反の類のエラー起こす
2016/09/28(水) 21:14:26.38ID:E/gCU/1d
「スレッドではありません。コルーチンです」とか
「オブジェクトではありません。連想配列です」とかはっきり言うべきなんよ
そうしないと「スレッドのくせにこんなこともできないのか」
「オブジェクトのくせに以下同文」ってなる
2016/09/28(水) 23:59:19.59ID:v1ba5adm
>>21
コルーチンはあくまで言語の遷移の構造を指す用語(サブルーチンと対になる用語)だから、実行の主体を示すのは「スレッド」で正しいぞ
2016/09/29(木) 06:26:28.32ID:wi991s1d
>>22
それはつまり正しい用語を使った作者は正しくて誤読した読者が悪いってことか

でも正しい奴も悪い奴も全員にメリットのある方法ってないのかな
24デフォルトの名無しさん
垢版 |
2016/09/29(木) 06:40:04.23ID:EoqEFEeY
そもそも誤読するやついるのか?
2016/09/29(木) 06:46:03.64ID:y8+pYy20
「オブジェクト」については流石に見解が一致しないだろうから
違う用語 or 意図の説明が欲しいな
26デフォルトの名無しさん
垢版 |
2016/09/29(木) 06:59:50.06ID:EoqEFEeY
ん?Javascriptのオブジェクトも許せない人?
2016/09/29(木) 07:51:10.72ID:a430Zm1B
この流れは俺が悪いのかな?
目的はある意味投機実行ならぬ投機読み込みだよね?
でもって読み込みが終わったらコルーチン遷移だろうと完了待ちブロッキングの関数バインドだろうと
他のWin32のスレッドか完全な別ステート(コンテキスト)のLuaスクリプトでReadFileだろうと
ReadFileExのコールバックルーチンを使おうと必ず全く別のWin32スレッドが必要になる筈なんだけど
いやむしろコルーチンで全部済む方法があったら是非教えてくだちい(皮肉じゃないよ、結構必死)

ちな俺が作ってたのはシナリオインタープリタに例えると、今実行中のステートとは
完全に独立した複数のステートで選択肢の1つ先の全選択肢を入出力ダミーにして投機実行して
全部DISCARDABLEなグローバルヒープに持っとく為に複数ファイルをグローバルなユーザデータの
m_ctxlistに放り込んでFILE_FLAG_OVERLAPPEDで勝手に全部読み込みにいくって感じの代物
デストラクタでGetOverlappedResultできないのは選択肢決定が早かった時にそこで待っちゃうと
本来の読み込み要求(これも排他を待たなきゃいけない)と重なって更に待たされる可能性があるから
でもってどんなエラーが起きてもおいそれとOVERLAPPED構造体は破棄しちゃいけない
最悪メモリリークを選んで他のヒープの開放にいかなきゃいけない
だって、開放したらしたでアクセス違反で他の後始末する前に即ぶっ飛ぶのが目に見えてんだから
単純な決め打ちの非同期入出力なら何とか簡単にできるかも知れんけど、
突っ込んだ事しようとすると頭うにる
2016/09/29(木) 08:07:35.79ID:y8+pYy20
>>26
いや、連想配列とオブジェクトは何が異なるのか?という意味
おそらくオブジェクトは連想配列+αなんだろうけど
説明しろと言われたら、自分はハッキリ説明できる自信が無い
2016/09/29(木) 10:10:01.10ID:AXFlgWC+
OSレベルのスレッド
言語レベルのスレッド
区別してもらえると助かります
2016/09/29(木) 14:17:18.55ID:a430Zm1B
>>27はWin32スレッド以外は”コルーチン””別ステートのLuaスクリプト”としか言ってないんだけど
これでわからないなら非同期は諦めた方がいいかも知れない
ReadFileExのイベントハンドラでやれば良さそうとか考えそうだけど、
スレッドID取得するとシステムの別スレッドだからそこからLuaの何かいじりにいくとスタックぶっ壊すよ
2016/09/30(金) 08:27:54.40ID:aDhSErqk
>>27
管理主体はシステム側がもって、
他からは読み込んだものをメモリー経由でのみアクセスするようにして、
luaからは弱参照する仕組み作って参照する形で全く問題無いような

Luaで扱えるレベルのシステムを必要以上に難しく作る意味は無い
2016/09/30(金) 11:13:49.15ID:j0K6lQ2j
JSなら、メインスレッド以外はサーバーにあってメモリーすらアクセスできない事も多い

スタックが壊れるとかいうならスタックにアクセスしなければいいだけなんだよな
2016/09/30(金) 11:40:47.98ID:LMNz6D7V
>>32
GC中だと何も触れないからLuaスタック以外へのアクセスでも怖いよ
lua_lock / lua_unlock までカスタマイズする気なら、その限りではないが
2016/09/30(金) 13:28:37.87ID:j0K6lQ2j
Luaスタック以外って
C++の変数かな
まあそうだねC++は怖いね
2016/09/30(金) 16:24:15.30ID:aFh0nkO3
>>31
そうだよ、結局はシステム側が管理しなきゃならないと思う、それで全部解決する

OVERLAPPEDなReadFileとGetOverlappedResultの発行をバインドするだけという
最も単純で最も無駄な方法であってもそれが必要になるという話
リモートのファイルにReadFile発行した後LANケーブル引っこ抜いて
スクリプト中断なりエラーなり発生させるとわかる
2016/09/30(金) 18:18:42.06ID:j0K6lQ2j
バインドという単語は公式なマニュアルでは見たことがないので意味が曖昧だが
LuaがC++を呼び出すことしか想定していない気がする
逆にC++がLuaを呼び出す必要がある場合に色々破綻する気がする
2016/10/01(土) 05:36:10.17ID:PtIPW4Qc
無難に済ますなら呼び出されたC++側のコード(ホストからluaのステートにバインドされた関数)で
C++側から通知か何かがあるかどうかを調べたりするのかな
どうしようもなければlua_sethookで登録したハンドラで一定行実行される度にフラグを見て
最低限の処理をして離脱した後、改めてlua側で何かをするとかしかない
38デフォルトの名無しさん
垢版 |
2016/10/01(土) 06:33:04.10ID:cvsJ/xEf
メッセージキュー作ってlua側から呼んでコールバック実行すればいい
2016/10/01(土) 07:36:37.31ID:PtIPW4Qc
結局は原則としてlua側の方から結果が存在するかどうか調べにいかなきゃならないね
2016/10/01(土) 08:31:36.35ID:M5ncT/Oi
>>39
それJavaScriptで同じこと言えるの?
2016/10/01(土) 08:55:44.45ID:PtIPW4Qc
>>40
>>11みたいに全ステート共通のユーザデータに排他管理されたデータ積んで
イベント発生毎にスレッドプールからスレッド取ってきて独立したハンドラ専用のステートで
そのイベント専用のスクリプトの実行まですればイベントドリブンは可能
そこまで作りこむとスレッドプールの空きに合わせて投機実行してシナリオデータが間接参照してる
他の細々としたファイルの先読みもそんなに大変なことでもなくなる

どっちのレベルに合わせればいいのかわかんね
42デフォルトの名無しさん
垢版 |
2016/10/01(土) 10:40:59.92ID:cvsJ/xEf
>>41
色々知識足りてないね。勉強したら?
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況