Design: 非同期/ promiseサポート

作成日 2018年01月07日  ·  7コメント  ·  ソース: WebAssembly/design

多くのJavaScriptライブラリは非同期であり、WebAssemblyがpromiseをサポートしていることはまだわかりません。
JSエコシステムを活用するパフォーマンスの高いアプリケーションを簡単に作成するために、インポートされた関数にpromiseのサポートを追加することをお勧めします。

たとえば、これは機能するはずです。

const importObject = { 
  returnOneAsync: () => new Promise(done => done(1)) 
};
extern "C" int returnOneAsync();

int main(){
  int x = returnOneAsync(); // should suspend main until promise resolved.
  return x+x;
}

最も参考になるコメント

あなたはウェブの計算モデルを誤解していると思います。 JavaScriptはマルチスレッドではないため、計算を一時停止するとエンジンが停止し、実際には、JavaScriptをホストしているレンダラー全体が停止します。 ページがフリーズし、他のコードを実行できなくなります(個別のワーカーを除く)。 サスペンションを飛ばすには、継続を具体化して後で復元する方法が必要になります。これは、現在エンジンで実行できることではありません。

全てのコメント7件

JSの約束のサポートは、 JSホストバインディングの提案の一部である必要があり

ただし、C自体が非同期の実行と一時停止を理解する必要があるため、例が示すように機能しない可能性がありますが、そうではありません。 また、例には非同期はありません。promiseを作成するだけなので、同等のコードはJS自体で中断することもなく、 "[object Promise][object Promise]"ような文字列を生成するだけです。

また、あなたの例には非同期はありません

イベントループがpromiseを処理するまで、値は使用できません。
アイデアは、値が利用可能になるまでWebAssemblyエンジンの実行を一時停止することです。
もちろん、提供されている例は非常に簡単です。 より具体的な例は、ネットワークを介してデータベースクエリを作成することです。 getAgeOf: (name) => db.find({name}).then(x=>x.age)

C自体は、非同期の実行と一時停止を理解しますが、理解していません。

それは正しくありません。 Cにはさまざまなコルーチンの実装があります。
さらに、LLVM-5.0以降は、コルーチンとasync / awaitをサポートします。

https://llvm.org/docs/Coroutines.html

そして、C ++ 17の補遺として、clang-5.0以降に実装されたコルーチンがあります。
すでにそれを使用している実験ライブラリがいくつかあります:
https://github.com/lewissbaker/cppcoro#generator

Cでのコルーチンの実装は、JavaScriptのイベントループと魔法のように相互運用しません。 また、通常、実装固有の動作に依存します。 コルーチンや非同期のようなものを確実かつ移植可能に実装するには、言語で区切られた継続の形式が必要になります。 最も近いCが提供しなければならないのはlongjmpですが、これは十分ではなく、現在Wasm自体に実装することはできません(Emscriptenを使用すると、longjmpはJS例外を除いてJSに実装されます)。 Wasmは現在、停止を表現できませんが、最終的にはこれらの線に沿って何かを追加する計画があります。 C ++コルーチンはまだ標準ではなく、EmscriptenAFAICTでは処理できません。

あなたがどこから来ているのかわかります。
自分の考えを十分に表現できていないと思います。
C / C ++でコルーチンやPromiseをサポートしたり、wasmバイトコードでそれを実現したりすることを提案しているわけではありません。

ただし、C自体が非同期の実行と一時停止を理解する必要があるため、例が示すようには機能しない可能性がありますが、そうではありません。

Cが非同期実行を理解する必要があるのはなぜだと思いますか?

約束が解決されるまでwasm実行エンジンを一時停止する技術的な難しさは何ですか?

wasmは事前にx86にコンパイルされることになっていることを理解していますが、実行のフローを制御できないという意味ではありません。
実行を停止する一般的な方法は、ハードウェア割り込みとptraceのようなシステムコールを使用することです。 これがデバッガーの動作です。 どの関数がインポートされるかを正確に把握しており、それを実現するために適切な(x86)オペコードを挿入できます。 これにより、これらの関数の実行が遅くなりますが、いずれにせよ解決の約束を待っているので、問題ではありません。
これが、LLVMベースのC ++ JIT / AoTにsuspend / debug / resumeを実装した方法です。

この問題は、host-bindingsリポジトリに提出する必要があると思います...

あなたはウェブの計算モデルを誤解していると思います。 JavaScriptはマルチスレッドではないため、計算を一時停止するとエンジンが停止し、実際には、JavaScriptをホストしているレンダラー全体が停止します。 ページがフリーズし、他のコードを実行できなくなります(個別のワーカーを除く)。 サスペンションを飛ばすには、継続を具体化して後で復元する方法が必要になります。これは、現在エンジンで実行できることではありません。

関連: https

あなたはウェブの計算モデルを誤解していると思います。 JavaScriptはマルチスレッドではないため、計算を一時停止するとエンジンが停止し、実際には、JavaScriptをホストしているレンダラー全体が停止します。 ページがフリーズし、他のコードを実行できなくなります(個別のワーカーを除く)。 サスペンションを飛ばすには、継続を具体化して後で復元する方法が必要になります。これは、現在エンジンで実行できることではありません。

正確には、wasmは、UIを処理するのではなく、計算タスク用に作成されたワーカー内で実行する必要があります。

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

Artur-A picture Artur-A  ·  3コメント

artem-v-shamsutdinov picture artem-v-shamsutdinov  ·  6コメント

spidoche picture spidoche  ·  4コメント

chicoxyzzy picture chicoxyzzy  ·  5コメント

frehberg picture frehberg  ·  6コメント