「ん~、知らない人は今まで損してたってこと?」 はい、今まで普通に利用していた人は損してます。今回「無料でさら…

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

1デフォルトの名無しさん2016-09-22 18:23:47

LuaやSquirrelやAngelScriptなどアプリケーションへの組み込み用途で

使われるプログラミング言語についてのスレッドです

Luaに限定してるわけではないのでレスする場合は言語を明記してください

まとめwiki(なにか質問する前に必ずみること!)

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

■前スレ

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

■過去スレ

その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/

8デフォルトの名無しさん2016-09-26 08:06:56

ノンプリエンプティブなマルチタスクしか実現できないLuaでファイルアクセルの

オーバーヘッドを掩蔽することは不可能ですか?

IO待ち中にタスクを切り替えられないと思いますけど何か方法があるのでしょうか

9デフォルトの名無しさん2016-09-26 08:30:26

>>8

別スレッドで自動でファイル読み込みして、メモリへの読み込み終わったら通知が来るような仕組みを別途作ればいい

11デフォルトの名無しさん2016-09-28 00:35:49

タスクの定義がなんだかよーわからへんけど、1つのスレッドで読み込み要求を発行した後、

そのままそのスレッドで円周率ん万桁とか計算したりした後、

読み込みが終わったかどうかを確認した上で読み込んだ内容をほげほげしたい、と仮定しよう

Win32だったら::ReadFile(::ReadFileEx)はプログラマがマルチスレッドを意識する事なく非同期読み書きが可能

キーワードはReadFile、GetOverlappedResult、

あとCancelIo(一度に沢山読み込むのを例外とかでキャンセルしたりする時に重要、

キャンセルしたら即全部止まる訳じゃないからGetOverlappedResultで待ち合わせないとダメよ)

Linuxの類ならスレッドなりプロセスのフォークなりして最初に読み込んで

単純にLuaスクリプトが追いついたらWait何とかみたいな関数バインドして待たせたらどうだろうか

で、どうしてもLuaが主導で要求を発行した上で自前の他のスレッドでやりたいってんなら

Luaにクリティカルセクションか非同期読み込みに使ったイベントへのアクセス手段を

ホスト(Luaスクリプトを使う側から見た内部)で存続から何から何まで管理して

ロック待ち、ロック開放、イベントシグナル変更、シグナル待ち まで提供しとけば手っ取り早くできなくはない

ただしマルチスレッドプログラミングの注意点をLuaでも守らなきゃならなくなる

最後は>>9の手段についてだけど、これが無難と言えば無難だけど、

通知を待つ手段をコルーチンの類にすると、ちょいと突っ込んだ事を始めるとすぐに限界にぶちあたる筈

どうせ読み込みを開始して必要な処理が終わったらコルーチンか終了フラグをポーリングするんだろうから

いっその事ブロッキングしちゃった方がいいんじゃないかと思わなくもない

この時の注意点はホストからの終了要求も取りこぼさない様に2つ(複数)のハンドルをウェイトする事

12デフォルトの名無しさん2016-09-28 06:29:58

Luaに足りない機能が欲しいときはJavaScriptを参考にするといい

この2つはスクリプトエンジン部分が非常によく似ている

非同期処理が欲しいなら、Promiseのように処理完了でコールバックする形式が良い

実装は、非同期I/Oなりスレッドプールなりでご自由に

また、Lua自体を並列実行したい場合は Web Worker が参考になる

新しいStateで独立したグローバル環境を用意し、引数/返値のみマーシャリングする

ホスト側のマルチスレッドを公開する >>11 の方法は間違いで、GCが破綻する

17デフォルトの名無しさん2016-09-28 11:36:11

typescriptというよりbabelか

型があると組み込みとかで面倒な事になりそうだし

21デフォルトの名無しさん2016-09-28 21:14:26

「スレッドではありません。コルーチンです」とか

「オブジェクトではありません。連想配列です」とかはっきり言うべきなんよ

そうしないと「スレッドのくせにこんなこともできないのか」

「オブジェクトのくせに以下同文」ってなる

22デフォルトの名無しさん2016-09-28 23:59:20

>>21

コルーチンはあくまで言語の遷移の構造を指す用語(サブルーチンと対になる用語)だから、実行の主体を示すのは「スレッド」で正しいぞ

23デフォルトの名無しさん2016-09-29 06:26:28

>>22

それはつまり正しい用語を使った作者は正しくて誤読した読者が悪いってことか

でも正しい奴も悪い奴も全員にメリットのある方法ってないのかな

39デフォルトの名無しさん2016-10-01 07:36:37

結局は原則としてlua側の方から結果が存在するかどうか調べにいかなきゃならないね

40デフォルトの名無しさん2016-10-01 08:31:36

>>39

それJavaScriptで同じこと言えるの?

41デフォルトの名無しさん2016-10-01 08:55:44

>>40

>>11みたいに全ステート共通のユーザデータに排他管理されたデータ積んで

イベント発生毎にスレッドプールからスレッド取ってきて独立したハンドラ専用のステートで

