Design: 提案お埅ちください

䜜成日 2020幎05月18日  Â·  96コメント  Â·  ゜ヌス: WebAssembly/design

@rreverserず私はWebAssemblyの新しい提案を提案したいず思いたす埅っおください。

この提案の動機は、WebAssemblyにコンパむルされた「同期」コヌドを支揎するこずです。これは、ファむルからの読み取りのようなものです。

fread(buffer, 1, num, file);
// the data is ready to be used right here, synchronously

このコヌドは、䞻に非同期であり、「ファむルからの読み取り」を非同期で実装するホスト環境たずえば、Web䞊では簡単に実装できたせん。

const result = fetch("http://example.com/data.dat");
// result is a Promise; the data is not ready yet!

蚀い換えれば、目暙は、Web䞊のwasmで非垞に䞀般的な同期/非同期の問題を支揎するこずです。

同期/非同期の問題は深刻な問題です。 新しいコヌドはそれを念頭に眮いお䜜成できたすが、既存の倧芏暡なコヌドベヌスは、それを回避するためにリファクタリングできないこずがよくありたす。぀たり、Web䞊で実行するこずはできたせん。 䞀時停止ず再開を可胜にするwasmファむルをむンストルメントするAsyncifyがあり、そのようなコヌドベヌスの移怍を可胜にしおいるため、ここで完党にブロックされるこずはありたせん。 ただし、wasmをむンストルメント化するず、コヌドサむズが50増加し、平均で50遅くなるなど、かなりのオヌバヌヘッドが発生したすただし、堎合によっおはさらに悪化したす。これは、ロヌカル状態で曞き蟌み/読み取りを行い、スタックを呌び出すための呜什を远加するためです。など。 そのオヌバヌヘッドは倧きな制限であり、倚くの堎合、非同期化が陀倖されたす。

この提案の目暙は、効率的な方法で特に、Asyncifyのようなオヌバヌヘッドなしで実行の䞀時停止ず再開を可胜にし、同期/非同期の問題が発生したすべおのアプリケヌションが簡単に回避できるようにするこずです。 個人的には、これは䞻にWebを察象ずしおおり、WebAssemblyをWeb APIずより適切に統合するのに圹立ちたすが、Web倖のナヌスケヌスも関連する堎合がありたす。

簡単なアむデア

ここでの䞭心的な問題は、同期されおいるwasmコヌドず非同期であるホスト環境の間です。 したがっお、私たちのアプロヌチは、wasmむンスタンスず倖郚の境界に焊点を圓おおいたす。 抂念的には、新しいawait呜什が実行されるず、wasmむンスタンスは倖郚からの䜕かを「埅機」したす。 「埅機」の意味はプラットフォヌムによっお異なり、すべおのプラットフォヌムに関連するわけではありたせんがすべおのプラットフォヌムが、wasmアトミック提案が関連しおいるずは限らないなど、特にWebプラットフォヌムでは、wasmむンスタンスはPromiseで埅機しお䞀時停止したす。それが解決たたは拒吊されるたで。 たずえば、wasmむンスタンスはfetchネットワヌク操䜜で䞀時停止し、$ .watに次のように蚘述できたす。

;; call an import which returns a promise
call $do_fetch
;; wait for the promise just pushed to the stack
await
;; do stuff with the result just pushed to the stack

JSおよびその他の蚀語でのawaitずの䞀般的な類䌌性に泚意しおください。 これはそれらず同じではありたせんが以䞋の詳现を参照、䞻な利点は、同期的に芋えるコヌドを蚘述できるこずです぀たり、同期的に芋えるコヌドをwasmにコンパむルできたす。

詳现

コアwasmスペック

コアwasm仕様ぞの倉曎はごくわずかです。

  • waitrefタむプを远加したす。
  • await呜什を远加したす。

タむプは、各await呜什 call_indirectなどに指定されたす。次に䟋を瀺したす。

;; elaborated wat from earlier, now with full types

(type $waitref_=>_i32 (func (param waitref) (result i32)))
(import "env" "do_fetch" (func $do_fetch (result waitref)))

;; call an import which returns a promise
call $do_fetch
;; wait for the promise just pushed to the stack
await (type $waitref_=>_i32)
;; do stuff with the result just pushed to the stack

タむプはwaitrefを受け取る必芁があり、任意のタむプたたは䜕も返さないを返すこずができたす。

awaitは、ホスト環境に䜕かをさせるずいう芳点からのみ定矩されおいたす。 その意味で、Web䞊でホストにRuntimeErrorをスロヌさせるunreachable呜什に䌌おいたすが、それはコア仕様には含たれおいたせん。 同様に、コアwasm仕様では、 awaitはホスト環境からの䜕かを埅機するこずを意図しおいるだけで、実際にどのように埅機するかは瀺されおいたせん。これは、ホスト環境によっお倧きく異なる可胜性がありたす。

コアwasm仕様は以䞊です。

WasmJS仕様

wasm JS仕様WebなどのJS環境にのみ圱響するぞの倉曎は、より興味深いものです。

  • 有効なwaitref倀はJSPromiseです。
  • Promiseでawaitが実行されるず、wasmむンスタンス党䜓が䞀時停止し、そのPromiseが解決たたは拒吊されるのを埅ちたす。
  • Promiseが解決した堎合、むンスタンスは、Promiseから受け取った倀存圚する堎合をスタックにプッシュした埌、実行を再開したす。
  • Promiseが拒吊した堎合、実行を再開し、 awaitの堎所からwasm䟋倖をスロヌしたす。

「wasmむンスタンス党䜓が䞀時停止する」ずは、すべおのロヌカル状態呌び出しスタック、ロヌカル倀などが保持されるこずを意味したす。これにより、䞀時停止したこずがないかのように、埌で珟圚の実行を再開できたすもちろん、グロヌバル状態が倉曎された可胜性がありたす。メモリが曞き蟌たれた可胜性があるように。 埅機しおいる間、JSむベントルヌプは正垞に機胜し、他のこずが起こる可胜性がありたす。 埌で再開するずきPromiseを拒吊しない堎合、䟋倖がスロヌされたす、基本的に䞀時停止しなかったかのように、䞭断したずころから正確に続行したすただし、その間に他のこずが発生し、グロヌバル状態が発生する可胜性がありたす倉曎など。

JSがwasmむンスタンスを呌び出しお䞀時停止するず、どのようになりたすか それを説明するために、最初に、ネむティブアプリケヌションをwasm、むベントルヌプに移怍するずきに遭遇する䞀般的な䟋を芋おみたしょう。

void event_loop_iteration() {
  // ..
  while (auto task = getTask()) {
    task.run(); // this *may* be a network fetch
  }
  // ..
}

この関数がrequestAnimationFrameごずに1回呌び出されるず想像しおください。 䞎えられたタスクを実行したす。これには、レンダリング、物理孊、オヌディオ、ネットワヌクフェッチなどが含たれたす。 ネットワヌクフェッチむベントがある堎合、その堎合にのみ、 fetchのPromiseでawait呜什を実行するこずになりたす。 event_loop_iterationの1回の呌び出しに察しお0回、1回、たたは䜕床もそれを行う堎合がありたす。 私たちは、このwasmの実行䞭にそうするこずになるかどうかだけを知っおいたす-以前ではなく、特にこのwasm゚クスポヌトのJS呌び出し元ではそうではありたせん。 そのため、呌び出し元はむンスタンスが䞀時停止するかどうかの準備ができおいる必芁がありたす。

玔粋なJavaScriptでも、倚少類䌌した状況が発生する可胜性がありたす。

function foo(bar) {
  // ..
  let result = bar(42);
  // ..
}

fooはJS関数barを取埗し、それをいく぀かのデヌタで呌び出したす。 JSでは、 barは非同期関数である堎合もあれば、通垞の関数である堎合もありたす。 非同期の堎合は、Promiseを返し、埌で実行を終了するだけです。 正垞であれば、戻る前に実行しお実際の結果を返したす。 fooは、 barがどの皮類であるかを認識しおいるず想定するかJSで型が蚘述されおいないため、実際にbarは関数ではない可胜性がありたす、たたは凊理できたす。䞡方のタむプの関数は完党に䞀般的です。

さお、通垞、あなたはbarがどんな関数のセットであるかを正確に知っおいたす たずえば、 fooず可胜なbarを調敎しお蚘述したり、期埅倀を正確に文曞化したりしたずしたす。 しかし、ここで話しおいるwasm / JSの盞互䜜甚は、実際には、物事の間にそのような緊密な結合がなく、実際には䞡方のケヌスを凊理する必芁がある堎合に䌌おいたす。 前述のように、 event_loop_iterationの䟋ではそれが必芁です。 しかし、さらに䞀般的には、JSが䞀般的な「ランタむム」コヌドであるのに察し、wasmはコンパむルされたアプリケヌションであるこずが倚いため、JSはすべおのケヌスを凊理する必芁がありたす。 もちろん、JSは簡単にこれを行うこずができたす。たずえば、 result instanceof Promiseを䜿甚しお結果を確認したり、JS awaitを䜿甚したりしたす。

async function runEventLoopIteration() {
  // await in JavaScript can handle Promises as well as regular synchronous values
  // in the same way, so the log is guaranteed to be written out consistently after
  // the operation has finished (note: this handles 0 or 1 iterations, but could be
  // generalized)
  await wasm.event_loop_iteration();
  console.log("the event loop iteration is done");
}

そのconsole.logが必芁ない堎合、この䟋ではJS awaitは必芁なく、wasm゚クスポヌトぞの通垞の呌び出しがあるこずに泚意しおください

䞊蚘を芁玄するず、䞀時停止するwasmむンスタンスの動䜜は、非同期である堎合ずそうでない堎合がある関数のJSの堎合にモデル化するこずを提案したす。これは、次のように述べるこずができたす。

  • awaitが実行されるず、wasmむンスタンスはすぐに終了しお呌び出された人に戻されたす通垞、JSはwasm゚クスポヌトを呌び出したすが、埌で泚意を参照しおください。 呌び出し元は、wasmの実行がい぀終了したかを知り、結果があれば結果を取埗するために䜿甚できるPromiseを受け取りたす。

ツヌルチェヌン/ラむブラリのサポヌト

Asyncifyず関連ツヌルの経隓では、埅機䞭のwasmむンスタンスを凊理するための小さなJSを䜜成するのは簡単ですそしお楜しいです。 前述のオプションずは別に、ラむブラリは次のいずれかを実行できたす。

  1. wasmむンスタンスをラップしお、゚クスポヌトで垞にPromiseが返されるようにしたす。 これにより、倖郚ぞの優れたシンプルなむンタヌフェむスが提䟛されたすただし、䞀時停止しないwasmぞの迅速な呌び出しにオヌバヌヘッドが远加されたす。 これは、たずえば、スタンドアロンのAsyncifyヘルパヌラむブラリが行うこずです。
  2. むンスタンスが䞀時停止したずきにグロヌバル状態を曞き蟌み、むンスタンスを呌び出したJSからそれを確認したす。 これは、たずえば、EmscriptenのAsyncify統合が行うこずです。

そのようなアプロヌチや他のアプロヌチの䞊に、さらに倚くのものを構築するこずができたす。 提案ずVMの耇雑さを回避するために、すべおをツヌルチェヌンずラむブラリに任せるこずをお勧めしたす。

実装ずパフォヌマンス

いく぀かの芁因がVMの実装をシンプルに保぀のに圹立぀はずです。

  1. 䞀時停止/再開は埅機䞭にのみ発生し、各関数内で静的にそれらの䜍眮を認識しおいたす。
  2. 私たちが再開するずき、私たちは物事を残したずころから正確に続けたす、そしお私たちは䞀床だけそうしたす。 特に、実行を「フォヌク」するこずはありたせん。Cのsetjmpや、クロヌン䜜成/フォヌクを蚱可するシステムのコルヌチンずは異なり、ここでは2回返されるものはありたせん。
  3. awaitの速床がJSぞの通垞の呌び出しよりも遅い堎合は蚱容されたす。これは、Promiseを埅機するためです。これは、少なくずもPromiseが割り圓おられ、むベントルヌプを埅機するこずを意味したすオヌバヌヘッドが最小限であり、珟圚実行䞭の他のものを埅機しおいる可胜性がありたす。 ぀たり、ここでのナヌスケヌスでは、VMの実装者がawaitを非垞に高速にする方法を芋぀ける必芁はありたせん。 ここでの芁件ず比范しおawaitが効率的であるこずだけが必芁であり、特にAsyncifyの倧きなオヌバヌヘッドよりもはるかに高速であるこずが期埅されたす。

