@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ä»æ§ãžã®å€æŽã¯ãããããã§ãã
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ä»æ§ã¯ä»¥äžã§ãã
wasm JSä»æ§ïŒWebãªã©ã®JSç°å¢ã«ã®ã¿åœ±é¿ããïŒãžã®å€æŽã¯ãããèå³æ·±ããã®ã§ãã
waitref
å€ã¯JSPromiseã§ããawait
ãå®è¡ããããšãwasmã€ã³ã¹ã¿ã³ã¹å
šäœãäžæåæ¢ãããã®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ãäœæããã®ã¯ç°¡åã§ãïŒãããŠæ¥œããã§ãïŒïŒã åè¿°ã®ãªãã·ã§ã³ãšã¯å¥ã«ãã©ã€ãã©ãªã¯æ¬¡ã®ãããããå®è¡ã§ããŸãã
ãã®ãããªã¢ãããŒããä»ã®ã¢ãããŒãã®äžã«ãããã«å€ãã®ãã®ãæ§ç¯ããããšãã§ããŸãã ææ¡ãšVMã®è€éããåé¿ããããã«ããã¹ãŠãããŒã«ãã§ãŒã³ãšã©ã€ãã©ãªã«ä»»ããããšããå§ãããŸãã
ããã€ãã®èŠå ãVMã®å®è£ ãã·ã³ãã«ã«ä¿ã€ã®ã«åœ¹ç«ã€ã¯ãã§ãã
setjmp
ããã¯ããŒã³äœæ/ãã©ãŒã¯ãèš±å¯ããã·ã¹ãã ã®ã³ã«ãŒãã³ãšã¯ç°ãªããããã§ã¯2åè¿ããããã®ã¯ãããŸããã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ã¯ããããæžãçµãããšãã«@tqchenã«ãã£ãŠæçš¿ãããŸããã ã³ã«ãŒãã³ãšéåæãµããŒãã¯å¥ã ã®æ©èœã§ãããšããç§ãã¡ã®ä¿¡å¿µãå ±æããŠããã®ã§ãç§ãã¡ã¯éåžžã«å¬ããæããŸãã
await
åœä»€ã¯ãããã§ææ¡ãããŠãããã®ïŒãªãã·ã§ã³C3ïŒãšéåžžã«ãã䌌ããã®ãå®è£
ããã®ã«åœ¹ç«ã€ãšèããŠããŸãããç¹å¥ãªéåæã·ã¹ãã ã³ãŒã«ã¯å¿
èŠãããŸããããäžéšã®ã·ã¹ãã ã³ãŒã«ã¯waitref
ãè¿ãå¯èœæ§ããããŸãã await
edã«ããããšãã§ããŸãã
JavaScriptã®å ŽåãåŸ æ©ãwasmã€ã³ã¹ã¿ã³ã¹ã®äžæåæ¢ãšããŠå®çŸ©ããŸãããããã¯ãããŒãžã«JavaScriptã ãã§ãªãè€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãå«ããããšãã§ãããããçã«ããªã£ãŠããŸãã ãã ããäžéšã®ãµãŒããŒç°å¢ã§ã¯ããã¹ããšåäžã®wasmã€ã³ã¹ã¿ã³ã¹ãããªãå ŽåããããŸãããã®å ŽåãåŸ æ©ã¯ã¯ããã«ç°¡åã«ãªããæåéããã¡ã€ã«èšè¿°åãŸãã¯GPUã§åŸ æ©ããå¯èœæ§ããããŸãã ãŸãã¯ãåŸ æ©ãããšãwasm VMå šäœãäžæåæ¢ããŠããã€ãã³ãã«ãŒããå®è¡ããç¶ããå¯èœæ§ããããŸãã ããã§ã¯å ·äœçãªã¢ã€ãã¢ã¯ãããŸãããããã®åé¡ã§ã®è°è«ã«åºã¥ããŠãããã§èå³æ·±ãå¯èœæ§ããããããããŸããã人ã ãã©ãæããèå³ããããŸãã
JSç°å¢ã§ã¯ãwasmã€ã³ã¹ã¿ã³ã¹ãäžæåæ¢ãããšãåŒã³åºãã人ã«ããã«æ»ããŸãã åŒã³åºãå
ãJSããã®å Žåã«äœãèµ·ãããã説æããŸããããŸããåŒã³åºãå
ããã©ãŠã¶ãŒã®å Žåã«ãåãããšãèµ·ãããŸãïŒããšãã°ãäžæåæ¢ããwasmãšã¯ã¹ããŒãã§setTimeout
ãå®è¡ããå Žåãããã§ã¯èå³æ·±ãããšã¯äœãèµ·ãããŸãããè¿ãããPromiseã¯ç¡èŠãããŸãïŒã ãã ããwasmããã®åŒã³åºãã®å¥ã®ã±ãŒã¹ããããŸããã€ãŸããwasmã€ã³ã¹ã¿ã³ã¹A
ãã€ã³ã¹ã¿ã³ã¹B
ããã®ãšã¯ã¹ããŒããçŽæ¥åŒã³åºãã B
ãäžæåæ¢ããŸãã äžæåæ¢ãããšãããã«B
Promise
$ãè¿ããŸãã
åŒã³åºãå
ãJavaScriptã®å ŽåãåçèšèªãšããŠããã¯ããã»ã©åé¡ã§ã¯ãªããå®éãåŒã³åºãå
ãåè¿°ã®ããã«åããã§ãã¯ããããšãæåŸ
ããã®ã¯åççã§ãã åŒã³åºãå
ãéçã«åæå®ãããWebAssemblyã§ããå Žåãããã¯åä»ã§ãã ãã®ææ¡ã§äœãããªãã£ãå Žåãå€ããã£ã¹ããããŸãããã®äŸã§ã¯ãPromiseããA
ãæåŸ
ããã€ã³ã¹ã¿ã³ã¹ã«ãã£ã¹ããããŸãïŒ i32
ã®å Žåã次ã®ããã«ãã£ã¹ããããŸãïŒã 0
ïŒã 代ããã«ããšã©ãŒãçºçããããšããå§ãããŸãã
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
èªãã§ããã ãããããšãããããŸãããã£ãŒãããã¯ã¯å€§æè¿ã§ãïŒ
åªããèšäºïŒ ç§ã¯ãã¹ãå¶åŸ¡ã®ãµã¹ãã³ã·ã§ã³ã®ã¢ã€ãã¢ã奜ãã§ãã @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ããããããæ©ã解決ãããããšã¯ã§ããŸããã å¥ã®æ¹æ³ã§ç©äºãèŠçŽããŠã¿ãŸãããïŒ
ãããã£ãŠãç¹ã«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ã€ã³ã¹ã¿ã³ã¹ãå®è¡ããŠãã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ã·ã¥ã¬ãŒã§ãããããå°æ¥çã«é¢é£ããå¯èœæ§ãããããšã«æ³šæããŠãã ããã ã¹ã¿ãã¯ã®åãæ¿ããŸãã¯ã³ã«ãŒãã³ãåŸ ã£ãŠãããããã®äžã§æ©èœãããã©ããã確èªããå¿ èŠããããŸãã ãããããã®ããã«åé¡ãéãããŸãŸã«ããŠãã䟡å€ã¯ãªããšæãã®ã§ãéããŸãã
æãåèã«ãªãã³ã¡ã³ã
ããã§ãã£ãšå€ãã®è°è«ãããããšæã£ãŠããŸããããæéãç¯çŽããããã«ããããŸã§ããã«åå ãã人ã¯ã»ãšãã©ããªããããVMã®å®è£ è ã«çŽæ¥é£çµ¡ããŸããã ããã§ã®è°è«ãšäžç·ã«åœŒãã®ãã£ãŒãããã¯ãèãããšãæ²ããããšã«ãç§ãã¡ã¯ãã®ææ¡ãäžæåæ¢ããå¿ èŠããããšæããŸãã
Awaitã®åäœã¯ãäžè¬çãªã³ã«ãŒãã³ãã¹ã¿ãã¯ã¹ã€ããã³ã°ãããã¯ããã«åçŽã§ãããç§ã話ããVMã®äººã ã¯ãæçµçã«VMãåäœããã®ã¯ããããäž¡æ¹ã§äŒŒãŠãããšãã@rossbergã«åæããŸãã ãããŠãå°ãªããšãäžéšã®VMã®äººã ã¯ãã³ã«ãŒãã³ãã¹ã¿ãã¯ã¹ã€ããã³ã°ããšã«ããååŸããããã䜿çšããŠawaitã®ãŠãŒã¹ã±ãŒã¹ããµããŒãã§ãããšä¿¡ããŠããŸãã ããã¯ãïŒãã®ææ¡ãšã¯ç°ãªãïŒwasmãžã®åŒã³åºãããšã«æ°ããã³ã«ãŒãã³/ã¹ã¿ãã¯ãäœæããããšãæå³ããŸãããå°ãªããšãäžéšã®VMã®äººã ã¯ããããååã«é«éåã§ãããšèããŠããŸãã
VMã®äººã ããã®é¢å¿ã®æ¬ åŠã«å ããŠãäžèšã®ããã«ã @ fgmccabeãš@RossTateããã®ãã®ææ¡ã«å¯ŸããŠããã€ãã®åŒ·ãå察ããããŸããã ç§ãã¡ã¯ããã€ãã®ç¹ã§æèŠãäžèŽããŸããããç§ã¯ãããã®èŠ³ç¹ãšãããã説æããããã«è²»ããããæéã«æè¬ããŸãã
çµè«ãšããŠãå šäœãšããŠãããã§åé²ããããšããã®ã¯çã®æéã®ç¡é§ã ãšæããŠããŸãã ããããè°è«ã«åå ãããã¹ãŠã®äººã«æè¬ããŸãïŒ ãããŠãå°ãªããšããããã³ã«ãŒãã³/ã¹ã¿ãã¯åãæ¿ãã®åªå é äœä»ãã®åæ©ã«ãªãããšãé¡ã£ãŠããŸãã
ãã®ææ¡ã®JSéšåã¯ãåºæ¬çã«Promiseã®çµ±åã«äŸ¿å©ãªJSã·ã¥ã¬ãŒã§ãããããå°æ¥çã«é¢é£ããå¯èœæ§ãããããšã«æ³šæããŠãã ããã ã¹ã¿ãã¯ã®åãæ¿ããŸãã¯ã³ã«ãŒãã³ãåŸ ã£ãŠãããããã®äžã§æ©èœãããã©ããã確èªããå¿ èŠããããŸãã ãããããã®ããã«åé¡ãéãããŸãŸã«ããŠãã䟡å€ã¯ãªããšæãã®ã§ãéããŸãã