タイトル通り。
・canvas への描画が可能なことを確認。
・emscripten_sleep() でその場で停止できることを確認。
・付属の emrun や mongoose などで Local Server を作れば、local だけで
wasm の起動が出来ることを確認。
・mongoose からは、cgi も起動でき、XmlHttpRequest()でローカルファイルを
JSから読み込め、cgi も自由に起動できることを確認。
・ローカル・ファイルアクセス、clipboard の読み書きの他、Local OS の
全ての機能を自由にできる可能性有り。
・これを使えば、Java の JVM に変わる新たなローカル仮想環境ができる。
【wasm】ブラウザでC++。Emscriptenを語ろう
■ このスレッドは過去ログ倉庫に格納されています
1L
2019/01/15(火) 19:50:48.94ID:cXSiB+ud2019/01/19(土) 11:38:40.03ID:P/iwNPAz
【wasm を使う際に難しそうな事柄色々】
・async, await
・yield [ function generator ]
・setjmp(), longjmp()
・sleep() ; emscripten_sleep() で実装されてはいるが、とても複雑な方法で実装。バグ有り。
・Atomics, wait(), notify()
【ヒント】
1. wasm からは、JSの関数を呼び出せる。
2. JS からは、wasmの関数を呼び出せる。
3. JS からは、XmlHttpRequest() で WebServer 経由で外部ファイルを読み出せる。
4. XmlHttpRequest() の代わりに fetch() も使えるらしい。
5. JS では、eval(文字列); によって、文字列の中に書かれているJSコードを実行できる。
6. 1と5を使えば、wasmからJSの任意のコードを実行段階で変化する動的な引数を付けて
呼び出されるように出来る。
7. Emscripten では、EM_ASM(), EM_ASM_INT() 文は、*.ll コードでは、
それぞれに対応した関数を call するコードに置き換わる。
・async, await
・yield [ function generator ]
・setjmp(), longjmp()
・sleep() ; emscripten_sleep() で実装されてはいるが、とても複雑な方法で実装。バグ有り。
・Atomics, wait(), notify()
【ヒント】
1. wasm からは、JSの関数を呼び出せる。
2. JS からは、wasmの関数を呼び出せる。
3. JS からは、XmlHttpRequest() で WebServer 経由で外部ファイルを読み出せる。
4. XmlHttpRequest() の代わりに fetch() も使えるらしい。
5. JS では、eval(文字列); によって、文字列の中に書かれているJSコードを実行できる。
6. 1と5を使えば、wasmからJSの任意のコードを実行段階で変化する動的な引数を付けて
呼び出されるように出来る。
7. Emscripten では、EM_ASM(), EM_ASM_INT() 文は、*.ll コードでは、
それぞれに対応した関数を call するコードに置き換わる。
2019/01/19(土) 12:31:16.19ID:P/iwNPAz
【asm.js】
・asm.js は、JS のサブセット。だから、JS を超えることは出来ないらしい。
・Emscripten は、Em+Script+en という造語らしい。「Em+xxx+en」は「xxx化する」
の意味なので、Emscripten は、「Script 化する」の意味となる。
・Emscripten は元々、C/C++ コードを wasm ではなく、JS コードのサブセットで
あるところの asm.js に変換するシステムだったらしい。
・だから今でも、いったん asm.js に直してから binaryen で wasm に
変換しているらしい(←推定)。
・asm.js の仮想マシンの主記憶は JS の HEAP32[] 配列が対応するらしい。
・仮想マシンのスタックポインタは JS の STACKTOP という名前の変数で、C/C++ の
auto local な変数は、HEAP32[STACKTOP + ofs] の形式で参照されることが多い。
【wasm】
・wasm は、バイナリ形式だがテキスト形式も存在し、wast、wat と呼ばれ、
LISP の S 式に近い人間が可読な形式になっている。
【LLVM】
・LLVM は、*.bc がバイナリ形式。*.ll が人間が可読な形式。Emscriptenでは、
拡張子が bc の代わりに o とされている。
・llvm-as で、*.ll を *.bc に変換できる。
・asm.js は、JS のサブセット。だから、JS を超えることは出来ないらしい。
・Emscripten は、Em+Script+en という造語らしい。「Em+xxx+en」は「xxx化する」
の意味なので、Emscripten は、「Script 化する」の意味となる。
・Emscripten は元々、C/C++ コードを wasm ではなく、JS コードのサブセットで
あるところの asm.js に変換するシステムだったらしい。
・だから今でも、いったん asm.js に直してから binaryen で wasm に
変換しているらしい(←推定)。
・asm.js の仮想マシンの主記憶は JS の HEAP32[] 配列が対応するらしい。
・仮想マシンのスタックポインタは JS の STACKTOP という名前の変数で、C/C++ の
auto local な変数は、HEAP32[STACKTOP + ofs] の形式で参照されることが多い。
【wasm】
・wasm は、バイナリ形式だがテキスト形式も存在し、wast、wat と呼ばれ、
LISP の S 式に近い人間が可読な形式になっている。
【LLVM】
・LLVM は、*.bc がバイナリ形式。*.ll が人間が可読な形式。Emscriptenでは、
拡張子が bc の代わりに o とされている。
・llvm-as で、*.ll を *.bc に変換できる。
2019/01/19(土) 13:02:28.07ID:P/iwNPAz
誤: auto local な変数は、HEAP32[STACKTOP + ofs] の形式で参照されることが多い。
正: auto local な変数は、HEAP32[(STACKTOP<<2) + ofs] の形式で参照されることが多い。
正: auto local な変数は、HEAP32[(STACKTOP<<2) + ofs] の形式で参照されることが多い。
2019/01/19(土) 15:43:48.91ID:P/iwNPAz
【VM (Virtual Machine) としての wasm】
・結論から言うと、wasm は、VM としては、JVM や、flash VMより劣っていると思う。
例としては、「同期オブジェクト(Win32 のWaitForSingleObject()相当)」や、
sleep() もほぼ、wasm でちゃんと実装できそうなのは、Chrome と、FireFoxに限られる事。
・ところが、Platform 会社の「思惑(Mac上の開発環境の使用の強制)」や
「訴訟問題(GoogleとOracleの裁判)」により、上記の二つのVMは除外されて行く
傾向にあり、スマフォでも使えるVMとして残っていくのは、wasm と .NET だけ
になっていきそうな気がする。
・だから、言語のFRONT END開発者としては、スマフォでも使えるVMとしての選択肢は
wasm が有力ではあるが、機能面で(かなりの)問題があるというジレンマが生じる。
・これは、GAFA プラットフォーム支配の問題点の一つ。
------------------
[WHY APPLE WON'T ALLOW ADOBE FLASH ON IPHONE]
https://www.wired.com/2008/11/adobe-flash-on/
・結論から言うと、wasm は、VM としては、JVM や、flash VMより劣っていると思う。
例としては、「同期オブジェクト(Win32 のWaitForSingleObject()相当)」や、
sleep() もほぼ、wasm でちゃんと実装できそうなのは、Chrome と、FireFoxに限られる事。
・ところが、Platform 会社の「思惑(Mac上の開発環境の使用の強制)」や
「訴訟問題(GoogleとOracleの裁判)」により、上記の二つのVMは除外されて行く
傾向にあり、スマフォでも使えるVMとして残っていくのは、wasm と .NET だけ
になっていきそうな気がする。
・だから、言語のFRONT END開発者としては、スマフォでも使えるVMとしての選択肢は
wasm が有力ではあるが、機能面で(かなりの)問題があるというジレンマが生じる。
・これは、GAFA プラットフォーム支配の問題点の一つ。
------------------
[WHY APPLE WON'T ALLOW ADOBE FLASH ON IPHONE]
https://www.wired.com/2008/11/adobe-flash-on/
2019/01/21(月) 19:24:23.00ID:x6DE2oRu
7L
2019/01/22(火) 15:48:18.25ID:6S+2YJAI XmlHttpRequest() は、同期モードにすれば、CGI の動作が完了するまで
待てる気がする。もし、その CGI が、内部で Sleep( 1000 ) 相当の待機を
行えば、JS を、その場で 1秒間 待機させることが出来るかもしれない。
待てる気がする。もし、その CGI が、内部で Sleep( 1000 ) 相当の待機を
行えば、JS を、その場で 1秒間 待機させることが出来るかもしれない。
2019/01/22(火) 17:47:28.65ID:6S+2YJAI
Android の主要言語はJavaだが、VMは、JVM ではなく、Google 製の
ART (旧Dalvik) の VM を使っている。
だから、このVMは残っていくんだ・・・。
Google は、もっぱら wasm 路線だと思っていたんだが・・・。
ART (旧Dalvik) の VM を使っている。
だから、このVMは残っていくんだ・・・。
Google は、もっぱら wasm 路線だと思っていたんだが・・・。
2019/01/24(木) 22:53:00.98ID:/05KE7l4
>>3 >>4
どうやら、STACKTOP、HEAP32[] を使うのは、asm.js 流で、
wasm の stack はまた別系統になっているらしい。
前者は、global 領域に確保された HEAP32 配列を使うので、通常の
CPUアーキテクチャでのスタックの実装法に近い。そのため、CPUで
出来ることは何でも出来るといっても過言ではない。
一方、wasm の stack には、今のところ stack pointer が存在していない
らしい。だから、stack の値を検査したり、独自にコピーして保存して
何らかの効果を得たりすることも出来ないと思われる。
一方で、wasmでの標準的な作法なので、auto 変数もこのやり方
を使うことになっているため、ブラウザでJITなどは、CPUレジスタに
割り付けることによる速度向上が見られるかもしれない。
ここでジレンマが生じる。実は、wasm では、sleep() 機能を使う際には、
-s ASYNCIFY=1 を指定しなくてはならない。すると、前者の実装方に
なるだろう。すると、wasm での標準的な方法ではなくなるために、
CPUレジスタへの割付が行われない可能性がある。
なお、話が複雑になるが、ASYNCIFY=1 の指定は、現在の JS の WebAPI の仕様
と絡むと、emscripten_sleep() だけの問題ではなく、非常に重要と言っても過言ではない。
結論を言ってしまえば、OpenFileDialog() のようなもので、ユーザーがファイル名を
選択するのをその場で「待つ」事や、getch() や bat ファイルの pause 文のように
キー入力を待つことのような、便利な機能がはっきり言って実装不可能になってしまう。
これは長くて深い話なので、ちゃんと説明するのは難しい。
どうやら、STACKTOP、HEAP32[] を使うのは、asm.js 流で、
wasm の stack はまた別系統になっているらしい。
前者は、global 領域に確保された HEAP32 配列を使うので、通常の
CPUアーキテクチャでのスタックの実装法に近い。そのため、CPUで
出来ることは何でも出来るといっても過言ではない。
一方、wasm の stack には、今のところ stack pointer が存在していない
らしい。だから、stack の値を検査したり、独自にコピーして保存して
何らかの効果を得たりすることも出来ないと思われる。
一方で、wasmでの標準的な作法なので、auto 変数もこのやり方
を使うことになっているため、ブラウザでJITなどは、CPUレジスタに
割り付けることによる速度向上が見られるかもしれない。
ここでジレンマが生じる。実は、wasm では、sleep() 機能を使う際には、
-s ASYNCIFY=1 を指定しなくてはならない。すると、前者の実装方に
なるだろう。すると、wasm での標準的な方法ではなくなるために、
CPUレジスタへの割付が行われない可能性がある。
なお、話が複雑になるが、ASYNCIFY=1 の指定は、現在の JS の WebAPI の仕様
と絡むと、emscripten_sleep() だけの問題ではなく、非常に重要と言っても過言ではない。
結論を言ってしまえば、OpenFileDialog() のようなもので、ユーザーがファイル名を
選択するのをその場で「待つ」事や、getch() や bat ファイルの pause 文のように
キー入力を待つことのような、便利な機能がはっきり言って実装不可能になってしまう。
これは長くて深い話なので、ちゃんと説明するのは難しい。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【速報】トランプ大統領、中国の習近平国家主席を「国賓」として招待することに ★2 [ニョキニョキ★]
- 日本と中国を結ぶ12航空路線で全便欠航 中国人に最も人気の海外旅行先は日本から韓国に [ぐれ★]
- 米中電話会談、トランプ氏は「米国側は中国にとっての台湾問題の重要性を理解する」 [1ゲットロボ★]
- 【東京・足立の車暴走】赤信号無視か 危険運転致死傷疑いも視野に捜査 逮捕された職業不詳の男性(37)は精神疾患で通院歴も ★3 [ぐれ★]
- 【音楽】「なんでこんなバカが国のトップなの?」 若者に人気のバンド「GEZAN」のマヒトゥ・ザ・ピーポーが高市総理に苦言 [シャチ★]
- 【国際】トランプ氏、来年4月に中国を訪問する招待を受け入れる 習氏も国賓で訪米へ 電話会談 [ぐれ★]
- 専門家「社会不安や不満が高まると、人々は原因を単純化し外集団を脅威として捉えやすくなります」政権批判か?😡 [399259198]
- ーーーーー力が欲しいんかーーーーー?
- 水とかいう地球にしか存在しない謎の存在
- 【画像】女にモテるタバコの銘柄
- 【画像】なんか模型屋さんにいかにもお前らが好んでそうなアキバ系のアニメ?のキャラいたけどこれなに?
- 【高市悲報】来年、習近平主席がアメリカに「国賓」として訪米。どうするんだよ高市・・・アメリカも敵に回すのか? [483862913]