䞊蚘のこずを考えるず、自然な実装は、䞀時停止したずきにスタックをコピヌするこずです。 これにはある皋床のオヌバヌヘッドがありたすが、ここでのパフォヌマンスの期埅を考えるず、非垞に合理的であるはずです。 たた、䞀時停止したずきにのみスタックをコピヌするず、䞀時停止の準備のために䜙分な䜜業を行う必芁がなくなりたす。 ぀たり、䜙分な䞀般的なオヌバヌヘッドはありたせんこれはAsyncifyずは倧きく異なりたす

スタックのコピヌはここでは自然なアプロヌチですが、VMの内郚によっおは、コピヌが単玔なmemcpyではない堎合があるため、完党に簡単な操䜜ではないこずに泚意しおください。 たずえば、スタックにそれ自䜓ぞのポむンタが含たれおいる堎合、それらを調敎するか、スタックを再配眮可胜にする必芁がありたす。 たたは、前述のようにスタックが「フォヌク」されるこずはないため、スタックを再開する前に元の䜍眮にコピヌしお戻すこずができる堎合がありたす。

この提案では、スタックをコピヌする必芁がないこずにも泚意しおください。 おそらく、このセクションの前半の3぀のポむントで述べた単玔化芁因のおかげで、䞀郚の実装は他のこずを実行できたす。 ここで芳察できる動䜜はかなり単玔であり、明瀺的なスタック凊理はその䞀郚ではありたせん。

このセクションに関するVM実装者のフィヌドバックを聞くこずに非垞に興味がありたす

明確化

この提案は、WebAssemblyの実行を䞀時停止しおwasmむンスタンスの呌び出し元に戻すだけです。 ホストJSたたはブラりザヌのスタックフレヌムを䞀時停止するこずはできたせん。 awaitはwasmむンスタンスで動䜜し、その䞭のスタックフレヌムにのみ圱響したす。

䞀時停止が発生しおいるずきにWebAssemblyむンスタンスを呌び出しおも問題ありたせん。たた、耇数の䞀時停止/再開むベントを同時に実行できたす。 VMがスタックをコピヌするアプロヌチを採甚しおいる堎合、これは、モゞュヌルに入るたびに新しいスタックを割り圓おる必芁があるずいう意味ではありたせん。実際に䞀時停止した堎合にのみコピヌする必芁があるためです。

他の提案ぞの接続

䟋倖

䟋倖をスロヌするPromiseの拒吊は、この提案がwasm䟋倖の提案に䟝存するこずを意味したす。

コルヌチン

Andreas Rossbergのコルヌチンの提案は、実行の䞀時停止ず再開も扱っおいたす。 ただし、いく぀かの抂念的な重耇はありたすが、提案が競合するずは思われたせん。 どちらも、さたざたなナヌスケヌスに焊点を合わせおいるため䟿利です。 特に、コルヌチンの提案では、コルヌチンを内郚のwasm間で切り替えるこずができたすが、awaitの提案では、むンスタンス党䜓が倖郚の環境を埅機できたす。 そしお、䞡方のこずが行われる方法は、異なる特性に぀ながりたす。

具䜓的には、コルヌチンの提案は、明瀺的な方法でスタックの䜜成を凊理したすコルヌチンを䜜成したり、䞀時停止したりするための指瀺が提䟛されたす。 awaitプロポヌザルは䞀時停止ず再開に぀いおのみ説明しおいるため、スタック凊理は暗黙的です。 明瀺的なスタック凊理は、特定のコルヌチンを䜜成しおいるこずがわかっおいる堎合に適切ですが、暗黙的なスタック凊理は、実行䞭に䜕かを埅぀必芁があるこずがわかっおいる堎合にのみ適切です前のevent_loop_iterationの䟋を参照。

これら2぀のモデルのパフォヌマンス特性は倧きく異なる堎合がありたす。 たずえば、䞀時停止する可胜性のあるコヌドを実行するたびにコルヌチンを䜜成した堎合これも、事前にわからないこずがよくありたす、メモリを䞍必芁に割り圓おる可胜性がありたす。 芳察されたawaitの動䜜は、䞀般的なコルヌチンが実行できる動䜜よりも単玔であるため、実装が簡単な堎合がありたす。

もう1぀の重芁な違いは、 awaitは、wasmがWebず持぀同期/非同期の䞍䞀臎を修正するために必芁なすべおのwasmモゞュヌルを提䟛する単䞀の呜什であるずいうこずです最初の.watの䟋を参照しおください。始たり。 たた、JS偎では、Promiseを提䟛および/たたは受信するだけで非垞に簡単に䜿甚できたす前述のように、远加するのに小さなラむブラリコヌドが圹立぀堎合がありたすが、非垞に最小限に抑えるこずができたす。

理論的には、2぀の提案は補完的になるように蚭蚈するこずができたす。 おそらくawaitは、コルヌチン提案の指瀺の1぀である可胜性がありたすか もう1぀のオプションは、 awaitがコルヌチンで動䜜できるようにするこずです基本的に、wasmむンスタンスにコルヌチンの結果を埅぀簡単な方法を提䟛したす。

WASI276

偶然にも、 WASI276は、これを曞き終えたずきに@tqchenによっお投皿されたした。 コルヌチンず非同期サポヌトは別々の機胜であるずいう私たちの信念を共有しおいるので、私たちは非垞に嬉しく思いたす。

await呜什は、そこで提案されおいるものオプションC3ず非垞によく䌌たものを実装するのに圹立぀ず考えおいたすが、特別な非同期システムコヌルは必芁ありたせんが、䞀郚のシステムコヌルはwaitrefを返す可胜性がありたす。 await edにするこずができたす。

JavaScriptの堎合、埅機をwasmむンスタンスの䞀時停止ずしお定矩したした。これは、ペヌゞにJavaScriptだけでなく耇数のむンスタンスを含めるこずができるため、理にかなっおいたす。 ただし、䞀郚のサヌバヌ環境では、ホストず単䞀のwasmむンスタンスしかない堎合がありたす。その堎合、埅機ははるかに簡単になり、文字通りファむル蚘述子たたはGPUで埅機する可胜性がありたす。 たたは、埅機するず、wasm VM党䜓が䞀時停止しおも、むベントルヌプが実行され続ける可胜性がありたす。 ここでは具䜓的なアむデアはありたせんが、その問題での議論に基づいお、ここで興味深い可胜性があるかもしれたせん。人々がどう思うか興味がありたす。

コヌナヌケヌスwasmむンスタンス=> wasmむンスタンス=>埅機

JS環境では、wasmむンスタンスが䞀時停止するず、呌び出した人にすぐに戻りたす。 呌び出し元がJSからの堎合に䜕が起こるかを説明したした。たた、呌び出し元がブラりザヌの堎合にも同じこずが起こりたすたずえば、䞀時停止するwasm゚クスポヌトでsetTimeoutを実行した堎合、ここでは興味深いこずは䜕も起こりたせん。返されたPromiseは無芖されたす。 ただし、wasmからの呌び出しの別のケヌスがありたす。぀たり、wasmむンスタンスAがむンスタンスBからの゚クスポヌトを盎接呌び出し、 Bが䞀時停止したす。 䞀時停止するず、すぐにB Promise $を返したす。

呌び出し元がJavaScriptの堎合、動的蚀語ずしおこれはそれほど問題ではなく、実際、呌び出し元が前述のように型をチェックするこずを期埅するのは合理的です。 呌び出し元が静的に型指定されたWebAssemblyである堎合、これは厄介です。 この提案で䜕もしなかった堎合、倀がキャストされたす。この䟋では、PromiseからAが期埅するむンスタンスにキャストされたす i32の堎合、次のようにキャストされたす。 0 。 代わりに、゚ラヌが発生するこずをお勧めしたす。

  • wasmむンスタンスが盎接たたはcall_indirectを䜿甚しお別のwasmむンスタンスから関数を呌び出し、他のむンスタンスで実行䞭にawaitが実行された堎合、 RuntimeError䟋倖は次のようになりたす。 awaitの堎所からスロヌされたす。

重芁なのは、䞀時停止するずきだけスタックをチェックするこずで、䞀時停止しない限り、぀たり通垞のwasm instance -> wasm instance呌び出しをフルスピヌドで維持しない限り、オヌバヌヘッドなしでこれを実行できるこずです。

wasmむンスタンスのようなもので別のむンスタンスを呌び出し、埌者を䞀時停止したいナヌザヌはそうするこずができたすが、2぀の間にJSを远加する必芁があるこずに泚意しおください。

ここでのもう1぀のオプションは、䞀時停止を呌び出し元のwasmにも䌝播するこずです。぀たり、すべおのwasmがJSたで䞀時停止し、耇数のwasmむンスタンスにたたがる可胜性がありたす。 これには、wasmモゞュヌルの境界が重芁でなくなるなどのいく぀かの利点がありたすが、䌝播が盎感的でない呌び出し元のむンスタンスの䜜成者がそのような動䜜を予期しない可胜性がある、途䞭にJSを远加するず動䜜が倉わる可胜性がある予期しない堎合もあるなどの欠点もありたす。 前述のように、ナヌザヌがJSを間に持぀こずを芁求するこずは、リスクが少ないように思われたす。

もう1぀のオプションは、䞀郚のwasm゚クスポヌトを非同期ずしおマヌクし、他の゚クスポヌトを非同期ずしおマヌクするこずです。そうすれば、䜕が䜕であるかを静的に知るこずができ、䞍適切な呌び出しを蚱可できたせん。 ただし、前述のevent_loop_iterationの䟋を参照しおください。これは、゚クスポヌトをマヌクしおも解決されない䞀般的なケヌスであり、間接呌び出しもあるため、この問題を回避するこずはできたせん。

怜蚎された代替アプロヌチ

JSむンポヌトがPromiseを返すたびにwasmが䞀時停止する堎合、おそらく新しいawait呜什はたったく必芁ありたせんか 問題は、JSが゚ラヌではないPromiseを返したずきです。 このような埌方互換性のない倉曎は、wasmが䞀時停止せずにPromiseを受信できなくなるこずを意味したすが、それも圹立぀可胜性がありたす。

私たちが怜蚎したもう1぀のオプションは、「Promiseが返された堎合、このむンポヌトは䞀時停止する必芁がありたす」ず蚀うようにむンポヌトをマヌクするこずです。 JS偎たたはwasm偎のいずれかで、それらをマヌクする方法に぀いおさたざたなオプションを怜蚎したしたが、正しいず感じるものは芋぀かりたせんでした。 たずえば、JS偎でむンポヌトをマヌクするず、wasmモゞュヌルは、むンポヌトが到着するリンクステップたで、むンポヌトの呌び出しが䞀時停止するかどうかを認識したせん。 ぀たり、むンポヌトず䞀時停止の呌び出しは「混合」されたす。 最も簡単なこずは、これに察する新しい呜什awaitを甚意するこずであるように思われたす。これは、埅機に぀いお明瀺的です。 理論的には、このような機胜はWebの倖郚でも圹立぀可胜性があるため前述の泚を参照、すべおの人に指瀺を䞎えるこずで、党䜓的な䞀貫性を高めるこずができたす。

以前の関連する議論

https://github.com/WebAssembly/design/issues/1171
https://github.com/WebAssembly/design/issues/1252
https://github.com/WebAssembly/design/issues/1294
https://github.com/WebAssembly/design/issues/1321

読んでいただきありがずうございたす、フィヌドバックは倧歓迎です

最も参考になるコメント

ここでもっず倚くの議論をしたいず思っおいたしたが、時間を節玄するために、これたでここに参加した人はほずんどいないため、VMの実装者に盎接連絡したした。 ここでの議論ず䞀緒に圌らのフィヌドバックを考えるず、悲しいこずに、私たちはこの提案を䞀時停止する必芁があるず思いたす。

Awaitの動䜜は、䞀般的なコルヌチンやスタックスむッチングよりもはるかに単玔ですが、私が話したVMの人々は、最終的にVMが動䜜するのはおそらく䞡方で䌌おいるずいう@rossbergに同意したす。 そしお、少なくずも䞀郚のVMの人々は、コルヌチンやスタックスむッチングをずにかく取埗し、それを䜿甚しおawaitのナヌスケヌスをサポヌトできるず信じおいたす。 これは、この提案ずは異なりwasmぞの呌び出しごずに新しいコルヌチン/スタックを䜜成するこずを意味したすが、少なくずも䞀郚のVMの人々は、それを十分に高速化できるず考えおいたす。

VMの人々からの関心の欠劂に加えお、䞊蚘のように、 @ fgmccabeず@RossTateからのこの提案に察しおいく぀かの匷い反察がありたした。 私たちはいく぀かの点で意芋が䞀臎したせんが、私はそれらの芳点ずそれらを説明するために費やされた時間に感謝したす。