そのイベント専用のスクリプトの実行まですればイベントドリブンは可能

そこまで作りこむとスレッドプールの空きに合わせて投機実行してシナリオデータが間接参照してる

他の細々としたファイルの先読みもそんなに大変なことでもなくなる

どっちのレベルに合わせればいいのかわかんね

42デフォルトの名無しさん2016-10-01 10:41:00

>>41

色々知識足りてないね。勉強したら?

46デフォルトの名無しさん2016-10-01 14:18:37

だから絶対やらんて、3時間に設定したからもうすぐロダから消える

何故煽られるのか考えてみた

lua_sethookでcountフックして終了フラグ見たらthrowみたいな強制的なWin32スレッドの終了ではなく

メモリリークしないluaスクリプトの中断とかですらマイナーな手法なのかな?

俺は行と行の間で止まってる事が約束されてるんだから何かの要求があったらyieldの流れに

干渉するような変更とか平気でやってたんだけど、その辺の温度差なのかな?

48デフォルトの名無しさん2016-10-01 15:09:41

>>46

外の人がブレーキかけない限り停止しないスクリプトって面倒臭くない?

なぜ自律的に停止しないのか

58デフォルトの名無しさん2016-10-01 21:55:15

>>46

yeild でメインループの呼び出し元に安全に戻ってきてるんだから、そこで全部必要な他スレッド処理した上で後始末もして、

必要ならそれぞれ駆動させてるluaスレッドにluaの例外返して、それをスクリプト側で自発的に処理するだけじゃん?

lua側にスレッドではまるコードを入れる必要性が全く無いのにそれを考えるのはナンセンス

47デフォルトの名無しさん2016-10-01 14:38:36

煽ってるやつはどうせ何も分かってないんだからスルー上等…

なところだが奮起していろいろやってくれるのは面白いから応援しよう

49デフォルトの名無しさん2016-10-01 15:22:20

>>47ひでぇ; いや、俺が釣り針に食いついた自爆かな?

いつもはあちこちROMだけど、非同期周りで頭がうにってるとこに同じネタが来てたからつい・・・

>>48使うの自分だけならいいけど「無限ループ解除できないの?」の対応めんどくさい

それにasもv8もJSRTも外部からの停止メソッド当然の様に積んでるし

luaでも出来るってわかっちゃったら俺の中では当然実装しちゃう

置き土産、非同期でReadFileしてもキャッシュにあると即リザルト確定、そこそこ頭いいのかと思いきゃ

ヘッドの位置とか取得できないらしくて単純な判定しかしてない、ようするに自分でスレッド作って

そっちでブロッキングReadFileしてるのと殆ど変わらない、だから>>11みたいになる

しかもReadFileはハイブリッドカーネル内部ではなくkernel32.dllがユーザ空間にWin32スレッドを生成、

だから時間が掛かるでかい読み込みが終わる前にプロセス(デバッグ含む)毎終了すると何食わぬ顔で終了

しかしReadFile直後にLANケーブル引っこ抜いてCancelIoしたりしてもReadFileはウェイトのまま

ここでCancelIoしてもGetOverlappedResultしなきゃとかスクリプト終了で全ての待ち合わせが終わる前に

「今のエラーどこだっけ?」とか即再実行したりすると稀に起きる再現性のない原因不明のメモリ破壊

原因わかって「もうこれ全部自分で管理した方がトラブル少なそう」で今に至る、もう手の内は出さない

50デフォルトの名無しさん2016-10-01 15:45:33

無限ループしたから解除したい

バグったからデバッグしたい

これは非同期でもマルチタスクでもなくデバッグの話だよね

51デフォルトの名無しさん2016-10-01 15:53:18

>>50

一番簡単な例として挙げただけでcountフックで止まってる間は再開までに辻褄があってれば

変数の変更から状態遷移の誘発まで色々できるよ

52デフォルトの名無しさん2016-10-01 16:02:15

>>51

「面倒臭くない?」に対して「色々できるよ」は答えになってない

59デフォルトの名無しさん2016-10-02 02:15:08

>>58

それな。

間違った方法と気付かず突き進む無能な働き者臭がプンプンする。

67デフォルトの名無しさん2016-10-02 18:23:40

それ以前にFILE_FLAG_SEQUENTIAL_SCAN立てて開いてればいきなりReadFileでえっらい容量を

読もうとしない限り大抵先読みされる筈だから意味ないとおも

70デフォルトの名無しさん2016-10-02 18:35:41

ミスった、>>66

>>68

コマンドラインをけなしてる訳じゃないんだ

むしろFreeBSD11.0(フライング)で盆栽ならぬ現実逃避しながら土方グラマしてるくらい慣れてるし否定はしない

ただ、現実問題ゲームのツールにしても少なくとも俺の知る限りGUIでないと通用しないしサポートも大変

けなしてると思われたなら謝罪する、申し訳なかった

72デフォルトの名無しさん2016-10-02 22:57:42

もしかして、1つのファイルを頭から非同期で良かったん…?

