ãã®ææ¡ã¯ã @ fmccabe ã @ thibaudmichaud ã @ lukewagner ãããã³@kripkenãš
ãã®ææ¡ã®ç®çã¯ãJavaScriptã®promiseãšWebAssemblyã®éã«æ¯èŒçå¹ççã§æ¯èŒç人éå³ã®ããçžäºéçšãæäŸããããšã§ãããå€æŽã¯JS APIã®ã¿ã§ãããã³ã¢wasmã§ã¯ãªããšããå¶çŽã®äžã§æ©èœããŸãã
ã¹ã¿ãã¯ã¹ã€ããã³ã°ããããŒã¶ã«ã¯ãæçµçã«ã³ã¢WebAssemblyãæ¡åŒµããŠããã®ããããŒã¶ã«ã§æäŸããæäœãWebAssemblyå
ã§çŽæ¥å®è£
ããæ©èœãšãä»ã®å€ãã®è²Žéãªã¹ã¿ãã¯ã¹ã€ããã³ã°æäœãå®è£
ããããšãæåŸ
ãããŸããã
詳现ã«ã€ããŠã¯ã2021幎6æ28æ¥ã®ã¹ã¿ãã¯ãµãã°ã«ãŒãäŒè°ã®ã¡ã¢ãšã¹ã©ã€ããåç
§ããŠãã ããããã®
æŽæ°ïŒStacksãµãã°ã«ãŒããTC39ããåãåã£ããã£ãŒãããã¯ã«ç¶ããŠããã®ææ¡ã§ã¯WebAssemblyã¹ã¿ãã¯ã®äžæåæ¢asycn
/ã®ãµããŒãã¯éæ¥çã«æå¹ã«ãªããŸããã JavaScriptã®await
ã
ããã¯ã Function
ãµãã¯ã©ã¹ãšããŠWebAssembly.Function
ãå°å
¥ããjs-typesã®ææ¡ã«ïŒå€§ãŸãã«ïŒäŸåããŸãã
ææ¡ã¯ã以äžã®ã€ã³ã¿ãŒãã§ãŒã¹ãã³ã³ã¹ãã©ã¯ã¿ãŒãããã³ã¡ãœãããJS APIã«è¿œå ããããšã§ããããããã®ã»ãã³ãã£ã¯ã¹ã®è©³çŽ°ã以äžã«ç€ºããŸãã
interface Suspender {
constructor();
Function suspendOnReturnedPromise(Function func); // import wrapper
// overloaded: WebAssembly.Function suspendOnReturnedPromise(WebAssembly.Function func);
WebAssembly.Function returnPromiseOnSuspend(WebAssembly.Function func); // export wrapper
}
以äžã¯ããã®APIã®äœ¿çšæ¹æ³ã®äŸã§ãã
ç§ãã¡ã®äœ¿çšã·ããªãªã§ã¯ãWebAssemblyã¢ãžã¥ãŒã«ããåæãããã³ãéåæãã®ã€ã³ããŒããšãšã¯ã¹ããŒããæã£ãŠãããšèãããããšäŸ¿å©ã§ããããšãããããŸããã
çŸåšã®JSAPIã¯ããåæãã€ã³ããŒããšãšã¯ã¹ããŒãã®ã¿ããµããŒãããŠããŸãã
Suspenderã€ã³ã¿ãŒãã§ãŒã¹ã®ã¡ãœããã¯ããéåæããäœæããããã«é¢é£ããã€ã³ããŒããšãšã¯ã¹ããŒããã©ããããããã«äœ¿çšãããSuspenderãªããžã§ã¯ãèªäœããããã®ã€ã³ããŒããšãšã¯ã¹ããŒããæ瀺çã«æ¥ç¶ããŠãå®è£
ãšæ§æã®äž¡æ¹ã容æã«ããŸãã
WebAssemblyïŒ demo.wasm
ïŒïŒ
(module
(import "js" "init_state" (func $init_state (result f64)))
(import "js" "compute_delta" (func $compute_delta (result f64)))
(global $state f64)
(func $init (global.set $state (call $init_state)))
(start $init)
(func $get_state (export "get_state") (result f64) (global.get $state))
(func $update_state (export "update_state") (result f64)
(global.set (f64.add (global.get $state) (call $compute_delta)))
(global.get $state)
)
)
ããã¹ãïŒ data.txt
ïŒïŒ
19827.987
JavaScriptïŒ
var suspender = new Suspender();
var init_state = () => 2.71;
var compute_delta = () => fetch('data.txt').then(res => res.text()).then(txt => parseFloat(txt));
var importObj = {js: {
init_state: init_state,
compute_delta: suspender.suspendOnReturnedPromise(compute_delta)
}};
fetch('demo.wasm').then(response =>
response.arrayBuffer()
).then(buffer =>
WebAssembly.instantiate(buffer, importObj)
).then(({module, instance}) => {
var get_state = instance.exports.get_state;
var update_state = suspender.returnPromiseOnSuspend(instance.exports.update_state);
...
});
ãã®äŸã§ã¯ãéåžžã«åçŽãªã¹ããŒããã·ã³ã§ããWebAssemblyã¢ãžã¥ãŒã«ããããŸããç¶æ
ãæŽæ°ãããã³ã«ãã€ã³ããŒããåŒã³åºããŠãã«ã¿ãèšç®ããç¶æ
ã«è¿œå ããŸãã
ãã ããJavaScriptåŽã§ã¯ããã«ã¿ã®èšç®ã«äœ¿çšããé¢æ°ãéåæã§å®è¡ããå¿
èŠãããããšãããããŸããã ã€ãŸããæ°å€èªäœã§ã¯ãªããæ°å€ã®çŽæãè¿ããŸãã
æ°ããJSAPIã䜿çšããããšã§ããã®åæã®ã®ã£ãããåããããšãã§ããŸãã
ãã®äŸã§ã¯ãWebAssemblyã¢ãžã¥ãŒã«ã®ã€ã³ããŒãã¯suspender.suspendOnReturnedPromise
ã䜿çšããŠã©ããããããšã¯ã¹ããŒãã¯suspender.returnPromiseOnSuspend
ã䜿çšããŠã©ãããããã©ã¡ããåãsuspender
ãŸãã
ãã®suspender
ã¯2ã€ã«äžç·ã«æ¥ç¶ããŸãã
ããã«ãããïŒã©ãããããŠããªãïŒã€ã³ããŒããPromiseãè¿ãå ŽåãïŒã©ãããããïŒãšã¯ã¹ããŒãã¯Promiseãè¿ãããã®éã®ãã¹ãŠã®èšç®ã¯ãã€ã³ããŒãã®Promiseã解決ããããŸã§ãäžæåæ¢ããããŸãã
ãšã¯ã¹ããŒãã®ã©ããã³ã°ã¯åºæ¬çã«async
ããŒã«ãŒãè¿œå ããã€ã³ããŒãã®ã©ããã³ã°ã¯åºæ¬çã«await
ããŒã«ãŒãè¿œå ããŸãããJavaScriptãšã¯ç°ãªãã async
ãæ瀺çã«ã¹ã¬ããåããå¿
èŠã¯ãããŸããã await
ãã¹ãŠã®äžéWebAssemblyé¢æ°ãä»ããŠïŒ
äžæ¹ãåæåäžã«init_state
ã«å¯ŸããŠè¡ãããåŒã³åºãã¯ãå¿
ãäžæããã«è¿ããããšã¯ã¹ããŒãget_state
åŒã³åºããåžžã«äžæããã«è¿ããããããããããŒã¶ã«ã¯æ¢åã®ãåæãã€ã³ããŒãããã³ãšã¯ã¹ããŒããåŒãç¶ããµããŒãããŸãã WebAssemblyãšã³ã·ã¹ãã ã¯ä»æ¥äœ¿çšããŠããŸãã
ãã¡ãããåæãšã¯ã¹ããŒããéåæã€ã³ããŒããåŒã³åºãå Žåãã€ã³ããŒããäžæåæ¢ããããšãããšããã°ã©ã ããã©ãããããšããäºå®ãªã©ãå€ãã®è©³çŽ°ããã£ãšèŠãããŠããŸãã
以äžã«ããã詳现ãªä»æ§ãšããã€ãã®å®è£
æŠç¥ã瀺ããŸãã
Suspender
ã¯ã次ã®ããããã®ç¶æ
ã«ãããŸãã
caller
]-ã³ã³ãããŒã«ã¯Suspender
ã«ããã caller
ã¯Suspender
ãåŒã³åºãã externref
æåŸ
ããŠããé¢æ°ã§ããè¿ãããã¡ãœããsuspender.returnPromiseOnSuspend(func)
ã func
ã[ti*] -> [to]
ã®åœ¢åŒã®é¢æ°åã®WebAssembly.Function
ã§ããããšãè¡šæããé¢æ°åã®WebAssembly.Function
ãè¿ããŸãã [ti*] -> [externref]
ã¯ãåŒæ°args
åŒã³åºããããšã次ã®ããšãè¡ããŸãã
suspender
ã®ç¶æ
ãéã¢ã¯ãã£ãã§ãªãå Žåã«ãã©ããããŸãsuspender
ã®ç¶æ
ãã¢ã¯ãã£ã[ caller
]ã«å€æŽããŸãïŒããã§ã caller
ã¯çŸåšã®åŒã³åºãå
ã§ãïŒresult
ãfunc(args)
ïŒãŸãã¯ãã©ãããŸãã¯ã¹ããŒãããäŸå€ïŒãåŒã³åºããçµæãšããŸããsuspender
ã®ç¶æ
ãããã€ãã®caller'
ã¢ã¯ãã£ã[ caller'
]ã§ããããšãè¡šæããŸãïŒåŒã³åºãå
ãå€æŽãããå¯èœæ§ããããŸãããä¿èšŒãããŠããã¯ãã§ãïŒsuspender
ã®ç¶æ
ãéã¢ã¯ãã£ãã«å€æŽããŸãresult
ãcaller'
è¿ãïŒãŸãã¯åã¹ããŒããïŒã¡ãœããsuspender.suspendOnReturnedPromise(func)
func
ãWebAssembly.Function
å Žåããã®é¢æ°åã¯[t*] -> [externref]
ã®åœ¢åŒã§ãããšäž»åŒµããé¢æ°å[t*] -> [externref]
WebAssembly.Function
ãè¿ããŸãã ;func
ãFunction
ãšäž»åŒµãã Function
ãè¿ããŸãããããã®å Žåãã suspender.suspendOnReturnedPromise(func)
ã«ãã£ãŠè¿ãããé¢æ°ã¯ãåŒæ°args
ãæå®ããŠåŒã³åºããããšã次ã®ããã«ãªããŸãã
result
ãfunc(args)
ïŒãŸãã¯ãã©ãããŸãã¯ã¹ããŒãããäŸå€ïŒãåŒã³åºããçµæãšããŸããresult
ãè¿ãããPromiseã§ãªãå Žåã¯ã result
è¿ããŸãïŒãŸãã¯åã¹ããŒããŸãïŒãsuspender
ã®ç¶æ
ãã¢ã¯ãã£ãã§ãªãå Žåã«ãã©ãã[ caller
]äžéšã®caller
caller
以éã frames
ã¹ã¿ãã¯ãã¬ãŒã ãšããŸããframes
äžæåæ¢äžå¯èœãªé¢æ°ã®ãã¬ãŒã ãããå Žåã¯ãã©ããããŸãsuspender
ã®ç¶æ
ãäžæåæ¢ã«å€æŽããŸãonFulfilled
ããã³onRejected
ã䜿çšããŠresult.then(onFulfilled, onRejected)
ã®çµæãè¿ããŸããsuspender
ã®ç¶æ
ãäžæåæ¢ãããŠããããšãè¡šæããŸãïŒä¿èšŒããå¿
èŠããããŸãïŒsuspender
ã®ç¶æ
ãã¢ã¯ãã£ã[ caller'
]ã«å€æŽããŸããããã§ã caller'
ã¯onFulfilled
/ onRejected
ã®åŒã³åºãå
ã§ããonFulfilled
å Žåãæå®ãããå€ãexternref
ã«å€æãããããframes
è¿ããŸããonRejected
å ŽåãäŸå€åŠçããããŒã¶ã«ã®JS APIã«åŸã£ãŠãæå®ãããå€ãäŸå€ãšããŠframes
ãŸã§ã¹ããŒããŸããã ã£ãå Žåãé¢æ°ã¯äžæåæ¢å¯èœã§ã
suspendOnReturnedPromise
ã«ãã£ãŠè¿ããããreturnPromiseOnSuspend
ã«ãã£ãŠè¿ããããéèŠãªããšã«ã¯ãJavaScriptã§èšè¿°ãããæ©èœã¯ãã¡ã³ããŒããã®ãã£ãŒãããã¯ã«é©åããæžæ¿ãªãTC39ãšã³ãžã³ã®ä¿å®ããã®ãã£ãŒãããã¯ã«æºæ ããïŒäžèšã®æ°ãé€ããŠïŒãããã³ãã¹ãæ©èœæžæ¿ãããŠããŸããã
以äžã¯ããã®ææ¡ã®å®è£
æŠç¥ã§ãã
ããã¯ãã¹ã¿ãã¯ã¹ã€ããã³ã°ã®ãšã³ãžã³ãµããŒããåæãšããŠããŸãããã¡ããããããäž»ãªå®è£
äžã®èª²é¡ã§ãã
ã¹ã¿ãã¯ã«ã¯ããã¹ãïŒããã³JavaScriptïŒã¹ã¿ãã¯ãšWebAssemblyã¹ã¿ãã¯ã®2çš®é¡ããããŸãã ãã¹ãŠã®WebAssemblyã¹ã¿ãã¯ã«ã¯ã suspender
ãšãããµã¹ãã³ããŒãã£ãŒã«ãããããŸãã ãã¹ãŠã®ã¹ã¬ããã«ã¯ãã¹ãã¹ã¿ãã¯ããããŸãã
ãã¹ãŠã®Suspender
ã¯ã2ã€ã®ã¹ã¿ãã¯åç
§ãã£ãŒã«ãããããŸãã1ã€ã¯caller
ãšåŒã°ãããã1ã€ã¯suspended
ãšåŒã°ããŸãã
caller
ãã£ãŒã«ãã¯åŒã³åºãå
ã®ïŒäžæåæ¢ãããïŒã¹ã¿ãã¯ãåç
§ãã suspended
ãã£ãŒã«ãã¯nullã§ããsuspended
ãã£ãŒã«ãã¯çŸåšãµã¹ãã³ããŒã«é¢é£ä»ããããŠããïŒãµã¹ãã³ããããïŒWebAssemblyã¹ã¿ãã¯ãåç
§ãã caller
ãã£ãŒã«ãã¯nullã§ããsuspender.returnPromiseOnSuspend(func)(args)
ã¯ã«ãã£ãŠå®è£
ãããŸã
suspender.caller
ãšsuspended.suspended
ãnullã§ããããšã確èªããŸãïŒãã以å€ã®å Žåã¯ãã©ããããŸãïŒstack
ãsuspender
é¢é£ä»ããããæ°ããå²ãåœãŠãããWebAssemblyã¹ã¿ãã¯ãšããŸãstack
åãæ¿ããŠãåã®ã¹ã¿ãã¯ãsuspender.caller
ä¿åããŸãresult
ãfunc(args)
ïŒãŸãã¯ãã©ãããŸãã¯ã¹ããŒãããäŸå€ïŒã®çµæãšããŸããsuspender.caller
åãæ¿ããŠnullã«èšå®stack
解æŸããresult
è¿ãïŒãŸãã¯åã¹ããŒããïŒsuspender.suspendOnReturnedPromise(func)(args)
ã¯ã«ãã£ãŠå®è£
ãããŸã
func(args)
åŒã³åºãããã©ãããŸãã¯ã¹ããŒãããäŸå€ããã£ããããŸãresult
ãè¿ãããPromiseã§ãªãå Žåã result
è¿ãïŒãŸãã¯åã¹ããŒããïŒsuspender.caller
ãnullã§ãªãããšã確èªããŸãïŒãã以å€ã®å Žåã¯ãã©ããããŸãïŒstack
çŸåšã®ã¹ã¿ãã¯ãšããŸãstack
ã¯suspender
é¢é£ä»ããããWebAssemblyã¹ã¿ãã¯ã§ã¯ãããŸãããïŒstack
ãWebAssemblyã¹ã¿ãã¯ã§ããããšã確èªããŸãïŒãã以å€ã®å Žåã¯ãã©ããããŸãïŒstack
ãstack.suspender.caller
æŽæ°ããŸãsuspender.caller
ã«åãæ¿ããnullã«èšå®ããåã®ã¹ã¿ãã¯ãsuspender.suspended
æ ŒçŽããŸãonFulfilled
ããã³onRejected
ã䜿çšããŠresult.then(onFulfilled, onRejected)
ã®çµæãè¿ãsuspender.suspended
ã«åãæ¿ããnullã«èšå®ããåã®ã¹ã¿ãã¯ãsuspender.caller
æ ŒçŽããŸãonFulfilled
å Žåãæå®ãããå€ãexternref
ã«å€æããŠè¿ããŸãonRejected
å Žåãæå®ãããå€ãåã¹ããŒããŸããµã¹ãã³ãå¯èœãªé¢æ°ã®ãã¹ãé¢æ°ã
éåæé¢æ°/ãžã§ãã¬ãŒã¿ãŒïŒåæãŸãã¯éåæïŒãåä¿¡ããããããµã¹ãã³ãå¯èœãªé¢æ°ã«å€æããAPIãå ¬éããããšã¯å¯èœã§ããïŒ
ãããããããã€ãã®æ¬äŒŒã³ãŒããŸãã¯ãŠãŒã¹ã±ãŒã¹ã䜿çšããŠãããªããäœãæå³ããã®ããæ確ã«ã§ããŸããïŒ ç§ã¯ããªãã«æ£ç¢ºãªçããäžããããšã確èªããããšæããŸãã
Suspender
ãJSã®äžéšã«ãªããšããæå³ã§ããããããšãå¥ã®APIã§ããïŒ ããã¯wasmïŒ WebAssembly.Suspender
ïŒå°çšã§ããïŒ ãã®ææ¡ã¯TC39ã§è°è«ãããã¹ãã ãšç§ã«ã¯æããŸãã
ç¹ã«JSããã°ã©ã ã«åœ±é¿ãäžããããšãæå³ãããã®ã§ã¯ãããŸããã ããæ£ç¢ºã«ã¯ãJSé¢æ°ãäžæåæ¢ããããšãããšããã©ãããçºçããŸãã ããã確å®ã«ããããã«ãç§ãã¡ã¯ããã€ãã®åé¡ã«çŽé¢ããŸããã
ããããç§ã¯åœŒã®æèŠãåŸãããã«ã·ã¥ãŠãŠãšãããäžããããšãã§ããŸãã
ç³ãèš³ãããŸãããã @ chicoxyzzy ãStacksãµãã°ã«ãŒãããã®ã³ã³ããã¹ã/æŽæ°ãå«ããã®ãå¿ããããã§ãã å€ãã¹ã¿ãã¯åãæ¿ãã®ææ¡ã¯ãããªããäžæããã¹ã¿ãã¯å ã®JavaScript /ãã¹ããã¬ãŒã ããã£ããã£ããããšãã§ããã¯ããšããæåŸ ã§æžãããŠããŸããã ãã ããTC39ã®æ åœè ããã¯ãJSãšã³ã·ã¹ãã ã«å€§ããªåœ±é¿ãäžããããšãæžå¿µããããšãããã£ãŒãããã¯ãå¯ãããããã¹ãã®å®è£ è ããã¯ããã¹ãŠã®ãã¹ããã¬ãŒã ãåæ¢ã«èãããããšã¯éããªããšãããã£ãŒãããã¯ãå¯ããããŸããã ãã®ãããStacksãµãã°ã«ãŒãã¯ããã¶ã€ã³ãäžæãããã¹ã¿ãã¯å ã®WebAssemblyïŒé¢é£ïŒãã¬ãŒã ã®ã¿ããã£ããã£ããããšãä¿èšŒããŠããããã®ææ¡ã¯ãã®ç¹æ§ãæºãããŠããŸãã ãã®éèŠãªã¡ã¢ãå«ããããã«OPãæŽæ°ããŸããã
ããã§é²æ©ãèŠãã®ã¯çŽ æŽãããããšã§ãã Wasmã®ESMçµ±åã§ãããã©ã®ããã«äœ¿çšããããã®äŸã¯ãããŸããïŒ
æªããã¥ãŒã¹ã¯ãããã¯ãã¹ãŠJS APIã«ãããããESM wasmã¢ãžã¥ãŒã«ãåçŽã«ã€ã³ããŒãããŠãpromiseã®ãã®ã¹ã¿ãã¯ã¹ã€ããã³ã°ãµããŒããååŸããããšã¯ã§ããªããšããããšã§ãã 幞ããªããšã«ãäžéšã®JS ESMã¢ãžã¥ãŒã«ãæ¥çå€ãšããŠäœ¿çšããã ãã§ããã®APIã§ESMã¢ãžã¥ãŒã«ãåŒãç¶ã䜿çšã§ããŸãã
ç¹ã«ã foo-exports.js
ã foo-wasm.wasm
ãããã³foo-imports.js
3ã€ã®ESMã¢ãžã¥ãŒã«ãèšå®ããŸãã foo-imports.js
ã¢ãžã¥ãŒã«ã¯ãµã¹ãã³ããŒãäœæããããã䜿çšããŠfoo-wasm.wasm
ã«å¿
èŠãªãã¹ãŠã®ãéåæããããã¹çæã€ã³ããŒããã©ãããããµã¹ãã³ããŒãšãããã®ã€ã³ããŒãããšã¯ã¹ããŒãããŸãã 次ã«ã foo-wasm.wasm
ããã¹ãŠã®ãéåæãã€ã³ããŒããfoo-imports.js
ããã€ã³ããŒããããã¹ãŠã®ãåæãã€ã³ããŒããããããã®ã¢ãžã¥ãŒã«ããçŽæ¥ã€ã³ããŒãããŸãïŒãŸãã¯ããã¡ããã foo-imports.js
ä»ããŠãããã·ããããšãã§ããŸãã foo-exports.js
ã¯foo-imports.js
ãããµã¹ãã³ããŒãã€ã³ããŒããã foo-wasm.wasm
ã®ãšã¯ã¹ããŒããã€ã³ããŒããããµã¹ãã³ããŒã䜿çšããŠãéåæããšã¯ã¹ããŒããã©ããããŠãããïŒã©ãããããŠããªãïŒãåæãããšã¯ã¹ããŒãããŸãããšã¯ã¹ããŒããšã©ããããããéåæããšã¯ã¹ããŒãã 次ã«ãã¯ã©ã€ã¢ã³ãã¯foo-exports.js
ããã€ã³ããŒããã foo-wasm.wasm
ãŸãã¯foo-imports.js
çŽæ¥è§ŠããïŒãŸãã¯ç¥èãå¿
èŠã«ãªãïŒããšfoo-exports.js
ãããŸããã
ããã¯æ®å¿µãªããŒãã«ã§ãããã³ã¢wasmãå€æŽããªããšããå¶çŽãèãããšãéæã§ããæåã®æ¹æ³ã§ããã ãã ãããã®èšèšãææ¡æ¡åŒµã³ã¢wasmãšäžäœäºææ§ãããããšã確èªãããã®ææ¡ãåºè·ããããšãã«ãããã3ã€ã®ã¢ãžã¥ãŒã«ã1ã€ã®æ¡åŒµwasmã¢ãžã¥ãŒã«ã«äº€æã§ããæå³çã«èª°ãã§ããªãããã«ããããšãç®æããŠããŸããéããæããŠãã ããïŒã¢ãžã¥ããã¡ã€ã«ã®ååå€æŽïŒã
ããã¯ç解ã§ããŸãããããããŠããã¯ããªãã®ããŒãºã«åœ¹ç«ã€ãšæããŸããïŒåä»ã§ããïŒïŒ
å°ãªããšãWebAssembly.Moduleã¿ã€ãã®Wasmã€ã³ããŒãããŸã å¯èœã§ã¯ãªãéã¯ãã©ããã³ã°ã®å¿ èŠæ§ãç解ããŠããŸãïŒãããŠãããŸãããã°ããããŠã€ã³ããŒããããã§ãããïŒã
ããå ·äœçã«ã¯ãESMçµ±åã§ãããã®ãã¿ãŒã³ãè£ é£ŸããŠããµã¹ãã³ããŒæ¥çå€ã®äž¡åŽããã管çããããããäœå°ãããã®ã§ã¯ãªãããšèããŠããŸããã ããšãã°ããšã¯ã¹ããŒããããé¢æ°ãšã€ã³ããŒããããé¢æ°ããã€ããªåœ¢åŒã§ãªã³ã¯ããã¡ã¿ããŒã¿ãããå ŽåãESMçµ±åã¯ãããç §äŒããç¹å®ã®äºæž¬å¯èœãªã«ãŒã«ã«åºã¥ããŠãçµ±åã¬ã€ã€ãŒã®äžéšãšããŠå éšã§ãã¥ã¢ã«ã€ã³ããŒã/ãšã¯ã¹ããŒãã©ããã³ã°ãµã¹ãã³ããŒé¢æ°ãç §åã§ããŸãã
ããã çŸåšããã®ãããªèšç»ã¯ãããŸããã ç§ãåãåã£ããã£ãŒãããã¯ã¯ãESMçµ±åãå€æŽããããªããšããèŠæããã£ããšãããã®ã§ããã èŠããã«ãããããã¹ãŠãæçµçã«ã³ã¢wasmã§å¯èœã«ãªãããšãæåŸ ããŠããã®ã§ããã®ææ¡ã§ã¯å¯èœãªéãå°ããªãããããªã³ããæ®ããŠã»ãããšèããŠããŸãã
ç§ãåãåã£ããã£ãŒãããã¯ã¯ãESMçµ±åãå€æŽããããªããšããèŠæããã£ããšãããã®ã§ããã
ãã®ãã£ãŒãããã¯ãã©ãããæ¥ãŠããã®ã詳ãã説æã§ããŸããïŒ ESMçµ±åãããé«ãã¬ãã«ã®çµ±åã»ãã³ãã£ã¯ã¹ã§æ¡åŒµããäœå°ã¯ãããããããŸããç§ãæããŠããªãã¹ããŒã¹ã¯ååã«èª¿æ»ãããŠããã®ã§ããªããããåãäžããã®ã§ããã ç§ã¯éå»ã«ãã®åéãæ¹åããããšãžã®æµæã«ã€ããŠèããããšããããŸããã ãããç ç³æŒ¬ãã®é åãšèŠãªãããšã¯ãJSéçºè ãPromiseã®çŽæ¥ã€ã³ããŒã/ãšã¯ã¹ããŒããèš±å¯ããäžã§ã¡ãªããã«ãªãå¯èœæ§ããããŸãã
ãã®ææ¡ã¯ããµã€ã¯ã«å ã®åäžã®JSã¢ãžã¥ãŒã«ãWasmã¢ãžã¥ãŒã«ã®ã€ã³ããŒã¿ãŒãšã€ã³ããŒãã£ã®äž¡æ¹ã«ãªãèœåã劚ããããšã¯æ³šç®ã«å€ããŸããããã¯ãESMçµ±åã§ã®JSãµã€ã¯ã«é¢æ°ã®ãã€ã¹ãã®ãããã§ãçŸæç¹ã§ã¯é¢æ°ã®ã€ã³ããŒãã§æ©èœããŸãã ããã ããã€ã³ããŒããããé¢æ°ã®åšãã«SuspenderåŒã©ãããŒã䜿çšãããã®ãµã€ã¯ã«ãã€ã¹ãã¯ãµããŒããããŸããã
@lukewagnerãããã®å°è±¡ãåããŸããã ESMçµ±åãæ¡åŒµããäœå°ãããããšã«åæããŸãããããã«ã¯ïŒãããããªã³ãã®å°ããç®æšã®äžéšãšããŠïŒåé¿ããããšããŠããwasmãã¡ã€ã«ã®å€æŽ/æ¡åŒµãå¿ èŠã§ããããããã®ãããªå€æŽã¯å¿ èŠãããŸããã§ãã/ãã®ææ¡ã®äžéšãšãªãæ¡åŒµæ©èœã ãã¡ããããã®ãããªå€æŽ/æ¡åŒµãESMææ¡ã«è¿œå ãããå Žåããããã¯çæ³çã«ã¯ãã®ææ¡ãè£å®ããã®ã§ããã®ææ¡ãæäŸããæ©èœãååŸããããã«JSã©ãããŒã¢ãžã¥ãŒã«ã¯å¿ èŠãããŸããã
@ Jack-Worksã®ã³ã¡ã³ããèªã¿ééããŸãããäžèšã®ã³ã¡ã³ãã調æŽããŸãããã
æ確åããŠããã@RossTateã«æè¬ããŸããã¯ãããã¹ãçµ±åãéç¥ããããã«ããã€ããªèªäœã®ã¡ã¿ããŒã¿ãä»ããŠãããã®ã€ã³ããŒãããã³ãšã¯ã¹ããŒãã®äžæåæ¢ã³ã³ããã¹ãã«äžèŽããå¯èœæ§ãæ¢ãããšãææ¡ããŠããŸãããMVPã§ã¯æ±ºããŠãããæåŸ ããŠããŸããã ãŸããESMçµ±åã¯ãåºæ¬ã®JS APIãšã¯å¥ã«ãããäžè¬çã«ç ç³ã®æ©æµãåããå¯èœæ§ãããã¹ããŒã¹ã§ããããšãææããæ©äŒãå©çšããŠããŸãã
æ確ã«ããããã«ãç§ãææãã課é¡ã¯ã WebAssembly.instantiate()
ïŒãŸãã¯æ°ãããã©ã¡ãŒã¿ãŒãæã€WebAssembly.instantiate()
æ°ããããŒãžã§ã³ïŒã«è¿œå ãããªãã·ã§ã³ããesmãä»ããŠwasmãããŒãããããšãã«äœããã®åœ¢ã§è¡šç€ºãããå¿
èŠããããšããããšã§ãã-çµ±åãESMçµ±åã§ã¯ãããŸãã-çµ±åã¯äžå€ã§ããã
ããããã£ãããã®ã§ãå¿ èŠãçããå Žåã«åããŠãESMã«é¢ããŠç§ãæã£ãŠãããããæè»æ§ããããŸãã ç§ã®èª€è§£ãèšæ£ããŠãããŠããããšãã
ãšã¯ã¹ããŒããããç¹å®ã®Wasmé¢æ°ãPromiseããŒã¹ã®APIãšããŠJSã«è¡šç€ºããæ¹æ³ãæå®ããããã®ãããçš®ã®ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã«ã€ããŠè©±ããŠããããã§ããéã«ãWasmããã®ã€ã³ããŒããJSPromiseããŒã¹ã®APIããããçš®ã«å€æããæ¹æ³ãæå®ããããšãã§ããŸããã¹ã¿ãã¯ã¹ã€ããã³ã°ã®ã ç§ã¯æ£ããç解ããŠããŸããïŒ
ç§ã¯ãã®èãã奜ãã§ãã Wasm GC / JS-ESMçµ±åïŒãŸãã¯åãã»ã¯ã·ã§ã³ã®äžéšïŒã«é¡äŒŒããã«ã¹ã¿ã ã»ã¯ã·ã§ã³ãå¿ èŠã«ãªããšæããŸãã ãã®ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ãã©ã®çšåºŠã¯ãã¹ã©ã³ã²ãŒãžã§ãããã¯ããããŸããããã©ã¡ãã®å Žåããããããã€ã³ã¿ãŒãã§ã€ã¹ã¿ã€ããããå°ãæ®éçã§ã¯ãªããã³ã³ããŒãã³ãéã ãã§ãªãã³ã³ããŒãã³ãå ã§ã䜿çšãããåŸåããããŸãã
ãã®ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ã®åºæ¬çãªèšèšã説æããããçš®ã®èŠç¹ãŸãã¯READMEãæžããã人ã¯ããŸããïŒ
ããã¯å¯èœãªéžæè¢ã®ããã§ãã ãã£ãããããã«ãWebAssembly / gcïŒ203ãªã©ã®GCææ¡ã§ãåæ§ã®ãªãã·ã§ã³ãè°è«ãããŠããŸãã JSçµ±åã¯ãææ¥GCãµãã°ã«ãŒãã§è°è«ãããäºå®ã§ãããã®ããããã®è°è«ã®éããã®ææ¡ãšã®é¢é£ã®å¯èœæ§ã念é ã«çœ®ããŠãããšããã§ãããïŒãŸãã¯ãè°è«ã®é²ãæ¹ã«ãã£ãŠã¯ãç¡é¢ä¿ã§ããããšãå€æããå ŽåããããŸãïŒã