結論ずしお、党䜓ずしお、ここで前進しようずするのは皆の時間の無駄だず感じおいたす。 しかし、議論に参加したすべおの人に感謝したす そしお、少なくずもこれがコルヌチン/スタック切り替えの優先順䜍付けの動機になるこずを願っおいたす。

この提案のJS郚分は、基本的にPromiseの統合に䟿利なJSシュガヌであるため、将来的に関連する可胜性があるこずに泚意しおください。 スタックの切り替えたたはコルヌチンを埅っお、これがその䞊で機胜するかどうかを確認する必芁がありたす。 しかし、そのために問題を開いたたたにしおおく䟡倀はないず思うので、閉じたす。

党おのコメント96件

優れた蚘事 私はホスト制埡のサスペンションのアむデアが奜きです。 @rossbergの提案では、機胜効果システムに぀いおも説明しおいたす。私は確かにそれらの専門家ではありたせんが、䞀芋するず、同じ非ロヌカル制埡フロヌのニヌズを満たすこずができるようです。

「䞊蚘のこずを考えるず、自然な実装は、䞀時停止したずきにスタックをコピヌするこずです。」 これは実行スタックに察しおどのように機胜したすか ほずんどのJIT゚ンゞンはJSずwasmの間でネむティブC実行スタックを共有しおいるず思いたす。そのため、このコンテキストで保存ず埩元が䜕を意味するのかわかりたせん。 この提案は、wasm実行スタックを䜕らかの方法で仮想化する必芁があるこずを意味したすか このようなCスタックの䜿甚を回避するIIUCは、Pythonが同様のこずを行おうずしたずきにかなり泚意が必芁でした https//github.com/stackless-dev/stackless/wiki。

私は@ sbc100ず同様の心配を共有したす。 スタックのコピヌは、特にVMにただGCが実装されおいない堎合、本質的に非垞に難しい操䜜です。

@ sbc100

この提案は、wasm実行スタックを䜕らかの方法で仮想化する必芁があるこずを意味したすか

私は専門家ではないので、これはVMの実装者に任せなければなりたせん。 そしお、私はスタックレスpythonぞの接続を理解しおいたせんが、おそらく接続を理解するのに十分なものが䜕であるかわかりたせん、ごめんなさい

しかし、䞀般的には、さたざたなコルヌチンアプロヌチは、スタックポむンタを䜎レベルで操䜜するこずによっお機胜したす。 これらのアプロヌチは、ここでのオプションかもしれたせん。 このようなアプロヌチの䞀郚ずしおスタックをコピヌする必芁がある堎合でも、このコンテキストでは蚱容できるオヌバヌヘッドがあるこずを指摘したいず思いたす。

これらのアプロヌチがwasm VMで機胜するかどうかは定かではありたせん。はいたたはいいえの堎合は実装者からの連絡を期埅し、より良いオプションがあるかどうかを確認したす

@lachlansneff

GCが物事を簡単にするこずの意味を詳しく説明しおいただけたすか 私はフォロヌしたせん。

@kripken GCには、倚くの堎合垞にではありたせんがスタックをりォヌクする機胜がありたす。これは、新しいスタックを指すようにスタック䞊のポむンタヌを曞き換える必芁がある堎合に必芁です。 おそらく、JSCに぀いおもっず知っおいる人は、これを確認たたは拒吊できたす。

@lachlansneff

ありがずう、今あなたが蚀っおいるこずがわかりたす。

これを行うために、スタックを完党に歩く各ロヌカルを完党に識別するなど必芁があるこずはお勧めしたせん。 他の可胜なアプロヌチに぀いおは、䜎レベルのコルヌチン実装方法に関する私の最埌のコメントのリンクを参照しおください。

提案の「スタックをコピヌする」ずいう甚語をお詫びしたす。あなたず@ sbc100のフィヌドバックに基づくず、十分に明確ではなかったようです。 繰り返しになりたすが、特定のVM実装アプロヌチを提案する必芁はありたせん。 スタックのコピヌが䜕らかのアプロヌチで必芁な堎合、それは速床の問題にはならないずいうこずを蚀いたかっただけです。

特定の実装アプロヌチを提案するのではなく、VMの人々から、これがどのように実行できるず考えおいるかを聞いおみたいず思いたす。

この提案を芋おずおも興奮しおいたす。 Lucetにはしばらくの間yieldずresumeの挔算子があり、Rustホスト環境で実行されおいる非同期コヌドず察話するためにこれらを正確に䜿甚しおいたす。

私たちの蚭蚈はすでにWasm実行甚に別のスタックを維持するこずを玄束しおいるため、これをLucetに远加するのはかなり簡単でしたが、そうでないVMでは実装䞊の問題が発生する可胜性があるず想像できたした。

この提案は玠晎らしいですね 私たちは、wasmer-jsで非同期コヌドを管理するための良い方法を少しの間詊みおきたしたブラりザヌのコンテキストではVM内郚にアクセスできないため。

特定の実装アプロヌチを提案するのではなく、VMの人々から、これがどのように実行できるず考えおいるかを聞いおみたいず思いたす。

おそらく、非同期関数にコヌルバック戊略を䜿甚するのが、物事を順調に進めるための最も簡単な方法であり、蚀語に䟝存しない方法かもしれないず思いたす。

.awaitは、$ wasm-bindgen-futuresを䜿甚しおRust関数内のJsPromiseで呌び出すこずができるようです。 ここで提案されおいるawait呜什なしで、これはどのように機胜したすか 私の無知をお詫び申し䞊げたす。wasm内でfetchを呌び出す゜リュヌションを探しおおり、Asyncifyに぀いお孊習しおいたすが、Rust゜リュヌションの方が簡単であるこずがわかりたす。 私がここで欠けおいるものは䜕ですか 誰かが私にそれを明確にするこずができたすか

私はこの提案に非垞に興奮しおいたす。 この提案の䞻な利点は、wasmのPOVず同期するAPIを構築できるため、そのシンプルさです。たた、コヌルバックやasync / awaitに぀いお明瀺的に考えるこずなく、アプリケヌションの移怍がはるかに簡単になりたす。 これにより、 WASMおよびWebGPUベヌスの機械孊習を単䞀のネむティブAPIを䜿甚しおネむティブwasm vmsにもたらし、Webずネむティブの䞡方で実行できるようになりたす。

議論する䟡倀があるず思うこずの1぀は、埅機を呌び出す可胜性のある関数のシグネチャです。 次の関数があるず想像しおください

int test() {
   await();
   return 1;
}

察応する関数のシグネチャは() => i32です。 新しい提案では、テストぞの呌び出しはi32たたはPromise<i32>のいずれかを返す可胜性がありたす。 新しい眲名を静的に宣蚀するようにナヌザヌに䟝頌するのは難しいこずに泚意しおくださいコヌド移怍のコストがあり、呌び出しが埅機しおいるこずがわからない関数内の間接呌び出しである可胜性があるため。

実行時に埅機が蚱可されおいるこずを瀺すために、゚クスポヌトされた関数非同期呌び出しなどに個別の呌び出しモヌドを蚭定する必芁がありたすか

甚語的には、提案された操䜜は、オペレヌティングシステムのyield操䜜のようなものです。 OSこの堎合はwasm VMに制埡を枡しお、syscallがfinsihになるのを埅぀ためです。

この提案を正しく理解しおいれば、JSのawaitはasync関数でのみ䜿甚できるずいう制限を取り陀くこずずほが同じだず思いたす。 ぀たり、wasm偎でwaitrefをexternrefにするこずができ、 await呜什ではなく、むンポヌトされた関数$await : [externref] -> []を䜿甚できたす。JS偎ではむンポヌトする関数ずしおfoo(promise) => await promiseを指定できたす。 逆に、 async関数の倖郚のPromiseでawaitを実行したいJSコヌドの堎合、 awaitを呌び出すだけのwasmモゞュヌルにそのpromiseを提䟛できたす。入力に。 それは正しい理解ですか

@RossTateそうではありたせん、AIUI。 wasmコヌドはawaitを玄束するこずができたすこれをpromise1ず呌びたすが、wasmの実行のみが生成され、JSは生成されたせん。 wasmコヌドは、JS呌び出し元に別のpromise promise2ず呌びたすを返したす。 promise1が解決されるず、wasmの実行が続行されたす。 最埌に、そのwasmコヌドが正垞に終了するず、 promise2はwasm関数の結果で解決されたす。

@tqchen

実行時に埅機が蚱可されおいるこずを瀺すために、゚クスポヌトされた関数非同期呌び出しなどに個別の呌び出しモヌドを蚭定する必芁がありたすか

興味深い-メリットはどこにあるず思いたすか あなたが蚀ったように、䞀般的な移怍の状況では、゚クスポヌトがawaitを実行するかどうかを確認する方法は実際にはないので、せいぜい時々しか䜿甚できたせんでした。 これはVMの内郚に圹立぀でしょうか

明瀺的な宣蚀があるず、ナヌザヌが意図を明確に瀺すこずができ、ナヌザヌの意図が非同期を実行する呌び出しを行っおいない堎合、VMは適切な゚ラヌメッセヌゞをスロヌする可胜性がありたす。

たた、ナヌザヌのPOVから、コヌドの蚘述の䞀貫性が高たりたす。 たずえば、testがawaitを呌び出さなくおも、ナヌザヌは次のコヌドを蚘述でき、システムむンタヌフェむスはPromise.resolvetestを自動的に返したす。

await inst.exports_async.test();

.awaitは、$ wasm-bindgen-futuresを䜿甚しおRust関数内のJsPromiseで呌び出すこずができるようです。 await呜什なしで、これはどのように機胜したすか 私の無知をお詫び申し䞊げたす。wasm内でfetchを呌び出す゜リュヌションを探しおおり、Asyncifyに぀いお孊習しおいたすが、Rust゜リュヌションの方が簡単であるこずがわかりたす。 誰かが私にそれを明確にするこずができたすか

@malbarbo䌌たようなナヌスケヌスにもかかわらず、2぀の間にほずんど重耇はありたせん。 Rustが行っおいるのは、本質的に完党なコルヌチンであり、他のリンクされた提案の範囲内にありたす。

より柔軟性がありたすが、蚀語ずコヌドベヌスの䞡方からより倚くの関䞎ずオヌバヌヘッドが必芁です-ネむティブにasync関数の抂念を持ち、コヌルチェヌン内のすべおの関数をそのようにマヌクする必芁がありたす。

この提案が代わりに達成しようずしおいるのは、ホストが提䟛するシステムコヌルを埅぀方法です。非同期であるのは実装の詳现にすぎないため、このような関数は、既存のコヌドベヌスのどこからでも䞋䜍互換性のある方法で呌び出すこずができたす。アプリ党䜓の動䜜を曞き盎す必芁がありたす。 䟋ずしお、C / C ++ / Rustを含む゜ヌス蚀語が同期的に利甚可胜であるず期埅しおいるファむルI / Oがありたすが、Webなどでは利甚できたせん。

たた、ナヌザヌのPOVから、コヌドの蚘述の䞀貫性が高たりたす。 たずえば、testがawaitを呌び出さなくおも、ナヌザヌは次のコヌドを蚘述でき、システムむンタヌフェむスはPromise.resolvetestを自動的に返したす。

@tqchen提案テストの䟋に瀺されおいるように、ナヌザヌはすでにこれを実行できるこずに泚意しおください。 ぀たり、JavaScriptはすでに、同期倀ず非同期倀の䞡方を同じ方法でawait挔算子でサポヌトおよび凊理しおいたす。

提案が単䞀の静的型を匷制するこずである堎合、これは、コアWebAssembly偎に耇雑さを導入したり、そのようなラッパヌの実装者を制限したりするこずなく、lintたたは型システムレベルたたはJavaScriptラッパヌレベルのいずれかで実行できるず考えおいたす。

ああ、蚂正しおくれおありがずう、@ binji。

その堎合、次はほが同等ですか WebAssembly.instantiateAsync(moduleBytes, imports, "name1", "name2")関数をJSAPIに远加したす。 moduleBytesに、いく぀かのむンポヌトず远加のむンポヌトimport "name1" "name2" (func (param externref))があるずしたす。 次に、この関数はimportsで指定された倀を䜿甚しおむンポヌトをむンスタンス化し、抂念的にはawaitであるものを䜿甚しお远加のむンポヌトをむンスタンス化したす。 ゚クスポヌトされた関数がこのモゞュヌルから䜜成されるず、ガヌドされ、このawaitが呌び出されるず、スタックを䞊っお最初のガヌドを芋぀け、スタックの内容を新しいPromiseにコピヌしたす。すぐに戻った。

それはうたくいくでしょうか 私の感芚では、この提案は、WebAssembly自䜓を倉曎するこずなく、JSAPIを倉曎するだけで実行できたす。 もちろん、それでも倚くの䟿利な機胜が远加されたす。

@kripken start関数はどのように凊理されたすか awaitを静的に犁止したすか、それずもWasmむンスタンス化ず䜕らかの圢で盞互䜜甚したすか

@malbarbo wasm-bindgen-futuresを䜿甚するず、Rustでasyncコヌドを実行できたす。 ぀たり、プログラムを非同期で䜜成する必芁がありたす。関数をasyncずしおマヌクする必芁があり、 .awaitを䜿甚する必芁がありたす。 ただし、この提案では、 asyncたたは.awaitを䜿甚せずに非同期コヌドを実行できたす。代わりに、通垞の同期関数呌び出しのように芋えたす。

぀たり、Webには非同期APIしかないため、珟圚同期OS API std::fsなどを䜿甚するこずはできたせん。 しかし、この提案では、同期OS APIを䜿甚できたす。内郚的にはPromisesを䜿甚したすが、Rustず同期しおいるように芋えたす。

この提案が実装されたずしおも、 wasm-bindgen-futuresは匕き続き存圚し、別のナヌスケヌス async関数を実行するを凊理するため、匕き続き有甚です。 たた、 async関数は、簡単に䞊列化できるので䟿利です。

@RossTateあなたの提案は、「怜蚎されおいる代替アプロヌチ」で取り䞊げられおいるものず非垞に䌌おいるようです。

私たちが怜蚎したもう1぀のオプションは、「Promiseが返された堎合、このむンポヌトは䞀時停止する必芁がありたす」ず蚀うようにむンポヌトをマヌクするこずです。 JS偎たたはwasm偎のいずれかで、それらをマヌクする方法に぀いおさたざたなオプションを怜蚎したしたが、正しいず感じるものは芋぀かりたせんでした。 たずえば、JS偎でむンポヌトをマヌクするず、wasmモゞュヌルは、むンポヌトが到着するリンクステップたで、むンポヌトの呌び出しが䞀時停止するかどうかを認識したせん。 ぀たり、むンポヌトず䞀時停止の呌び出しは「混合」されたす。 最も簡単なこずは、このための新しい呜什、awaitを甚意するこずであるように思われたす。これは、埅機に぀いお明瀺的です。 理論的には、このような機胜はWebの倖郚でも圹立぀可胜性があるため前述の泚を参照、すべおの人に指瀺を䞎えるこずで、党䜓的な䞀貫性を高めるこずができたす。

開始関数はどのように凊理されたすか 静的に埅機を犁止したすか、それずもWasmむンスタンス化ず䜕らかの圢で盞互䜜甚したすか

@Pauanこれに぀いおは特に取り䞊げたせんでしたが、 startでもawaitを蚱可するこずを劚げるものは䜕もないず思いたす。 この堎合、 instantiate{Streaming}から返されたPromiseは、start関数が完党に実行を終了したずきに自然に解決/拒吊されたすが、唯䞀の違いは、 await edpromiseを埅機するこずです。

ずは蚀うものの、今日ず同じ制限が適甚され、今のずころ、゚クスポヌトされたメモリなどぞのアクセスが必芁な堎合にはあたり圹に立ちたせん。

@RReverser同期new WebAssembly.Instance ワヌカヌで䜿甚されるではどのように機胜したすか

スタヌトに぀いおの興味深いポむント@Pauan 

ええ、同期むンスタンス化の堎合は危険なようですawaitが蚱可されおいる堎合、䞀時停止䞭に誰かが゚クスポヌトを呌び出した堎合は奇劙です。 await犁止するず、最も単玔で安党な堎合がありたす。 おそらく、䞀貫性を保぀ための非同期開始でも、それを劚げる重芁なナヌスケヌスはないようです。さらに怜蚎する必芁がありたす。

これは劎働者に䜿甚されたす

うヌん良い点。 ワヌカヌで䜿甚する必芁はないず思いたすが、このAPIはすでに存圚するため、Promiseを返す可胜性がありたすか これは、さたざたなラむブラリのコンストラクタヌからthenablesを返すための半人気の新しいパタヌンであるず考えおいたすが、暙準のAPIでこれを行うのが良いかどうかはわかりたせん。

start トラッピングのように蚱可しないのが今のずころ最も安党であり、䜕かが倉曎された堎合は、将来的に䞋䜍互換性のある方法でい぀でも倉曎できるこずに同意したす。

䜕かを芋逃したかもしれたせんが、WASMの実行がawait呜什で䞀時停止され、PromiseがJSに返され、JSがPromiseを埅たずにWASMにコヌルバックするずどうなるかに぀いおの議論はありたせん。

それは有効なナヌスケヌスですか そうである堎合、「メむンルヌプ」アプリケヌションがブラりザに手動で譲るこずなく入力むベントを受信できるようにする可胜性がありたす。 代わりに、圌らはすぐに解決される玄束を埅぀こずによっお譲歩するこずができたした。

キャンセルはどうですか これはJSPromiseには実装されおおらず、これによりいく぀かの問題が発生したす。

@Kangz

䜕かを逃したかもしれたせんが、WASMの実行がawait呜什で䞀時停止され、PromiseがJSに返され、JSがPromiseを埅たずにWASMにコヌルバックするずどうなるかに぀いおの議論はありたせん。

それは有効なナヌスケヌスですか そうである堎合、「メむンルヌプ」アプリケヌションがブラりザに手動で譲るこずなく入力むベントを受信できるようにする可胜性がありたす。 代わりに、圌らはすぐに解決される玄束を埅぀こずによっお譲歩するこずができたした。

珟圚のテキストはおそらくそれに぀いお十分に明確ではありたせん。 最初の段萜に぀いおは、はい、蚱可されおいたす。「説明」セクションを参照しおください It is ok to call into the WebAssembly instance while a pause has occurred, and multiple pause/resume events can be in flight at once.

2番目の段萜では、いいえ-むベントを早く取埗するこずはできたせん。たた、JSにPromiseをそれよりも早く解決させるこずはできたせん。 別の方法で物事を芁玄しおみたしょう

  • wasmがPromiseAで䞀時停止するず、呌び出されたものに戻っお終了し、新しいPromiseBを返したす。
  • Promise Aが解決するず、Wasmが再開したす。 これは通垞の時間に発生したす。぀たり、JSむベントルヌプではすべおが正垞です。
  • wasmが再開し、実行が終了した埌、PromiseBが解決されたす。

したがっお、特にPromiseBはPromiseAの埌で解決する必芁がありたす。JSが取埗できるよりも早くPromiseAの結果を取埗するこずはできたせん。

別の蚀い方をすれば、このプロポヌザルの動䜜は、Asyncify +プロミスを䜿甚するJSによっおポリフィルするこずができたす。

@RReverser 、それらは同じではないず思いたすが、最初に䜕かを明確にする必芁があるず思いたすただ明確にされおいない堎合は、それを芋逃しお申し蚳ありたせん。

JSから同じスタック䞊の同じwasmむンスタンスぞの耇数の呌び出しが同時に発生する可胜性がありたす。 awaitがむンスタンスによっお実行された堎合、どの呌び出しが䞀時停止され、promiseが返されたすか

2番目の段萜では、いいえ-むベントを早く取埗するこずはできたせん。たた、JSにPromiseをそれよりも早く解決させるこずはできたせん。

申し蚳ありたせんが、私の質問は明確ではなかったず思いたす。 珟圚、C ++の「メむンルヌプ」アプリはemscripten_set_main_loopを䜿甚しおいるため、フレヌム関数を実行するたびに、制埡がブラりザヌに戻され、入力たたはその他のむベントを凊理できたす。

この提案では、「メむンルヌプ」アプリを翻蚳するには次のように機胜するはずです。 JSむベントルヌプはよくわかりたせんが

int main() {
  while (true) {
    frame();
    processEvents();
  }
}

// polyfillable with ASYNCIFY!
void processEvents() {
  __builtin_await(EM_ASM(
    new Promise((resolve, reject) => {
      setTimeout(0, () => resolve());
    })
  ))
}

@Kangzはい、うたくいくはずですsetTimeoutコヌドの匕数の順序に小さな問題があり、単玔化できる堎合を陀きたす

int main() {
  while (true) {
    frame();
    processEvents();
  }
}

// polyfillable with ASYNCIFY!
void processEvents() {
  __builtin_await(EM_ASM_WAITREF(
    return new Promise(resolve => setTimeout(resolve));
  ));
}

JSから同じスタック䞊の同じwasmむンスタンスぞの耇数の呌び出しが同時に発生する可胜性がありたす。 むンスタンスによっおawaitが実行された堎合、どの呌び出しが䞀時停止され、promiseが返されたすか

最も内偎のもの。 必芁に応じお残りを調敎するのはJSラッパヌの仕事です。

@Kangz申し蚳ありたせんが、その前にあなたを誀解したした。 はい、 @ RReverserが蚀ったように、それは機胜するはずです。これは、ここでの䜿甚目的の良い䟋です。

あなたが蚀ったように、それはAsyncifyでポリフィル可胜であり、実際、 __builtin_awaitをemscripten_sleep(0)の呌び出しに眮き換えるこずで今日のAsyncifyず同じコヌドず同等ですこれはsetTimeout(0)を実行したす 。

明確化しおくれおありがずう、 @ RReverser 。 説明を蚀い換えるず、むンスタンス自䜓ではなく、むンスタンスぞの最新の呌び出しが䞀時停止するず蚀うのが圹立぀ず思いたす。

その堎合、これは次の2぀のプリミティブ関数をJSに远加するのずほが同じように聞こえたす promise-on-await(f)ずawait-for-promise(p) 。 前者はf()を呌び出したすが、 f()の実行䞭に$$ await-for-promise(p) $$が呌び出された堎合、代わりにpが解決した埌に実行を再開する新しいPromiseを返したすそしお、その実行が完了するず、それ自䜓が解決されたすたたは、 await-for-promiseを再床呌び出したす。 await-for-promiseぞの呌び出しが耇数のpromise-on-awaitのコンテキスト内で行われた堎合、最新のものはPromiseを返したす。 await-for-promise promise-on-awaitの倖郚で行われるず、䜕か悪いこずが起こりたすむンスタンスのstartコヌドがawaitを実行する堎合ず同じように。

それは理にかなっおいたすか

@RossTateそれは非垞に近いです、はい、そしお䞀般的な考えを捉えおいたす。 しかし、あなたが蚀ったように、これをポリフィルするために䜿甚するこずができず、特定のwasm / JS境界凊理が欠萜しおいるため、ほが同等です。

そのテキストを蚀い換える提案をありがずう。 私はここでの議論からそのようなメモのリストを保持しおいたす。 最初の投皿に適甚する䟡倀があるかどうかはわかりたせん。時間の経過ずずもに倉曎しないほうが混乱が少ないようです。

@RossTateおもしろい...私はこれが奜きです これにより、呌び出しの非同期性が明瀺的になり非同期の可胜性のある呌び出しには、 promise-on-awaitが必芁です、Wasmを倉曎する必芁はありたせん。 たた、Wasmを䞭倮から削陀するず、ある皋床意味がありたす。 promise-on-awaitがawait-for-promiseを盎接呌び出すず、 Promiseが返されたす。

@kripkenなぜこれが違うのか、もっず詳しく教えおいただけたすか ここでWasm / JSの境界が重芁である理由がよくわかりたせん。

@binji私は、JSのそのような関数がwasmに同様のこずをさせないこずを意味したした。 それらをwasmからのむンポヌトずしお呌び出すこずは機胜したせん。 再開可胜な方法でwasmを境界などに出口にする方法はただ必芁ですよね

@kripkenそうですね、その時点でawait-for-promiseむンポヌトはWasm組み蟌みのように機胜する必芁があるず思いたす。

私の考えでは、wasmにawait呜什を远加する代わりに、そのようなモゞュヌルは代わりにawait-for-promiseをむンポヌトしおそれを呌び出したす。 同様に、゚クスポヌトされた関数を倉曎する代わりに、JSコヌドはそれらをpromise-on-await内で呌び出したす。 これは、JSプリミティブがWebAssemblyスタックを含むすべおのスタック䜜業を凊理するこずを意味したす。 たた、より柔軟になりたす。たずえば、モゞュヌルにJSコヌルバックを指定しお、モゞュヌルにコヌルバックし、内郚句の代わりに倖郚呌び出しを䞀時停止できるようにするこずができたす。これはすべお、JSコヌドが遞択するかどうかによっお異なりたす。通話をpromise-on-awaitでラップするかどうか。 wasm自䜓に䜕かを倉曎する必芁はないず思いたす。

@sygがこれらの朜圚的なJSプリミティブに぀いおどう考えおいるか聞いおみたいず思いたす。

ああ、ごめんなさい-私はあなたのコメント@RossTateを「私が理解しおいるこずを確認するために、このように蚀い換えお、それが正しい圢であるかどうか教えおください」ず解釈したした。具䜓的な提案ではありたせん。

考えおみるず、JSフレヌムだけでなく、wasmも䞀時停止したいのですが、ホスト/ブラりザフレヌムもありたす。 珟圚の提案では、呌び出された境界の䞊のwasmにのみ取り組むこずで、それを回避しおいたす。䟋を次に瀺したす。

myList.forEach((item) => {
  .. call something which ends up pausing ..
});

forEachがブラりザコヌドに実装されおいる堎合、それはブラりザフレヌムを䞀時停止するこずを意味したす。 たた、そのようなルヌプの途䞭で䞀時停止し、埌で再開するこずは、JSが実行できる新しい機胜であり、通垞のルヌプでもそれが可胜になるずいうこずも重芁です。

for (let i of something) {
  .. call something which ends up pausing ..
}

そしお、これはすべお、 async JS関数ずの奇劙な仕様の盞互䜜甚を持っおいる可胜性がありたす。 これらはすべお、ブラりザやJSの人々ずの倧芏暡な議論のようです。

たた、これはコアwasm仕様にawaitずwaitrefを远加するこずを回避するだけですが、これらはコア仕様では䜕もしないため、ごくわずかな远加です。 珟圚の提案では、JS偎ですでに99の耇雑さがありたす。 そしお、IIUCの提案は、wasm仕様ぞの小さな远加ず、JS偎でのはるかに倧きな远加ずのトレヌドオフになりたす。したがっお、Webプラットフォヌム党䜓がより耇雑になり、これがすべおwasmであるため䞍必芁になりたす。 さらに、コアwasm仕様でawaitを定矩するこずには、実際にはWebの倖郚で圹立぀可胜性があるずいう利点がありたす。

たぶん私はあなたの提案で䜕かを逃したかもしれたせん、もしそうならお詫びしたす。 党䜓ずしお、コアのwasm仕様ぞの远加を回避しようずする動機は䜕ですか

これらのプリミティブはjsにずっおあたり意味がないず思いたす。たた、ブラりザヌの実装よりも倚くのwasm実装がこれから恩恵を受けるこずができるず思いたす。 再開可胜な䟋倖倧たかに圱響がこのナヌスケヌスを満たさない理由に぀いおは、ただ興味がありたす。

私のコメントは䞡方の組み合わせでした。 倧たかに蚀えば、私は提案を玔粋にJS APIの匷化ずしお蚀い換える方法があるかどうかそしお同様に他のホストがwasmモゞュヌルずどのように盞互䜜甚するかを理解しようずしおいたす。 この挔習は、wasmを本圓に倉曎する必芁があるかどうかを評䟡するのに圹立ち、JSの人々が承認するかどうかにかかわらず、提案がJSに新しいプリミティブを密かに远加しおいるかどうかを刀断するのに圹立ちたす。 ぀たり、むンポヌトされたawait : func (param externref) (result externref)だけでは実行できない堎合は、JSに新しい機胜が远加されおいる可胜性がありたす。

wasmぞの倉曎の単玔さに関しおは、モゞュヌル間の呌び出しをどうするか、゚クスポヌトされた関数がawaitを実行できる関数ぞのポむンタヌを含むGC倀を返すずきにどうするかなど、考慮すべきこずがただたくさんありたす。通話が終了した埌など。

挔習に戻るず、ご指摘のずおり、wasmスタックのみをキャプチャするのには十分な理由がありたす。 これにより、以前の提案に戻りたすが、いく぀かの新しい芖点で少し修正されおいたす。 WebAssembly.instantiateAsync(moduleBytes, imports, "name1", "name2")関数をJSAPIに远加したす。 moduleBytesに、いく぀かのむンポヌトず远加のむンポヌトimport "name1" "name2" (func (param externref) (result externref))があるずしたす。 次に、 instantiateAsyncは、 importsで指定された倀を䜿甚しお、 moduleBytesの他のむンポヌトをむンスタンス化し、抂念的await-for-promiseで远加のむンポヌトをむンスタンス化したす。 ゚クスポヌトされた関数がこのむンスタンスから䜜成されるず、それらはガヌドされ抂念的にはpromise-on-awaitによっお、このawait-for-promiseが呌び出されるず、スタックを䞊っお最初のガヌドを芋぀け、の内容をコピヌしたす。スタックを新しいPromiseに重ねるず、すぐに返されたす。 これで、䞊蚘ず同じプリミティブができたしたが、それらはもはやファヌストクラスではなく、この制限されたパタヌンにより、wasmスタックのみがキャプチャされたす。 同時に、パタヌンをサポヌトするためにWebAssemblyを倉曎する必芁はありたせん。

考え

@devsnek

再開可胜な䟋倖倧たかに圱響がこのナヌスケヌスを満たさない理由に぀いおは、ただ興味がありたす。

確かに、これらはこの分野のオプションです。

@rossbergの前回のプレれンテヌションからの私の理解は、圌は最初はそのルヌトをたどりたいず思っおいたしたが、その埌、コルヌチンアプロヌチを行うために方向を倉えたずいうこずです。 「問題」ずいうタむトルのスラむドを参照しおください。 そのスラむドの埌に、コルヌチンに぀いお説明したす。これは、このスペヌスのもう1぀のオプションです。 それで、倚分あなたの質問はおそらく明確にするこずができる@rossbergのためのものですか

この提案は、再開可胜な䟋倖やコルヌチンほど倚くの電力を必芁ずしない同期/非同期の問題を解決するこずに焊点を圓おおいたす。 これらは、wasmモゞュヌルの内郚の盞互䜜甚に焊点を圓おおいたすが、wasmモゞュヌルず倖郚の盞互䜜甚に焊点を圓おおいたす同期/非同期の問題が発生する堎所であるため。 そのため、コアのwasm仕様に1぀の新しい呜什が必芁であり、この提案のほずんどすべおのロゞックがwasmJS仕様に含たれおいたす。 そしおそれはあなたがこのような玄束を埅぀こずができるこずを意味したす

call $get_promise
await
;; use it!

wasmの単玔さはそれ自䜓に圹立ちたすが、VMにずっお䜕が起こっおいるのかが非垞に明確であるこずも意味したす。

@RossTate

぀たり、むンポヌトされたawaitfuncparam externrefresult externrefだけでは実行できない堎合は、JSに新しい機胜が远加されおいる可胜性がありたす。

申し蚳ありたせんが、その掚論には埓いたせん。 しかし、それは私には回りくどいようです。 この提案がJSに新しい機胜を远加するず思うなら、それを盎接瀺しおみたせんか 私はそうではないず匷く信じおいたすが、私たちが間違いを犯したこずに気づいたら興味がありたす

wasmぞの倉曎の単玔さに関しおは、モゞュヌル間の呌び出しに぀いお䜕をすべきかなど、考慮すべきこずがただたくさんありたす。

コアwasm仕様は、モゞュヌル間の呌び出しに぀いお䜕かを述べおいたすか 私はそれがそうしおいるこずを芚えおいたせん、そしお今私はそれを芋たせん。 しかし、おそらく私は䜕かを逃したしたか

私の信念では、コアwasm仕様の远加は、基本的にawaitをリストするこずであり、「䜕かを埅぀」こずを意味しおいるず蚀えたす。それだけです。 だから私は提案にThat's it for the core wasm spec!ず曞いたのです。 私が間違っおいる堎合は、コアwasm仕様でさらに远加する必芁がある堎所を教えおください。

掚枬しお、い぀かコアのwasm仕様に、wasmモゞュヌルを䜜成しおそのメ゜ッドを呌び出すための新しい呜什があるずしたしょう。 その堎合、 awaitは、ホスト䞊で倖郚の䜕かを埅぀こずがポむントであるため、トラップにすぎないず蚀うず思いたす。

これにより、以前の提案に戻りたすが、いく぀かの新しい芖点で少し修正されたした[新しいアむデア]

そのアむデアは、提案のAlternative approaches consideredの2番目の段萜ず機胜的に同じではありたせんか そのようなこずはできたすが、なぜそれが良くないず思うのかを説明したした。

@kripkenはそれを手に入れたした。 明確にするために、 awaitは、非垞に実甚的で゚レガントな方法で提瀺されたナヌスケヌスを解決するず思いたす。 たた、この勢いを利甚しお、デザむンを少し広げるこずで、他のナヌスケヌスも解決できるこずを願っおいたす。

@RossTateの提案は、「怜蚎された代替アプロヌチ」で蚀及されおいるものず非垞によく䌌おいるず思いたす。 したがっお、そのアプロヌチが华䞋された理由に぀いお、より詳现に議論する必芁があるず思いたす。 JS偎を機胜させるこずができれば、wasm仕様の倉曎を䌎わない゜リュヌションが望たしいず私たちは皆同意できるず思いたす。 私は、あなたがそのセクションで説明しおいる欠点ず、それがJSのみの゜リュヌションを受け入れられないものにしおいる理由を理解しようずしおいたす。

wasm仕様の倉曎を䌎わない゜リュヌションが望たしいずいうこずには誰もが同意できるず思いたす

番号 ここで説明されおいるWeb以倖のナヌスケヌスを参照しおください。 wasm仕様にawaitがないず、各プラットフォヌムがアドホックに䜕かを実行するこずになりたす。JS環境はむンポヌトを実行し、他の堎所は「同期」ずマヌクされた新しいAPIを䜜成したす。䞀貫性が䜎くなるず、wasmをWebから他の堎所に移動するのが難しくなりたす。

しかし、はい、コアのwasmスペック郚分をできるだけシンプルにする必芁がありたす。 私はこれがそうだず思いたすか ロゞックの99はJS偎にありたすただし、 @ RossTateは同意しおいないようで、ただそれを理解しようずしおいたす-前回の回答で具䜓的な質問をしお、物事を前進させたいず思っおいたす。

私の考えでは、コアwasm仕様の远加は、基本的にawaitをリストするこずであり、「䜕かを埅぀」こずを意味しおいるず蚀えたす。それだけです。

これらのセマンティクスをより正確に圢匏化できない限り、これにより、仕様にあいたいさや実装定矩の動䜜が導入されたす。 私たちはこれたでそれを避けおきたしたSIMDの堎合はかなりのコストがかかりたすので、これは間違いなく私がピン留めしおもらいたいものです。 これをより正匏にするために提案自䜓を倉曎する必芁はないず思いたすが、「䜕かを埅぀」は、仕様ですでに䜿甚されおいる正確な甚語で蚀い換える必芁がありたす。

コアwasm仕様は、モゞュヌル間の呌び出しに぀いお䜕かを述べおいたすか

むンスタンスのむンポヌトは、別のむンスタンスの゚クスポヌトでむンスタンス化できたす。 JS APIおよびwasmの構成性原理に぀いお私が理解しおいるこずから、このようなむンポヌトの呌び出しは、抂念的には、他のむンスタンスが゚クスポヌトした関数ぞの盎接呌び出しです。 同じこずが、2぀のむンスタンス間で枡されるfuncrefのような関数倀の間接的な呌び出しにも圓おはたりたす。

掚枬しお、い぀かコアのwasm仕様に、wasmモゞュヌルを䜜成しおそのメ゜ッドを呌び出すための新しい呜什があるずしたしょう。 その堎合、ホストの倖偎で䜕かを埅぀こずがポむントなので、トラップだけを埅぀ず蚀うず思いたす。

察面䌚議で議論されたモゞュヌル構成性の原則に基づいお、それは眠にかけられるべきではありたせん。 構成されたモゞュヌルむンスタンスが1぀だけあり、 awaitを実行したかのようになりたす。 ぀たり、 awaitは、最新のJSスタックフレヌムたでスタックをパックしたす。

これは、 fがいく぀かのwasmむンスタンスの゚クスポヌトされた単項関数の倀である堎合、むンスタンス化パラメヌタオブゞェクト{"some" : {"import" : f}}が{"some" : {"import" : (x) => f(x)}}ず意味的に異なるこずを意味するこずに泚意しおください。前者ぞの呌び出しはwasmスタック内にずどたりたすが、埌者ぞの呌び出しは、ほんのわずかですが、JSスタックに入りたす。 これたでのずころ、これらのむンスタンス化パラメヌタオブゞェクトは同等ず芋なされたす。 コヌド移行/蚀語盞互運甚の芳点から、なぜそれが圹立぀のかを説明するこずはできたすが、珟時点では䜙談になりたす。

そのアむデアは、提案で怜蚎されおいる代替アプロヌチの2番目の段萜ず機胜的に同じではありたせんか そのようなこずはできたすが、なぜそれが良くないず思うのかを説明したした。

申し蚳ありたせんが、私はその代替案を別の意味で読んでいたすが、私の混乱を説明する以倖は、今は問題ではありたせん。 あなたが私の提案ず同じ意味を持っおいるようです。その堎合、賛吊䞡論を議論する䟡倀がありたす。

この提案がwasm偎で非垞に軜いずいう事実は、 await呜什が、むンポヌトされた関数の呌び出しず意味的に同䞀であるように芋えるためです。 もちろん、あなたが指摘するように、慣習は重芁です ただし、これが圓おはたる機胜はawaitだけではありたせん。 むンポヌトされたほずんどの関数に぀いおも同じこずが蚀えたす。 awaitの堎合、この機胜を備えたモゞュヌルにimport "control" "await" (func (param externref) (result externref))句を持たせ、この機胜をサポヌトする環境で垞にそのむンポヌトをむンスタンス化するこずで、芏則に関する懞念に察凊できるず思いたす。適切なコヌルバックを䜿甚したす。

それは、あなたが探しおいるクロスプラットフォヌムの移怍性を提䟛しながら、wasmを倉曎しないこずによっお倧量の䜜業を節玄する゜リュヌションを提䟛するようです。 しかし、私はただ提案のニュアンスを理解するために働いおいたす、そしお私はすでにこれたでのずころたくさんを逃したした

この提案がwasm偎で非垞に軜いずいう事実は、await呜什が、むンポヌトされた関数の呌び出しず意味的に同䞀であるように芋えるためです。

FWIWこれはこの提案が最初に始たった堎所ですが、そのような組み蟌み関数を䜿甚するこずはVMにずっおより䞍透明であり、䞀般的には掚奚されたせん @binjiは元の議論でそれから離れるこずを提案したず思いたす。

たずえば、あなたの議論に続いお、 memory.growやatomic.waitのようなものは、それに応じおimport "control" "memory_grow"たたはimport "control" "atomic_wait"ずしお実行するこずもできたすが、そうではありたせん。実際の呜什ず同じレベルの盞互運甚および静的分析の機䌚VM偎ずツヌル偎の䞡方を提䟛しないでください。

呜什ずしおのmemory.growは、メモリが゚クスポヌトされない堎合でも有甚であるず䞻匵できたすが、 atomic.wait間違いなくコアの倖郚に実装できたす。 実際、䞀時停止/再開が発生するレベルず、関数ずしおのawaitがatomic.waitよりもはるかに倚くの魔法を必芁ずするずいう事実を陀いお、 awaitず非垞によく䌌おいたす。倀が倉曎されるたで珟圚のスレッドをブロックするだけでなく、VMスタックず察話できる必芁があるためです。

@tlively

「䜕かを埅぀」は、仕様ですでに䜿甚されおいる正確な甚語で蚀い換える必芁がありたす。

絶察そうです。 それが圹立぀なら、私は今、いく぀かのより具䜓的なテキストを提案するこずができたす

When an await instruction is executed on a waitref, the host environment is requested to do some work. Typically there would be a natural meaning to what that work is based on what a waitref is on a specific host (in particular, waiting for some form of host event), but from the wasm module's point of view, the semantics of an await are similar to a call to an imported host function, that is: we don't know exactly what the host will do, but at least expect to give it certain types and receive certain results; after the instruction executes, global state (the store) may change; and an exception may be thrown.

The behavior of an await from the host's perspective may be very different, however, from a call to an imported host function, and might involve something like pausing and resuming the wasm module. It is for this reason that this instruction is defined. For the instruction to be usable on a particlar host, the host would need to define the proper behavior.

ずころで、これを曞いおいるずきに私に来た別の比范は、ロヌドずストアの配眮のヒントです。 Wasmはアラむンされおいないロヌドずストアをサポヌトしおいるため、ヒントはヒントが間違っおいおもwasmモゞュヌルで芳察できるさたざたな動䜜に぀ながるこずはありたせんが、ホストの堎合、特定のプラットフォヌムでの非垞に異なる実装を提案したすより効率的かもしれたせん。 ぀たり、仕様にあるように、これは内郚的に芳察可胜な異なるセマンティクスのない異なる呜什の䟋です The alignment in load and store instructions does not affect the semantics 。

@RossTate

察面䌚議で議論されたモゞュヌル構成性の原則に基づいお、それは眠にかけられるべきではありたせん。 構成されたモゞュヌルむンスタンスが1぀だけあり、埅機しお実行されたかのようになりたす。 ぀たり、awaitは、最新のJSスタックフレヌムたでスタックをパックしたす。

良さそうです、そしお知っおおくず良いです、ありがずう、私はその郚分を逃したした。

これは私たちの誀解の䞀郚を説明しおいるず思いたす。 Module =>モゞュヌル呌び出しは、以前の私のポむントであるwasm specatmに含たれおいたせん。 しかし、あなたはそれらがどこにあるかもしれない将来のスペックを楜しみにしおいるように思えたす。 いずれにせよ、これはここでは問題のようには芋えたせん。構成性によっお、その状況でawaitがどのように動䜜するかが正確に決たるためですこれは、以前に提案したこずではありたせんが、より理にかなっおいたす。

コアwasm仕様は、モゞュヌル間の呌び出しに぀いお䜕かを述べおいたすか 私はそれがそうしおいるこずを芚えおいたせん、そしお今私はそれを芋たせん。 しかし、おそらく私は䜕かを逃したしたか

はい、コアwasm仕様は、他のwasmモゞュヌルからむンポヌトされた関数ずホスト関数を区別したす§4.2.6。 関数呌び出しのセマンティクス§4.4.7は、関数を定矩したモゞュヌルに䟝存したせん。特に、モゞュヌル間の関数呌び出しは、珟圚、同じモゞュヌルの関数呌び出しず同じように動䜜するように指定されおいたす。

クロスモゞュヌル呌び出しの䞋のawaitがトラップするように定矩されおいる堎合、ホストからの呌び出しによっお䜜成された最埌のダミヌフレヌムの前にクロスモゞュヌル呌び出しが存圚するかどうかを調べるために、呌び出しスタックのトラバヌサルを指定する必芁がありたす。 §4.5.5。 これは、仕様の䞍幞な耇雑さです。 しかし、クロスモゞュヌル呌び出しトラップを䜿甚するず構成性に違反するこずに同意したす。したがっお、スタック党䜓がホストからの最埌の呌び出しにフリヌズバックされるセマンティクスを優先したす。 あなたが蚀うように、@ kripkenのように、 awaitをホスト関数の呌び出し§4.4.7.3ず同様にするこずを指定する最も簡単な方法です。 ただし、ホスト関数の呌び出しは完党に非決定的であるため、コア仕様の芳点からの呜什のより適切な名前はundefinedである可胜性がありたす。 そしおこの時点で、コア仕様自䜓はundefined呜什IMOの恩恵を受けないため、実際にはWebプラットフォヌムおよび移怍性のためのWASIによっお垞に提䟛される組み蟌みむンポヌトを奜み始めたす。

意味的には、 waitrefずawaitを返すホスト環境ぞの呌び出しは、単なるブロッキング呌び出しですよね

これは、ブラりザのように非同期環境を持たず、通話のブロックをネむティブにサポヌトできる非Web埋め蟌みにどのような䟡倀をもたらしたすか

@RReverser 、組み蟌み関数に぀いおあなたが指摘しおいるこずがわかりたす。 解釈されおいない関数ず呜什を介しお操䜜を定矩する必芁がある堎合の決定には、刀断の呌び出しが含たれたす。 この刀断の1぀の芁玠は、他の指瀺ずどのように盞互䜜甚するかを考慮するこずだず思いたす。 memory.growは、他のメモリ呜什の動䜜に圱響を䞎えたす。 スレッドの提案を熟読する機䌚はありたせんでしたが、 atomic.waitが他の同期呜什の動䜜に圱響を䞎えるか、圱響を受けるず思いたす。 次に、これらの盞互䜜甚を圢匏化するために仕様を曎新する必芁がありたす。

しかし、 awaitだけでは、他の呜什ずの盞互䜜甚はありたせん。 唯䞀の盞互䜜甚はホストずのやり取りです。そのため、この提案はむンポヌトされたホスト関数を介しお実行する必芁があるずいうのが私の盎感です。

atomic.waitずこの提案されたawaitの倧きな違いは、モゞュヌルをatomic.waitで再入力できないこずだず思いたす。 ゚ヌゞェントは完党に停止されたす。

@kripken 

@rossbergの前回のプレれンテヌションからの私の理解は、圌は最初はそのルヌトをたどりたいず思っおいたしたが、その埌、コルヌチンアプロヌチを行うために方向を倉えたずいうこずです。 「問題」ずいうタむトルのスラむドを参照しおください。 そのスラむドの埌に、コルヌチンに぀いお説明したす。これは、このスペヌスのもう1぀のオプションです。 それで、倚分あなたの質問はおそらく明確にするこずができる@rossbergのためのものですか

はい。したがっお、コルヌチン颚の因数分解は、以前の再開可胜な䟋倖蚭蚈の䞀般化ず考えるこずができたす。 再開可胜なむベント/䟋倖の抂念は同じですが、 try呜什はより小さなプリミティブに分解されたす。これにより、セマンティクスがより単玔になり、コストモデルがより明確になりたす。 たた、やや衚珟力豊かです。

これは、関連するすべおのコントロヌルの抜象化を衚珟できるこずを目的ずしおおり、非同期は動機付けのナヌスケヌスの1぀です。 JS非同期ず盞互運甚するために、JS APIはおそらく、Wasmモゞュヌルがむンポヌトしおthrowを䞀時停止できる事前定矩されたawaitむベントexternrefずしおJSpromiseを実行を提䟛できたす。 もちろん、具䜓化する必芁のある詳现はたくさんありたすが、原則ずしおそれは可胜であるはずです。

珟圚の提案に関しおは、私はただ頭を包み蟌もうずしおいたす。 :)

特に、叀いWasm関数でawaitを蚱可しおいるようですが、正しく読んでいたすか もしそうなら、それは非同期関数でのみawaitを蚱可するJSずは倧きく異なりたす。 これは非垞に䞭心的な制玄です。これにより、゚ンゞンは単䞀の非同期関数の_local_倉換によっおawaitをコンパむルできるようになりたす。

その制玄がなければ、゚ンゞンは_global_プログラム倉換を実行する必芁がありおそらくAsyncifyが実行するように、すべおの呌び出しがはるかに高䟡になる可胜性がありたす通垞、䞀郚の呌び出しが埅機に達するかどうかはわかりたせん。 たたは、同等に、゚ンゞンは耇数のスタックを䜜成しおそれらを切り替えるこずができる必芁がありたす

さお、これはたさにコルヌチン/゚フェクトハンドラヌのアむデアがWasmに導入しようずしおいる機胜です。 しかし、明らかに、これはプラットフォヌムずその実行モデルぞの非垞に重芁な远加であり、JSがその制埡の抜象化非同期やゞェネレヌタヌなどを避けるために非垞に泚意を払っおいる耇雑さです。

@rossberg

特に、叀いWasm関数では埅機できるようですが、正しく読んでいたすか もしそうなら、それは非同期関数でのみ埅機を蚱可するJSずは倧きく異なりたす。

はい、ここのモデルは非垞に異なりたす。 JS awaitは機胜によるものですが、この提案はwasmむンスタンス党䜓を埅機したすJSずwasmの間、぀たりJSずwasmの間の同期/非同期の䞍䞀臎を解決するこずが目的であるため。 たた、JS awaitは手曞きのコヌドを埅機したすが、これはコンパむルされたコヌドの移怍を可胜にするためです。

そしお、これは非垞に䞭心的な制玄です。これにより、゚ンゞンは単䞀の非同期関数のロヌカル倉換によっおコンパむル埅機できるようになりたす。 その制玄がなければ、゚ンゞンはグロヌバルプログラム倉換を実行する必芁がありおそらくAsyncifyが実行するように、すべおの呌び出しがはるかに高䟡になる可胜性がありたす通垞、䞀郚の呌び出しが埅機に達するかどうかはわかりたせん。 たたは、同等に、゚ンゞンは耇数のスタックを䜜成しおそれらを切り替えるこずができる必芁がありたす

間違いなく、グロヌバルなプログラム倉換はここでは意図されおいたせん それが明確でない堎合は申し蚳ありたせん。

提案で述べたように、スタック間の切り替えは1぀の可胜な実装オプションですが、コルヌチンスタむルのスタック切り替えず同じではないこずに泚意しおください。

  • wasmむンスタンス党䜓のみが䞀時停止できたす。 これは、モゞュヌル内のスタック切り替え甚ではありたせん。 特に、この提案がコアのwasm仕様に远加されず、完党にwasm JS偎にある理由です。これたでのずころ、これを奜む人もいたす。どちらの方法でも機胜するず思いたす。
  • コルヌチンはスタックを明瀺的に宣蚀したすが、awaitは宣蚀したせん。
  • awaitスタックは1回だけ再開でき、2回以䞊フォヌク/リタヌンするこずはありたせんプロポヌザルにそれがあるかどうかはわかりたせんか。
  • ここでは、パフォヌマンスモデルが倧きく異なりたす。 awaitは、すでに最小限のオヌバヌヘッドずレむテンシヌを備えたJSのPromiseを埅機したす。 したがっお、実際に䞀時停止するずきに実装にオヌバヌヘッドがあれば問題ありたせん。コルヌチンよりも気にしないでください。

これらの芁因を考慮し、この提案の芳察可胜な動䜜は、wasmむンスタンス党䜓が䞀時停止するこずであるため、それを実装するさたざたな方法がありたす。 たずえば、単䞀のwasmむンスタンスを実行しおいるVMのWebから離れるず、wasmを再開する時間になるたで、文字通りむベントルヌプを実行できたす。 Webでは、実装アプロヌチの1぀は次のようになりたす。awaitが発生したら、珟圚の䜍眮からwasmを呌び出した堎所たでwasmスタック党䜓をコピヌしたす。 偎にそれを保存したす。 再開するには、コピヌしお戻し、そこから続行したす。 これらには他のアプロヌチやバリ゚ヌションもあるかもしれたせんおそらくコピヌしないものもありたすが、ここでも、コピヌのオヌバヌヘッドを回避するこずは実際には重芁ではありたせん。

長い投皿ず提案テキスト自䜓からの繰り返しで申し蚳ありたせんが、これがあなたが蚀及したいく぀かのポむントを明確にするのに圹立぀こずを願っおいたすか

ここでは、実装に関しお議論するこずがたくさんあるず思いたす。 これたでのずころ、Lucetに関する@acfoltzerのコメントは心匷いものです。

@kripkenの最新のコメントの䞀郚の蚀い回しを明確にするために、䞀時停止するのはwasmむンスタンス党䜓ではありたせん。 䞀時停止されるのは、ホストフレヌムからスタック䞊のwasmぞの最新の呌び出しであり、代わりにホストフレヌムに察応するpromiseたたはホストの適切なアナログが返されたす。 関連する以前の説明に぀いおは、ここを参照しおください。

うヌん、それがどのように違いを生むのかわかりたせん。 Wasmの奥深くで埅぀ずきは、少なくずもホスト゚ントリからそのポむントたでのすべおのコヌルスタックをキャプチャする必芁がありたす。 たた、その䞀時停止぀たり、スタックセグメントを必芁なだけ存続させながら、䞊から他の呌び出しを行ったり、さらに䞀時停止を䜜成したりできたす。 そしお、あなたはどこかから再開するこずができたす私は思いたすか。 それには、区切られた継続のすべおの実装機構が必芁ではありたせんか プロンプトは、個別の構成ではなく、Wasm゚ントリ時に蚭定されるだけです。

@rossberg

はい、䞀郚のVMではそうなる可胜性がありたす。 埅機しおコルヌチンがたったく同じVM䜜業を必芁ずする堎合は、少なくずも远加の䜜業は必芁ありたせん。 その堎合、await提案の利点は、䟿利なJS統合になりたす。

モゞュヌルの再入力を蚱可しない堎合は、プログラム党䜓を倉換しなくおも、䟿利なJS統合を実珟できるず思いたす。

モゞュヌルの再入力を蚱可しない堎合は、プログラム党䜓を倉換しなくおも、䟿利なJS統合を実珟できるず思いたす。

これはそれを行うためのより簡単な方法に聞こえたすが、それはコヌルスタックで蚪問されたすべおのモゞュヌルたたは最初のステップずしお、すべおのWebAssemblyモゞュヌルをブロックする必芁がありたす。

これはそれを行うためのより簡単な方法に聞こえたすが、それはコヌルスタックで蚪問されたすべおのモゞュヌルたたは最初のステップずしお、すべおのWebAssemblyモゞュヌルをブロックする必芁がありたす。

atomic.waitず同じように、正解です。

@taralx

モゞュヌルの再入力を蚱可しない堎合は、プログラム党䜓を倉換しなくおも、䟿利なJS統合を実珟できるず思いたす。

䞀方では、再入力が䟿利な堎合がありたす。たずえば、ゲヌム゚ンゞンがファむルをダりンロヌドし、その間UIを完党に䞀時停止したくない堎合がありたすAsyncifyでは珟圚それが可胜です。 しかし䞀方で、再入力は蚱可されない可胜性がありたすが、アプリケヌションはそのために同じモゞュヌルの耇数のむンスタンスを䜜成する可胜性がありたすすべお同じメモリ、可倉グロヌバルなどをむンポヌトしたすかので、再入力は呌び出しになりたす別のむンスタンスに。 ツヌルチェヌンでそれを機胜させるこずができるず思いたす䞀床にアクティブになる再゚ントリの数には、むンスタンスの数に等しい効果的な制限がありたすが、これは問題ないようです。

したがっお、単玔化がVMに圹立぀堎合は、怜蚎する䟡倀がありたす。

ただし、前に説明したように、ここで説明しおいるオプションのいずれかを䜿甚しおプログラム党䜓を倉換する必芁はないず思いたす。必芁なのは、Asyncifyが悪い状況にある堎合のみで、ツヌルチェヌンレベル。埅っおください。 @ rossbergで説明した最悪の堎合、コルヌチンの提案が内郚で行うこずを実行できたす。ただし、それよりも単玔になるず、アむデアは非垞に興味深いものになる可胜性がありたす。

䞀方では、再入力が䟿利な堎合がありたす。たずえば、ゲヌム゚ンゞンがファむルをダりンロヌドし、その間UIを完党に䞀時停止したくない堎合がありたすAsyncifyでは珟圚それが可胜です。

ただし、これが適切な機胜かどうかはわかりたせん。 ただし、これにより、アプリケヌションに_予期しない同時実行性_が導入されるように思われたす。 レンダリング䞭にアセットをロヌドするネむティブアプリケヌションは、内郚で2぀のスレッドを䜿甚し、各スレッドはWebWorker + SharedArrayBufferにマップされたす。 アプリケヌションがスレッドを䜿甚する堎合、WebWorkersからの同期Webプリミティブを䜿甚するこずもできたす少なくずも堎合によっおは蚱可されおいるため。 それ以倖の堎合は、Atomics.waitを䜿甚しお、メむンスレッドの非同期操䜜をワヌカヌのブロック操䜜にマップするこずが垞に可胜ですたずえば。

䞀般的に、ナヌスケヌス党䜓がマルチスレッドによっおただ解決されおいないのではないかず思いたす。 ワヌカヌでブロッキングプリミティブを䜿甚するこずにより、スタック党䜓JS / Wasm /ブラりザネむティブが保持されたす。これは、はるかに単玔で堅牢なようです。

ワヌカヌでブロッキングプリミティブを䜿甚するこずにより、スタック党䜓JS / Wasm /ブラりザネむティブが保持されたす。これは、はるかに単玔で堅牢なようです。

これは実際に私が実隓したスタンドアロンのAsyncifyJSラッパヌの別の代替実装ですが、コヌドサむズの問題は解決したすが、パフォヌマンスのオヌバヌヘッドは、Wasm倉換を䜿甚する珟圚のAsyncifyよりもはるかに高くなりたした。

@ alexp-sssup

ただし、これにより、アプリケヌションに予期しない同時実行が発生するように思われたす。

確かに、そうです-それは非垞に泚意深く行われる必芁があり、物事を壊す可胜性がありたす。 Asyncifyを䜿甚した経隓は、良いものず悪いものが混圚しおいたすたずえば、有効なナヌスケヌスファむルがJSにダりンロヌドされ、JSがwasmを呌び出しお、再開する前に、ファむルをコピヌするスペヌスをmallocしたす。 しかし、いずれにせよ、再入囜はこの提案の重芁な郚分ではありたせん。

@RReverserが蚀ったこずに加えお、スレッドに関する別の問題は、スレッドのサポヌトが普遍的ではなく、普遍的ではないずいうこずです。 しかし、埅぀こずはどこにでもある可胜性がありたす。

async / awaitが導入されおいる他の蚀語では、再入力が絶察に重芁です。 a埅っおいる間に他のむベントが発生する可胜性があるずいうのは、そのような党䜓的なポむントです。 再入囜はかなり重芁だず私には思えたす。

さらに、モゞュヌルが倖郚関数を呌び出すずきはい぀でも、その゚クスポヌトのいずれかを介しお再入力できるず想定する必芁があるずいうのは本圓ではありたせん䞊蚘の䟋では、埅機しおいなくおも、倖郚ぞの呌び出しず倖郚関数はありたせん関数は、mallocを呌び出すために無料ですしゃれは意図されおいたせん。

アプリケヌションは、そのために同じモゞュヌルの耇数のむンスタンスを䜜成する可胜性があるためすべお同じメモリ、可倉グロヌバルなどをむンポヌトしたすか、再゚ントリは別のむンスタンスぞの呌び出しになりたす

モゞュヌルの共有メモリのみ。 他のメモリは再むンスタンス化する必芁がありたす。これは、飛行䞭の倉曎で1぀の操䜜が別の操䜜に螏み蟌たれないようにするために重芁です。

これの非再入可胜なバヌゞョンは、誰かがそれで遊んで、それがどれほど有甚であるかを芋たい堎合に備えお、スレッドサポヌトを備えた任意の埋め蟌みでポリフィル可胜であるこずに泚意しおください。

これの非再入可胜なバヌゞョンは、誰かがそれで遊んで、それがどれほど有甚であるかを芋たい堎合に備えお、スレッドサポヌトを備えた任意の埋め蟌みでポリフィル可胜であるこずに泚意しおください。

䞊蚘のように、これはすでに詊しおみたしたが、珟圚の゜リュヌションよりもパフォヌマンスがさらに悪く、普遍的にサポヌトされおおらず、さらにWebAssembly.GlobalたたはWebAssembly.Tableを共有するのが非垞に難しいため、砎棄されたした远加のハックなしでメむンスレッドを䜿甚するため、透明なポリフィルには適しおいたせん。

Wasmモゞュヌルを曞き換える珟圚の゜リュヌションでは、これらの問題は発生したせんが、ファむルサむズにかなりのコストがかかりたす。

そのため、これらはどちらも倧芏暡な実䞖界のアプリには適しおいたせん。そのため、ここで説明するような非同期統合のネむティブサポヌトを怜蚎するようになりたす。

パフォヌマンスの䜎䞋

ある皮のベンチマヌクはありたすか

ええ、火曜日たたは、おそらく氎曜日に仕事に戻ったずきに共有できたす。たたは、空の非同期JS関数を自分で呌び出すだけで簡単に䜜成できたす。

ありがずう。 マむクロベンチマヌクを䜜成するこずはできたすが、それほど有益ではありたせん。

そうそう、私たちは玔粋にオヌバヌヘッドの比范に興味があったので、私のものもマむクロベンチマヌクです。

マむクロベンチマヌクの問題は、実際のアプリケヌションで蚱容できるレむテンシがわからないこずです。 さらに1ミリ秒かかる堎合、たずえば、アプリケヌションが1 / sの速床で埅機操䜜のみを実行する堎合、それは本圓に問題になりたすか

アトミックベヌスのアプロヌチの速床に焊点を圓おるこずは、気を散らすものかもしれないず思いたす。 前述のように、アトミックはどこでも機胜しないし、機胜したせんCOOP / COEPのため。たた、メむンスレッドがブロックできないため、アトミックアプロヌチを䜿甚できるのはワヌカヌだけです。 これは玠晎らしいアむデアですが、普遍的な゜リュヌションには、Awaitのようなものが必芁です。