1つのファイルを頭から順の先読みなんてのをユーザが実装する意味ないです、

どう実装するとかインターフェース云々構造云々言うまでもなくフラグ立てれば

キャッシュを見れる位偉い人が下で勝手にやってくれます;

CreateFile直後のReadFileとかよっぽど早い読み込みとかでもなければ

ERROR_IO_PENDING返ってきません、スレ汚し失礼しました;

78デフォルトの名無しさん2016-10-07 01:39:43

整理してみようか

・ネットワークアクセスというからにはWindowsで非同期読み込み? > yes:>>67

・何を非同期で処理させたい? > ファイルやディスク類:>>75

・WindowsでGUIを非同期で処理させたい? > GdiFlushを参照(元々非同期)

Vitaだとしたら・・・ちょっと検索したけどVitaのLuaってどこかわかりやすい解説サイトない?

ないならVitaでLuaしてない人は軒並みお手上げ

ホストがどんな機能をどんな形でどれだけ提供するかで大分フローは様変わりする

80デフォルトの名無しさん2016-10-07 03:33:02

なんかネイティブコードをコンパイルできない環境を正当化してるみたいで嫌な感じだ

86デフォルトの名無しさん2016-10-07 18:10:59

組み込みじゃなかったらLua使うメリットなくない?

Pythonとかでいい

87デフォルトの名無しさん2016-10-08 01:59:56

>>86

JITによるJava顔負けの圧倒的な実行速度。しかもJavaより起動が速い

Pythonなんて雑魚

90デフォルトの名無しさん2016-10-08 07:22:36

>>87

よくJITで比べるひとがいるけど、ホントにLuaJITを使ってる?

本家への追従も遅くて、開発体制が不安なんだけど

92デフォルトの名無しさん2016-10-08 10:59:59

>>90

低機能でも良いから速度が欲しい場合に使ってみている

110デフォルトの名無しさん2016-10-21 08:41:00

iPhoneのautotouchです

例えば

::repeat::

touchDown(11, 728.44, 1325.47);

usleep(66621.17);

touchMove(11, 714.09, 1318.31);

usleep(8072.75);

goto repeat

↑を30分繰り返し実行させたあと

別の動作

という感じのマクロを組みたくて、できますか?

111デフォルトの名無しさん2016-10-21 09:06:49

>>110

30分たったら繰り返し抜ける条件入れて”別の動作”するだけじゃん?

114デフォルトの名無しさん2016-10-21 11:00:27

>>111

30分たった、というのをどう書き込めばしたらいいのでしょうか?

112デフォルトの名無しさん2016-10-21 09:20:45

現在時刻を見て30分の経過を判定したいなら os.time() が使える

ただスキルレベルから推察するに

「30分間の動作」を個別に作成して、30分(以上)間隔での自動起動を登録するのが楽な気がする

113デフォルトの名無しさん2016-10-21 10:51:51

>>112

30分間の動作を個別に作成ということは1回1分の動作を30回行うということでしょう?回数で指定してしまうと、画像認識などを組み込んでいると、固まってしまった時などに対応出来ないので分数で指定したいなと思ったのです。os.timeというのを少し勉強してみます。

124デフォルトの名無しさん2016-12-20 08:22:49

経験0なのがluaの経験なのか、プログラミングの経験なのか

luaを使うのが目的なのか、目的の為にluaを使おうとしてるのか

それで大分事情は変わってくる

lua簡単そう=Python並にGUIまでやろうと思えばできる と思ってるなら期待はずれ

133デフォルトの名無しさん2017-02-02 02:05:08

Haxe で lua ターゲットにすればいいんじゃね

144デフォルトの名無しさん2017-02-02 16:10:31

俺が言ってるのはLuaにシンタックスシュガーとしてクラス構文を作るって事ね

ES6みたいに

>>133

HaxeってLuaタゲも出来たのか

138デフォルトの名無しさん2017-02-02 05:59:26

PHPやAngelScriptは先にコンパイルするよ

それとクラスの宣言自体は何の処理も実行しない

139デフォルトの名無しさん2017-02-02 06:19:52

>>138

へぇ、何も実行せずクラスが出来上がるのか。お前の使ってるPHPとASは凄いなー(棒)

145デフォルトの名無しさん2017-02-02 17:22:16

>>144

Haxe 3.3 からターゲットに入った模様

146デフォルトの名無しさん2017-02-02 17:26:04

>>145

3.3が最新だったのか

147デフォルトの名無しさん2017-02-02 19:06:39

>>146

最新は3.4でPHP7ターゲット対応らしい

155デフォルトの名無しさん2017-02-15 09:24:28

windowsでファイルを開きたいんだけど、

ファイル名の文字コードはS-JIS以外受け付けないんですか?

もしそうなら海外のソフトはファイルを開くのにutf8以外受け付けないんで、

海外のソフトでファイルを開くとsjis文字はutf8に勝手に変換されて

そのファイル名を使ってファイルを開くにはutf8をsjisに

変換するしかないですね。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする