Webブラウザでも分散

Emscriptenを用いてC++JavaScriptに変換することで、Webブラウザとネイティブで同じアルゴリズムで接続できるようにした。 本当はJavaScriptではなく、WebAssemblyに変換したかったが、embindを使ったクラスや関数のエクスポートが最小サンプルでも動かなかったため、今回はスキップした。

ロジックは変換できても、スレッド、POSTアクセス、WebRTCアクセス、タイマーなどの機能は直接変換できないため、JavaScriptで記述して、C++側から呼び出すようにした。

f:id:llamerad-jp:20171108065926p:plain

まだバグっぽいですね。

JavaScriptの非同期処理は、C/C++との連携において、非常に面倒な問題になる。PromiseやGeneratorは、非同期処理を同期処理っぽく書く手段を提供しているが、あくまで「ぽい」だけで、本当に同期処理になっているわけではない。C/C++で書いた同期的なロジック中で、非同期なJavaScriptの機能を使おうとすると、ネイティブな処理とは実行タイミングなどが変わり、処理順序の変化から、バグを引き起こした。C/C++でthreadやwaitを使おうにも、Emscriptenで変換したC/C++は、あくまでJavaScriptエンジン上で動くため、問題の解決はできない。これらの機能は設計段階から非同期なコールバックやタスクとして処理することを前提とした設計にする必要があった。(ので、かなり書き換えた)