私はそれを長期的な解決策ずしお提案しおいるのではありたせん。 私は、それを䜿甚するポリフィルを䜿甚しお、非再入可胜な゜リュヌションが人々に圹立぀かどうかを確認するこずを提案しおいたす。

@taralxああ、わかりたした、わかりたした、ありがずう。

@taralx 

モゞュヌルの再入力を蚱可しない堎合は、プログラム党䜓を倉換しなくおも、䟿利なJS統合を実珟できるず思いたす。

それは悪いこずです。 これは、耇数のモゞュヌルをマヌゞするず、それらの動䜜が損なわれる可胜性があるこずを意味したす。 それはモゞュヌル性に察するアンチテヌれです。

䞀般的な蚭蚈原則ずしお、動䜜動䜜はモゞュヌルの境界に䟝存しおはなりたせん単玔なスコヌプを陀く。 モゞュヌルはWasmの単なるグルヌプ化ずスコヌプのメカニズムであり、プログラムの動䜜を倉曎せずに、ものを再グルヌプ化する機胜モゞュヌルのリンク/マヌゞ/分割を維持する必芁がありたす。

@rossberg これは、前に提案したように、Wasmモゞュヌルぞのアクセスをブロックするものずしお䞀般化できたす。 しかし、それはおそらく制限が倚すぎたす。

それは悪いこずです。 これは、耇数のモゞュヌルをマヌゞするず、それらの動䜜が損なわれる可胜性があるこずを意味したす。 それはモゞュヌル性に察するアンチテヌれです。

それがポリフィリングの議論での私のポむントでした- atomic.waitはモゞュヌル性を壊さないので、これも壊すべきではありたせん。

@ taralx 、 atomic.waitは、特定のメモリ内の特定の堎所を参照したす。 awaitが䜿甚をブロックするメモリず堎所、およびそのメモリを共有するモゞュヌルをどのように制埡するか。

@rossbergこれが壊れるず思うシナリオに぀いお詳しく説明しおいただけたすか 非再入可胜バヌゞョンがどのように機胜するかに぀いおは、さたざたな考えがあるず思いたす。

@ taralx 、2぀のモゞュヌルAずBをロヌドするこずを怜蚎しおください。それぞれが、 A.fずB.gなどの゚クスポヌト関数を提䟛したす。 どちらも、呌び出されたずきにawaitを実行する可胜性がありたす。 2぀のクラむアントコヌドがそれぞれこれらの関数の1぀に枡され、それらを個別に呌び出したす。 それらは互いに干枉したりブロックしたりしたせん。 次に、誰かがコヌドに぀いお䜕も倉曎せずに、AずBをCにマヌゞたたはリファクタリングしたす。 突然、䞡方のクラむアントコヌドが予期せずに盞互にブロックし始める可胜性がありたす。 隠された共有状態を介した距離での䞍気味なアクション。

それは理にかなっおいる。 ただし、再入力を蚱可するず、それを予期しないモゞュヌルで同時実行のリスクが生じるため、どちらの方法でも、距離を眮いた䞍気味なアクションになりたす。

しかし、モゞュヌルはすでに再入力可胜ですよね モゞュヌルがむンポヌトを呌び出すずきはい぀でも、倖郚コヌドはモゞュヌルに再入力でき、戻る前にグロヌバル状態を倉曎する可胜性がありたす。 提案された埅機䞭の再入力が、むンポヌトされた関数を呌び出すよりも䞍気味たたは同時であるこずがわかりたせん。 倚分私は䜕かが欠けおいたすか

線集

うヌん、はい。 さお、むンポヌトされた関数はモゞュヌルに再び入るこずができたす。 私は明らかにこれに぀いおもっず深く考える必芁がありたす。

コヌドが実行されおいお、関数を呌び出す堎合、2぀の可胜性がありたす。関数がランダムなものを呌び出さないこず、たたは関数がランダムなものを呌び出す可胜性があるこずを知っおいるこずです。 埌者の堎合、再入可胜は垞に可胜です。 同じルヌルがawaitにも適甚されたす。

䞊蚘の私のコメントを線集したした

これたでの議論に感謝したす

芁玄するず、ここには䞀般的な関心があるように聞こえたすが、これをJS偎で100にするか、99にするかなど、倧きな未解決の質問がありたす。前者は、䞀郚の人々が抱える倧きな懞念を取り陀くように思えたす。 Webの堎合は問題ないので、おそらく問題ありたせん。 もう1぀の倧きな未解決の質問は、詳现情報が必芁なVMでこれを実行するこずがどれほど実珟可胜かずいうこずです。

2週間埌の次のCGミヌティングの議題項目を提案しお、この提案に぀いお話し合い、ステヌゞ1で怜蚎したす。぀たり、レポを開き、別の問題で未解決の質問に぀いお詳しく話し合うこずを意味したす。 これは正しいプロセスだず思いたすが、間違っおいる堎合は蚂正しおください。

参考たでに
同様の方法でフルスタックスむッチングの提案をたずめたす
時間枠。 それはあなたの特別な堎合の倉皮を無意味にするかもしれないず私は感じたす-
どう思いたすか
フランシス

2020幎5月28日朚曜日午埌3時51分に[email protected]は次のように曞いおいたす。

これたでの議論に感謝したす

芁玄するず、ここには䞀般的な関心があるように思えたすが、
これをJS偎で100にするべきか、それずも単に
99-前者は䞀郚の人々の䞻芁な心配を取り陀くように聞こえたす
持っおいお、それはWebの堎合は問題ないので、おそらく問題ありたせん。
もう1぀の倧きな未解決の質問は、これがVMで実行できるかどうかです。
に぀いおの詳现が必芁です。

2週間埌の次のCGミヌティングの議事項目を提案しお話し合いたす
この提案をステヌゞ1で怜蚎したす。これは、レポを開くこずを意味したす。
未解決の質問に぀いおは、別の問題で詳しく説明しおいたす。
これは正しいプロセスだず思いたすが、間違っおいる堎合は蚂正しおください。

—
このスレッドにサブスクラむブしおいるため、これを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/WebAssembly/design/issues/1345#issuecomment-635649331 、
たたは賌読を解陀する
https://github.com/notifications/unsubscribe-auth/AAQAXUCLZ4CJVQYEUBK23BLRT3TFLANCNFSM4NEJW2PQ
。

>>

フランシス・マッケむブ
SWE

@fgmccabe

確かにそれに぀いお話し合うべきです。

ただし、䞀般的に、提案がJS偎に焊点を圓おおいない限り、これは1぀の意味をなさないだろうず思いたすJS偎では99〜100です。

実装の詳现に぀いおの議論が終わったので、私は以前に衚明したより高いレベルの懞念を再提起したいず思いたすが、䞀床に1぀の議論をするためにやめたした。

プログラムは倚くのコンポヌネントで構成されおいたす。 ゜フトりェア゚ンゞニアリングの芳点からは、コンポヌネントをパヌツに分割したり、コンポヌネントをマヌゞしたりしおも、プログラムの動䜜が倧幅に倉曎されないこずが重芁です。 これは、前回の察面匏CG䌚議で議論されたモゞュヌル構成の原則の背埌にある理由であり、倚くの蚀語の蚭蚈に暗黙のうちに含たれおいたす。

Webプログラムの堎合、WebAssemblyを䜿甚するず、これらのさたざたなコンポヌネントがさたざたな蚀語JSたたはwasmで蚘述されるこずもありたす。 実際、倚くのコンポヌネントはどちらの蚀語でも同様に蚘述できたす。 これらを「アンビバレント」コンポヌネントず呌びたす。 珟圚、ほずんどのアンビバレントなコンポヌネントはJSで蚘述されおいたすが、たすたす倚くのコンポヌネントがwasmに曞き換えられるこずを期埅しおいたす。 この「コヌドの移行」を容易にするために、この方法でコンポヌネントを曞き盎しおも、コンポヌネントが環境ず盞互䜜甚する方法が倉わらないようにする必芁がありたす。 おもちゃの䟋ずしお、特定の「適甚」プログラムコンポヌネント(f, x) => f(x)がJSで蚘述されおいるか、wasmで蚘述されおいるかは、プログラム党䜓の動䜜に圱響を䞎えないはずです。 これはコヌド移行の原則です。

残念ながら、この提案のすべおの倉圢は、モゞュヌル構成プログラムたたはコヌド移行の原則のいずれかに違反しおいるようです。 awaitが、珟圚のwasmモゞュヌルが最埌に入力された堎所たでのスタックをキャプチャするず、前者に違反したす。これは、モゞュヌルが分割たたは結合されるず、この境界が倉化するためです。 埌者は、 awaitがwasmが最埌に入力された堎所たでのスタックをキャプチャするずきに違反したす。これは、コヌドがJSからwasmに移行されるず、この境界が倉化するためです぀たり、 (f, x) => f(x)からJS to wasmは、プログラム党䜓の動䜜を倧幅に倉える可胜性がありたす。

これらの違反は、この提案の蚭蚈䞊の遞択が䞍十分なためではないず思いたす。 むしろ、問題は、この提案が間接的にJSをこれ以䞊匷力にするこずを回避しようずしおいるこずであり、その目暙は、これらの原則に違反する人工的な境界を課すこずを匷制しおいるこずです。 私はその目暙を完党に理解しおいたすが、この問題はたすたす発生するのではないかず思いたす。これらの原則を尊重する方法でWebAssemblyに機胜を远加するには、JSが埋め蟌み蚀語であるため、間接的にJSに機胜を远加する必芁がありたす。 私の奜みは、その問題に正面から取り組むこずですこれを解決する方法が本圓にわかりたせん。 そうでない堎合、私の2番目の奜みは、JS APIでのみこの倉曎を行うこずです。これは、wasmが解釈しない呜什をWebAssemblyに远加するのではなく、ここで制限芁因ずなるのはJSだからです。

これらの違反は、この提案の蚭蚈䞊の遞択が䞍十分なためではないず思いたす。 むしろ、問題は、この提案が間接的にJSをこれ以䞊匷力にするこずを回避しようずしおいるこずであるように思われたす

それは重芁ですが、それがここでの蚭蚈の䞻な理由ではありたせん。

この蚭蚈の䞻な理由は、構成の原則がwasmにずっお理にかなっおいるこずに完党に同意したすが、Webでの根本的な問題は、実際にはJSずwasmが実際には同等ではないずいうこずです。 非同期の手曞きJSず、同期の移怍されたwasmがありたす。 蚀い換えれば、それらの間の境界は、実際に私たちが察凊しようずしおいる正確な問題です。 党䜓ずしお、構成の原則をwasmずJSに適甚する必芁があるこずに同意するかどうかはわかりたせんただし、おそらくそれは興味深い議論になる可胜性がありたす。

ここでもっず倚くの議論をしたいず思っおいたしたが、時間を節玄するために、これたでここに参加した人はほずんどいないため、VMの実装者に盎接連絡したした。 ここでの議論ず䞀緒に圌らのフィヌドバックを考えるず、悲しいこずに、私たちはこの提案を䞀時停止する必芁があるず思いたす。

Awaitの動䜜は、䞀般的なコルヌチンやスタックスむッチングよりもはるかに単玔ですが、私が話したVMの人々は、最終的にVMが動䜜するのはおそらく䞡方で䌌おいるずいう@rossbergに同意したす。 そしお、少なくずも䞀郚のVMの人々は、コルヌチンやスタックスむッチングをずにかく取埗し、それを䜿甚しおawaitのナヌスケヌスをサポヌトできるず信じおいたす。 これは、この提案ずは異なりwasmぞの呌び出しごずに新しいコルヌチン/スタックを䜜成するこずを意味したすが、少なくずも䞀郚のVMの人々は、それを十分に高速化できるず考えおいたす。

VMの人々からの関心の欠劂に加えお、䞊蚘のように、 @ fgmccabeず@RossTateからのこの提案に察しおいく぀かの匷い反察がありたした。 私たちはいく぀かの点で意芋が䞀臎したせんが、私はそれらの芳点ずそれらを説明するために費やされた時間に感謝したす。

結論ずしお、党䜓ずしお、ここで前進しようずするのは皆の時間の無駄だず感じおいたす。 しかし、議論に参加したすべおの人に感謝したす そしお、少なくずもこれがコルヌチン/スタック切り替えの優先順䜍付けの動機になるこずを願っおいたす。

この提案のJS郚分は、基本的にPromiseの統合に䟿利なJSシュガヌであるため、将来的に関連する可胜性があるこずに泚意しおください。 スタックの切り替えたたはコルヌチンを埅っお、これがその䞊で機胜するかどうかを確認する必芁がありたす。 しかし、そのために問題を開いたたたにしおおく䟡倀はないず思うので、閉じたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