call_indirect
ã¯ãWebAssemblyã«ãšã£ãŠéåžžã«äŸ¿å©ãªæ©èœã§ãã ãã ããåœä»€ã®å¹çãšåªããåäœã¯ãwasmã®åã·ã¹ãã ã®åçŽãã«æé»ã®ãã¡ã«äŸåããŠããŸãã ç¹ã«ããã¹ãŠã®wasmå€ã«ã¯ããããå±ããïŒéçïŒã¿ã€ãã1ã€ã ããããŸãã ãã®ããããã£ã¯ãåä»ãèšèªã§ã®åãªãé¢æ°åŒã³åºãã«é¢ããå€ãã®æ¢ç¥ã®åé¡ã䟿å©ã«åé¿ããŸãã ããããwasmãæ°å€åãè¶
ããŠæ¡åŒµãããŠããä»ããããã®åé¡ãç解ãããããã念é ã«çœ®ãå¿
èŠããããšãããŸã§æ¥ãŠããŸãã
call_indirect
åºæ¬çã«ãåŒã³åºãå
ã®äºæ³ããã眲åãåŒã³åºãå
ã®å®çŸ©æžã¿ã®çœ²åãšæ¯èŒããããšã«ãã£ãŠæ©èœããŸãã æ°å€åã ãã®å ŽåãWebAssemblyã«ã¯ã察å¿ããfuncref
ã«ãã£ãŠåç
§ãããé¢æ°ãžã®çŽæ¥åŒã³åºãã§åãã§ãã¯ãè¡ãããå Žåã«ã®ã¿ããããã®ã·ã°ããã£ãçãããšããããããã£ããããŸããã ããããããã«çå®ã§ã¯ãªããªã2ã€ã®çç±ããããŸãã
call_indirect
ã䜿çšããŠã匱ããããªãã¯çœ²åã ãã§ãªãããã©ã€ããŒãå®çŸ©ã®çœ²åãæã€é¢æ°ã«ã¢ã¯ã»ã¹ã§ããããšãæå³ããŸãïŒçºèŠãããã°ããã§ããŸã è°è«ãããŠããªãåé¡ïŒãcall_indirect
ãæ£ããæ©èœããããã«ããããã«éèŠã§ãã æªæã®ããã¢ãžã¥ãŒã«ãç¥ã£ãŠããå Žåã¯ããã®ãšã¯ã¹ããŒããããã¿ã€ãã®å®çŸ©ãäœã§ãããã圌ãã䜿çšããããšãã§ããŸãcall_indirect
çç±ã«ãšã¯ã¹ããŒãã¿ã€ããšãã®æå³ããŒãªãç§å¯ã®å®çŸ©ã®éã§ååŸã«å€æããããã«ã call_indirect
ã䜿çšããŠããšã¯ã¹ããŒããããã¿ã€ãã«ãã£ãŠæœè±¡åãããããšãæå³ããã·ãŒã¯ã¬ããã«ã¢ã¯ã»ã¹ã§ãã call_indirect
ã䜿çšããŠãã§ãã£ããã£ãããŠããªãã»ãã¥ãªãã£ã¯ãªãã£ã«ã«ãªäžå€æ¡ä»¶ã«éåããå¯èœæ§ã®ãããšã¯ã¹ããŒããããã¿ã€ãã®å€ãåœé ã§ããŸããã¿ã€ãèªäœã®å®çŸ©ãäžèšã®äž¡æ¹ã®ç¶æ³ã§ã call_indirect
ã䜿çšããŠãã¢ãžã¥ãŒã«ã®ãšã¯ã¹ããŒãããã眲åã®æœè±¡åããã€ãã¹ã§ããŸãã ç§ãè¿°ã¹ãããã«ãwasmã«ã¯æ°å€åãããªãããããããŸã§ã®ãšããããã¯åé¡ã§ã¯ãããŸããã§ããã ãããŠåœåããµãã¿ã€ãã³ã°ã延æããããšã§ã call_indirect
ã«é¢ãããã¹ãŠã®æžå¿µãå¹æçã«å»¶æããããšæããŸããã ããããç§ãæè¿æ°ä»ããã®ã¯ããµãã¿ã€ããåé€ããããšã§ããæ°ãããã¿ã€ãïŒhttps://github.com/WebAssembly/reference-types/pull/87ã§externref
ãšããååïŒãäºå®äžä»£çšã§ãããšããããšã§ããæœè±¡åã€ã³ããŒãã®å Žåã ãããå®éã«äººã
ãæãã§ããããšã§ããå Žåãæ®å¿µãªããã call_indirect
ãšåã®ã€ã³ããŒãã®éã®äžèšã®çžäºäœçšãèæ
®ããå¿
èŠããããŸãã
call_indirect
ããŠäžèšã®åé¡ã«å¯ŸåŠããæ¹æ³ã¯ãããããããŸãããããããã«ãã¬ãŒããªãããããèšèšã¹ããŒã¹ã倧ããããŠããã«æ±ºå®ãäžãããšãã§ããŸããã ã§ããããç§ã¯ãã®åé¡ãä»ããã§è§£æ±ºããããšãææ¡ããŠããã®ã§ã¯ãããŸããã ããããçŸæç¹ã§äžããã決å®ã¯ã externref
ã«é¢ããŠåé¡ãé©åã«è§£æ±ºããããã®æéã賌å
¥ãããã©ããã§ãã ç¹ã«ãä»ã®ãšããcall_indirect
ãšfunc.ref
ããé¢é£ä»ãããã眲åãå®å
šã«æ°å€ã§ããå Žåã®ã¿ã€ããã§ãã¯ã®ã¿ã«å¶éããŠããå Žåã¯ãéæ¥åŒã³åºãã®ãã¹ãŠã®ã³ã¢ã¯ãºãŠãŒã¹ã±ãŒã¹ã«å¯Ÿå¿ããŸããåæã«ãäžèšã®åé¡ã«å¯Ÿãããã¹ãŠã®æœåšçãªè§£æ±ºçã®äœå°ãæ®ããŸãã ãã ãããã®å¶éãå®çšçã§ãããã©ããã¯ãå®è£
äœæ¥ã®èŠ³ç¹ãããã人ã
ãåŸ
ã£ãŠããexternref
ã®ã¢ããªã±ãŒã·ã§ã³ã劚ãããã©ããã®èŠ³ç¹ãããããããŸããã å¥ã®æ¹æ³ã¯ã call_indirect
ãšfunc.ref
ããã®ãŸãŸã«ããŠããããšã§ãã ããã¯ãå°éãããœãªã¥ãŒã·ã§ã³ã«ãã£ãŠã¯ã externref
ãTrue Typeã€ã³ããŒãã®ããã«ã€ã³ã¹ã¿ã³ã¹åã§ããªãå Žåãã externref
ãïŒç®èãªããšã«ïŒããã§ãªãå Žåãããããšãæå³ããŠããå¯èœæ§ããããŸããä»»æã®ã¹ãŒããŒã¿ã€ããæã€ããšãã§ããŸãïŒããšãã°ãæçµçã«anyref
ãè¿œå ããããšã«ããå Žåã anyref
ãµãã¿ã€ãã«ãªãããšãã§ããªãå¯èœæ§ããããŸãïŒã
ç§ã¯ãç§èªèº«ã®ããã«èšãã°ãäž¡æ¹ã®ãªãã·ã§ã³ã管çãããããšèããŠããŸãã ç§ã«ã¯å¥œã¿ã¯ãããŸãããã©ã¡ããäžæ¹ã«é²ããšãã決å®ã匷ãæŒãä»ããŠããããã§ã¯ãããŸãããååãªæ
å ±ã«åºã¥ãã決å®ãäžãããã«å¿
èŠãªæ
å ±ã«ããã¹ãŠã®äººãã¢ã¯ã»ã¹ãããããšæããŸãã 決å®ãäžãããããšãå
šå¡ã«ç¥ã£ãŠããããããšåæã«ã call_indirect
å
æ¬çãªåé¡ã®èªèã確ç«ãããã£ãã®ã§ãã äžèšã®èŠçŽãæäŸãããã®ããããã®åé¡ã®ããå®å
šãªèª¬æãå¿
èŠãªå Žåã¯ã以äžããèªã¿ãã ããã
call_indirect
察æœè±¡åã詳现call_indirect[ti*->to*](func, args)
ãšããè¡šèšã䜿çšããŸããããã§ã [ti*] -> [to*]
ã¯é¢æ°ã®äºæ³ããã眲åã§ããã func
ã¯åãªãfuncrefïŒfuncrefããŒãã«ãšã€ã³ããã¯ã¹ã§ã¯ãªãïŒã§ããã args
ã¯ãé¢æ°ã«æž¡ãto*
å€ã§ãã åæ§ã«ãåŒæ°args
ãæž¡ãã€ã³ããã¯ã¹$foo
ã䜿çšããŠé¢æ°ãçŽæ¥åŒã³åºãã«ã¯ã call($foo, args)
ã䜿çšããŸãã
ããã§ã $foo
ãã宣èšãããå
¥åã¿ã€ãti*
ãšåºåã¿ã€ãto*
ãæã€é¢æ°ã®ã€ã³ããã¯ã¹ã§ãããšä»®å®ããŸãã call_indirect[ti*->to*](ref.func($foo), args)
ã¯call($foo, args)
ãšåçã§ãããšæããããããããŸããã 確ãã«ãããã¯ä»ã®å Žåã§ãã ãããããã®æ¯ãèããç¶æã§ãããã©ããã¯æããã§ã¯ãããŸããã
call_indirect
ãšãµãã¿ã€ãã³ã°ãµãã¿ã€ãã³ã°ã®è°è«ã§ãæœåšçãªåé¡ã®1ã€ã®äŸãæµ®ãã³äžãããŸããã 次ã®ããã«ä»®å®ããŸãã
tsub
ã¯tsuper
ãµãã¿ã€ãã§ã[] -> [tsub]
å®çŸ©ãããé¢æ°$fsub
ããšã¯ã¹ããŒãããŸãã[] -> [tsuper]
é¢æ°$fsuper
ãã€ã³ããŒãããŸã$fsub
ã$fsuper
ãšããŠã€ã³ã¹ã¿ã³ã¹åãããã¢ãžã¥ãŒã«MBã§ãïŒããã¯é©åã§ããçŸåšã¯äžå¯èœã§ããããã®åé¡ã¯ä»åŸçºçããå¯èœæ§ããã§ãIBãcall_indirect[ -> tsuper](ref.func($fsuper))
å®è¡ããå Žåã«ã©ããªãããèããŠã¿ãŸãããã æã劥åœãšæããã2ã€ã®çµæã¯æ¬¡ã®ãšããã§ãã
çµæ1ãéžæããå Žåããããå¯èœã«ããããã«2ã€ã®ææ³ã®ãããããæ¡çšããå¿ èŠãããå¯èœæ§ãããããšãèªèããŠãã ããã
call_indirect
æ¯èŒããŸãããã¯ããã¯1ã奜ãå Žåã¯ãåä»ãé¢æ°åç
§ïŒããªã¢ã³ããµãã¿ã€ãã䜿çšïŒãè¿œå ãããšæ©èœããªãããšã«æ³šæããŠãã ããã ã€ãŸãã func.ref($fsub)
ã¯ref ([] -> [tsub])
ã§ããã ref ([] -> [tsuper])
ã§ããããŸããããã¯ããã¯1ã§ã¯call_indirect[ -> super](ref.func($fsub))
ããã©ãããããªãããã«ããã®ã«ååã§ã¯ãããŸããã ããã¯ãçµæ1ã«ã¯ãããã©ãŒãã³ã¹ãžã®åœ±é¿ã«é¢ããææ³2ãå¿
èŠã«ãªãå¯èœæ§ãé«ãããšãæå³ããŸãã
ããã§ã¯ãçµæ2ã«ã€ããŠããå°ãèããŠã¿ãŸãããã ããã§ã®å®è£
ææ³ã¯ãIBã®call_indirect
ã®äºæ³ããã眲åããIAã®$fsub
ã®å®çŸ©ã®çœ²åãšçãããã©ããã確èªããããšã§ãã æåããã®ææ³ã®äž»ãªæ¬ ç¹ã¯ãå®å
šã«å®è¡ã§ããå€æ°ã®åŒã³åºãããã©ããããããšã§ããããã«æããããããããŸããã ãã ãããã1ã€ã®æ¬ ç¹ã¯ãIAã®ã»ãã¥ãªãã£ãªãŒã¯ãçºçããå¯èœæ§ãããããšã§ãã
æ¹æ³ã確èªããããã«ãäŸãå°ãåãæ¿ããŠãã€ã³ã¹ã¿ã³ã¹IAãå
éšã§$fsub
ãã¿ã€ã[] -> [tsub]
ãæã€ããã«å®çŸ©ããŠããããã€ã³ã¹ã¿ã³ã¹IAã¯ã¿ã€ã[] -> [tsuper]
ã®ã¿ãšã¯ã¹ããŒããããšããŸãã çµæ2ã®ææ³ã䜿çšãããšãã€ã³ã¹ã¿ã³ã¹IBã¯ïŒæªæãæã£ãŠïŒ call_indirect[ -> tsub]($fsuper)
ãå®è¡ã§ããåŒã³åºãã¯æåããŸãã ã€ãŸããIBã¯call_indirect
ã䜿çšããŠãIAããã®é¢æ°ã®ã·ã°ããã£ã«å¯ŸããŠè¡ã£ããããŒã€ã³ã°ãåé¿ã§ããŸãã ãããããããã¯IBãIAã®çœ²åã«ãã£ãŠä¿èšŒãããŠããªãIAã®åŽé¢ã«äŸåããŠããããšãæå³ããŸãã ææªã®å ŽåãIBã¯ããã䜿çšããŠãIAãæå³çã«é èœããŠããå¯èœæ§ã®ããå
éšç¶æ
ã«ã¢ã¯ã»ã¹ã§ããŸãã
call_indirect
ãšã¿ã€ãã®ã€ã³ããŒã次ã«ããµãã¿ã€ããèã«çœ®ããŠãåã®ã€ã³ããŒãã«ã€ããŠèããŠã¿ãŸãããã 䟿å®äžãåç §åã®ã€ã³ããŒãã ãã§ãªããåã®ã€ã³ããŒãã«ã€ããŠã説æããŸããããã®è©³çŽ°ã¯éèŠã§ã¯ãããŸããã ããã§å®è¡ããŠããäŸã§ã¯ã次ã®ããã«æ³å®ããŸãã
capability
ãå®çŸ©ããã¿ã€ãããšã¯ã¹ããŒãããŸã$handle
ãšããŠãšã¯ã¹ããŒãããŸããã[capability] -> []
å®çŸ©ãããŠããããã¿ã€ã[$handle] -> []
ãšã¯ã¹ããŒããããé¢æ°$do_stuff
ããšã¯ã¹ããŒãããŸãã$extern
ãšé¢æ°$run
ãã¿ã€ã[$extern] -> []
ã€ã³ããŒãããŸãã$handle
ã$extern
ãIAã®ãšã¯ã¹ããŒãããã$do_stuff
ã$run
ãšããŠã€ã³ã¹ã¿ã³ã¹åãããã¢ãžã¥ãŒã«MDã§ãããã®äŸã§èšå®ãããŠããã®ã¯2ã€ã®ã¢ãžã¥ãŒã«ã§ãäžæ¹ã®ã¢ãžã¥ãŒã«ãä»æ¹ã®ã¢ãžã¥ãŒã«ã®å€ãç¥ããªãããŸãã¯ç¥ãããšãèš±å¯ãããŠããªãç¶æ ã§åŠçãè¡ããŸãã ããšãã°ããã®ãã¿ãŒã³ã¯ãWASIãšå¯Ÿè©±ããããã®èšç»ãããåºç€ã§ãã
ããã§ãã€ã³ã¹ã¿ã³ã¹IDãã¿ã€ã$extern
å€e
ãååŸãã call_indirect[$extern -> ](ref.func($run), e)
ãå®è¡ãããšããŸãã æã劥åœãšæããã2ã€ã®çµæã¯æ¬¡ã®ãšããã§ãã
çµæ2ã¯ãã€ã³ããŒããããã¿ã€ãã§ã¯call_indirect
ã»ãšãã©åœ¹ã«ç«ããªããã®ã«ããŸãã ãããã£ãŠãçµæ1ã®å Žåãå
¥åã¿ã€ã$extern
ã¯$do_stuff
ã®å®çŸ©æžã¿å
¥åã¿ã€ãã§ã¯ãªãããšã«æ³šæããŠãã ããïŒä»£ããã«capability
ïŒããããã£ãŠã次ã®ããããã䜿çšããå¿
èŠããããŸãããã®ã®ã£ãããåããããã®2ã€ã®ãã¯ããã¯ïŒ
call_indirect
æ¯èŒããŸãã$extern
ãcapability
è¡šãããšãèªèããŠãã ããããã¯ããã¯1ã奜ãå Žåã¯ãåä»ãé¢æ°åç §ãè¿œå ãããšãåã³æ©èœããªãããšã«æ³šæããŠãã ããã ïŒåºæ¬çãªçç±ã¯ãµãã¿ã€ãã®å Žåãšåãã§ãããããã§ã¢ããã°ã説æããã«ã¯ããã«å€ãã®ããã¹ããå¿ èŠã«ãªããŸããïŒ
ããã¯ç§ãã¡ã«ãã¯ããã¯2ãæ®ããŸããæ®å¿µãªãããããããŸãæœåšçãªã»ãã¥ãªãã£åé¡ãæ瀺ããŸãã çç±ãç解ããããã«ãIDãæªæããããICãç§å¯ã«ããŠãã$handle
ã®å
容ãååŸããããšããŸãã ããã«ãIDã$handle
å®éã«äœãè¡šããŠããããã€ãŸãcapability
ã«ã€ããŠé©åãªæšæž¬ãããŠãããšä»®å®ããŸãã IDã¯ãã¿ã€ã[capability] -> [capability]
ã®æçé¢æ°$id_capability
ãå®çŸ©ã§ããŸãã ã¿ã€ã$extern
å€e
ãäžãããããšãIDã¯call_indirect[$extern -> capability](ref.func($id_capability), e)
å®è¡ã§ããŸãã ææ³2ã䜿çšãããšã $extern
ã¯å®è¡æã«capability
ãè¡šããIDã¯e
è¡šãçã®capability
ãååŸããããããã®éæ¥åŒã³åºãã¯æåããŸãã åæ§ã«ãã¿ã€ãcapability
å€c
ãäžãããããšãIDã¯call_indirect[capability -> $extern](ref.func($id_capability), c)
ãå®è¡ããŠã c
ã$extern
ã«åœé ã§ããŸãã
ããŸãããã°ã call_indirect
ã¯ãããã©ãŒãã³ã¹ãã»ãã³ãã£ãã¯ãã»ãã¥ãªãã£/æœè±¡åã®éèŠãªåé¡ãããã€ãããããšãæããã«ããŸãããããã¯ãWebAssemblyããããŸã§åé¿ã§ãã幞éãªåé¡ã§ãã æ®å¿µãªããã call_indirect
ã¯ã³ã¢WebAssemblyã®äžéšã§ããããããããã®åé¡ã¯é²è¡äžã®å€ãã®ææ¡ã暪æããŸãã çŸæç¹ã§ã¯ãç§ã¯ããã¯æã
ãå¶éãããã©ããã決å®ããå¿
èŠãå«ç·ã®ãããªææ¡ãåç
§åãã«çŠç¹ãåœãŠãã®ããã¹ãã ãšæãcall_indirect
ãšãfunc.ref
ã®ããã®å¯äžnow â call_indirect
å
æ¬çãªåé¡ãæçµçã«è§£æ±ºããæ¹æ³ã«ãã£ãŠã¯ãç·©åã§ããå¯èœæ§ã®ããå¶éã
ïŒé·ãæçš¿ã§ç³ãèš³ãããŸãããã¢ãžã¥ãŒã«éã®ã³ã³ãã€ã«æã®ã¿ã€ãã³ã°ãšå®è¡æã®ã¿ã€ãã³ã°æ©èœã®è€éãªçžäºäœçšã説æãããããã®çžäºäœçšã®éèŠæ§ãã§ããã ãç°¡æœã«ç€ºãããã«æåãå°œãããŸãããïŒ
ãã®è©³çŽ°ãªèšäºãããããšãããã¹ïŒ å°ããªè³ªåããããŸããã call_indirect
ãšã¿ã€ãã®ã€ã³ããŒããã»ã¯ã·ã§ã³ã«ã次ã®ããã«èšè¿°ããŸãã
ãã¯ããã¯1ã奜ãå Žåã¯ãåä»ãé¢æ°åç §ãè¿œå ãããšãåã³æ©èœããªãããšã«æ³šæããŠãã ããã
ããã¯ãåä»ãé¢æ°åç §ã«ããªã¢ã³ããµãã¿ã€ããè¿œå ããå Žåã«ã®ã¿åé¡ãçºçãããšãããåã®ã»ã¯ã·ã§ã³ã®èŠåã®å¯Ÿè±¡ã«ããªããŸããïŒ
ããã§ã¯ãªãã ãµãã¿ã€ãã»ã¯ã·ã§ã³ã®ãã¹ãŠã®åé¡ã¯ã¿ã€ãã€ã³ããŒãããç¬ç«ããŠãããã¿ã€ãã€ã³ããŒãã»ã¯ã·ã§ã³ã®ãã¹ãŠã®åé¡ã¯ãµãã¿ã€ãããç¬ç«ããŠããŸãã ããªããå°ããŠããç¹å®ã®åé¡ã«é¢ããŠãã¿ã€ãref ([] -> [capability])
ã®å€ã¯ããšã¯ã¹ããŒããããé¢æ°ã«ãã£ãŠã¿ã€ãref ([] -> [$handle])
å€ãšããŠè¿ãããå¯èœæ§ããããããã次ã®ããã«å€æã§ããããšãèæ
®ããŠãã ããã funcref
ããã³éæ¥çã«åŒã³åºãããŸãã ãšã¯ã¹ããŒããããé¢æ°ãšã¯ç°ãªãããã®å€ã®èŠç¹ã®å€æŽã¯ãªã³ã¯æã§ã¯ãªãå®è¡æã«çºçããŸãããããã£ãŠãé¢æ°åç
§èªäœãã€ã³ããŒããããããšããªããããã€ã³ããŒãã·ã°ããã£ãšæ¯èŒããŠè§£æ±ºããããšã¯ã§ããŸããã
module instance IC defines a type capability and exports the type but not its definition as $handle
ããã¯ã©ã®ããã«æ©èœããŸããïŒ ICããããåŠçããæ¹æ³ãç¥ãããšãã§ããããã«ã capability
ãš$handle
ãæ¥ç¶ããäœããå¿
èŠã§ããïŒ
ãŸãã httpsïŒ//github.com/WebAssembly/proposal-type-imports/blob/master/proposals/type-imports/Overview.md#exportsã«åºã¥ããŠãã€ã³ããŒããããåã¯å®å
šã«æœè±¡çã§ãã ãããã£ãŠã $capability
ããšã¯ã¹ããŒãããããšããŠããããã¯æœè±¡çã§ãã ããããç§ã¯äœãã誀解ããŠããŸãã
module instance IC exports a function $do_stuff that was defined with type [capability] -> [] but exported with type [$handle] -> []
ã®ãšã¯ã¹ããŒãã«é¢ããåæ§ã®è³ªåã
ããã«äœ¿çšãããããçš®ã®ãµãã¿ã€ãé¢ä¿ãæ³åããããšãã§ããŸããããšãã°ã $capability <: $handle
å Žåã export $capability as $handle
ã§ãã ãããããã®ã»ã¯ã·ã§ã³ã®åé ã§ã¯ããµãã¿ã€ãã³ã°ãèã«çœ®ãããšãèšåãããŠããã®ã§ãç§ã¯ãããèã«çœ®ããŠããŸã...ããããç§ã¯ããã«ã€ããŠããå°ãèããŸããïŒ
$capability <: $handle
å Žåã export $capability as $handle
ã¯å¯èœã§ãããé¢æ°ã¯åŒæ°ã§åå€ã§ããããã export ([$capability] -> []) as ([$handle] -> [])
ã¯ã倱æãããã¯ãã§ãã
ã¿ã€ããšã¯ã¹ããŒãã§ã¯ãã¢ãžã¥ãŒã«ã¯type $handle; func $do_stuff_export : [$handle] -> []
ããã«çœ²åãæå®ãã次ã«type $handle := capability; func $do_stuff_export := $do_stuff
ããã«çœ²åãã€ã³ã¹ã¿ã³ã¹åããŸãã ïŒç¹å®ã®æ§æã¯å®å
šã«ç¡èŠããŠãã ãããïŒæ¬¡ã«ãã¿ã€ããã§ãã«ãŒã¯ã $handle
capability
ããã®ã¢ãžã¥ãŒã«ã®func $do_stuff_export := $do_stuff
ã¯ãã®ã¢ãžã¥ãŒã«ã§æå¹ã§ããïŒãããã§ãã¯ããŸãã $do_stuff
ã®ã¿ã€ãã¯[capability] -> []
ã§ããããã $handle
ãcapability
ã§ã€ã³ã¹ã¿ã³ã¹åããåŸããã®çœ²åã¯$do_stuff_export
眲åãšæ£ç¢ºã«äžèŽããŸãããã§ãã¯ã¯æåããŸãã ïŒããã§ã¯ãµãã¿ã€ãã¯å«ãŸãããå€æ°çœ®æã®ã¿ãå«ãŸããŸããïŒ
ãã ãã眲åèªäœã¯$handle
ã«ã€ããŠã¯äœãè¿°ã¹ãŠããªãããšã«æ³šæããŠãã ããã ããã¯ãä»ã®ãã¹ãŠã®äººã$handle
ãæœè±¡åãšããŠæ±ãããšã«ãªã£ãŠããããšãæå³ããŸãã ã€ãŸãã眲åã¯ã¢ãžã¥ãŒã«ã®å®è£
ã®è©³çŽ°ãæå³çã«æœè±¡åããä»ã®ãã¹ãŠã®äººã¯ãã®æœè±¡åãå°éããããšã«ãªã£ãŠããŸãã ãã®åé¡ã®ç®çã¯ã call_indirect
ã䜿çšããŠãã®æœè±¡åãåé¿ã§ããããšã説æããããšã§ãã
ããŸãããã°ãããã¯åé¡ãå°ãæ確ã«ããŸãïŒ
ãããã§ãããã¯ç©äºãæ確ã«ããŸãã ãµãã¿ã€ãã³ã°ã»ã¯ã·ã§ã³ã«ã€ããŠè³ªåããããŸãïŒãžã£ã³ãããŠç³ãèš³ãããŸããïŒïŒ
call_indirect
ãå®çŸ©çœ²åã§ã¯ãªãã€ã³ããŒã眲åãšæ¯èŒãããããšã«ãããIBãcall_indirect[ -> tsuper](ref.func($fsuper))
ãå®è¡ããŠæåãããã·ããªãªã«åŸããŸãã
ãããŠãããªãã¯ãããè¿œå ããŸããïŒåä»ãé¢æ°åç §ã®ããã«ïŒç§ãã¡ãå¿ èŠã§ã
- æåŸ ãããã·ã°ããã£ãšå®çŸ©ã·ã°ããã£ã®ãµãã¿ã€ãã®äºææ§ã«ã€ããŠãå°ãªããšãç·åœ¢æéã®å®è¡æãã§ãã¯ãå®è¡ããŸãã
ããã¯ãæåŸ ããã眲åãšã€ã³ããŒã眲åãã®éã®äºææ§ã§ããå¿ èŠããããŸããïŒ call_indirectãäœæãããšæ³å®ããŠãããããã€ã³ããŒã眲åãšæåŸ ããã眲åãæ¯èŒããŸãã
æåŸ
ããããã®ãšã€ã³ããŒãããããã®ã®éã§äºææ§ããã§ãã¯ãããå ŽåãåŸã§call_indirect[ -> tsub]($fsuper)
ã¯å€±æããã¯ãã§ãã
ãã¯ããã¯1ãš2ã¯ããã®éæ¥çãªåŒã³åºããæ©èœãããããã®2ã€ã®çŽäº€ããæ¹æ³ãšããŠæäŸãããŠããŸãã æ®å¿µãªããããã¯ããã¯1ã¯åä»ãé¢æ°åç §ãšäºææ§ããªãããã¯ããã¯2ã¯é«ãããå¯èœæ§ããããŸãã ãããã£ãŠããããã¯ã©ã¡ããããŸããããªãããã§ãã ãããã£ãŠããã®ã»ã¯ã·ã§ã³ã®æ®ãã®éšåã§ã¯ããããã®ã©ã¡ãã䜿çšãããæåŸ ããã眲åãšå®çŸ©ããã眲åã®åçŽãªåçæ§ã®æ¯èŒã«åºå·ããå Žåã«äœãèµ·ããããæ€èšããŸãã æ··ä¹±ãããŠç³ãèš³ãããŸãã; èšç»ãããã»ãã³ãã£ã¯ã¹ããªããšããããšã¯ã3ã€ã®æœåšçãªã»ãã³ãã£ã¯ã¹ã«ã€ããŠè°è«ããå¿ èŠãããããšãæå³ããŸãã
ããŸãã«ãå€ãã®çµè«ã«ãžã£ã³ãããªãããã«æ³šæããŠãã ããã ;ïŒ
ç§ã®ä»®å®ã§ã¯ã call_indirect
ã¯ä»æ¥ãšåãéããç¶æããå¿
èŠããããããèšèªã«ãµãã¿ã€ãããããè¿œå ããŠããåã®åçæ§ãã¹ãã®ã¿ãå¿
èŠã«ãªããŸãã åæã«ãã©ã³ã¿ã€ã ãã§ãã¯ã¯éçåã·ã¹ãã ãšäžè²«ããŠããå¿
èŠããããŸããã€ãŸãããµãã¿ã€ãã®é¢ä¿ãå°éããå¿
èŠããããŸãã
call_indirect
䜿çšã§ããåãåžžã«ãµãã¿ã€ãéå±€ã®ãªãŒãã«ããããšã確èªããéãããããã®äžèŠççŸããèŠä»¶ã¯å®éã«ã¯ããªãç°¡åã«èª¿æŽã§ããŸãã
ãããå®æœããããã®ç¢ºç«ãããæ¹æ³ã®1ã€ã¯ãåã·ã¹ãã ã«_exact_åã®æŠå¿µãå°å
¥ããããšã§ãã æ£ç¢ºãªåã«ã¯ãµãã¿ã€ãã¯ãªããã¹ãŒããŒã¿ã€ãã®ã¿ãããã (exact T) <: T
ãŸãã
ããã«ããã call_indirect
ã®ã¿ãŒã²ããã¿ã€ããæ£ç¢ºãªã¿ã€ãã«ããå¿
èŠããããŸãã ããã«ãé¢æ°èªäœã®ã¿ã€ãã¯åœç¶ããã®é¢æ°ã®æ£ç¢ºãªã¿ã€ãã§ãã
ã¢ãžã¥ãŒã«ã¯ãæå³ãããã©ã³ã¿ã€ã ãã§ãã¯ã«æåããé¢æ°ã§ã®ã¿ã€ã³ã¹ã¿ã³ã¹åã§ããããšã確èªãããå Žåã¯ãé¢æ°ã®ã€ã³ããŒãã§æ£ç¢ºãªåãèŠæ±ããããšãã§ããŸãã
æ£èŠåãããé¢æ°åã§ã®åçŽãªãã€ã³ã¿ãŒæ¯èŒã®çŸåšã®å®è£ ææ³ãåŒãç¶ãæå¹ã§ããããšã確èªããããã«å¿ èŠãªã®ã¯ãããã ãã§ãã ããã¯ãä»ã«ã©ã®ãããªãµãã¿ã€ãã³ã°ããããããŸãã¯é¢æ°ã®ãµãã¿ã€ãã³ã°ãã©ãã»ã©åã£ããã®ã«ããããšã¯ç¡é¢ä¿ã§ãã ïŒFWIWãç§ã¯ãã°ããåã«ã«ãŒã¯ãšããã«ã€ããŠè©±ãåããPRãäœæããããšãèšç»ããŸãããããµãã¿ã€ãã³ã°ã¹ããŒãªãŒãžã®ä¿çäžã®å€æŽãããã³çŸåšã©ã®ææ¡ã«ç§»è¡ãããã§ãããã¯ãããŸãããïŒ
ïŒ1ã€ã®æ¬ ç¹ã¯ãé¢æ°å®çŸ©ããµãã¿ã€ãã«çµã蟌ãããšã¯ãå°ãªããšããã®æ£ç¢ºãªã¿ã€ããã©ããã§äœ¿çšãããŠããå Žåã¯ãäžè¬çã«äžäœäºææ§ã®ããå€æŽã§ã¯ãªããªãããšã§ãããããããã®æ¬ ç¹ã¯ãã©ã®ããã«æ£ç¢ºã«é©çšãããã«é¢ä¿ãªããå¶çŽã®äžã§ã¯é¿ããããŸããã圌ããïŒ
ããã€ãã®åŽé¢ïŒ
å¥ã®æ¹æ³ã¯ãcall_indirectãšfunc.refããã®ãŸãŸã«ããŠããããšã§ãã
AFAICSãåç
§åãå«ãé¢æ°ã§ref.funcãçŠæ¢ããããšã¯çŸå®çã§ã¯ãããŸããã ããã¯ãå€ãã®ãŠãŒã¹ã±ãŒã¹ãã€ãŸãexternref
åäœãããã¡ãŒã¹ãã¯ã©ã¹ã®é¢æ°ïŒã³ãŒã«ããã¯ãããã¯ãªã©ïŒã«é¢é£ãããã¹ãŠã®ãã®ãã²ã©ãæãªãããšã«ãªããŸãã
ããã¯ãå°éãããœãªã¥ãŒã·ã§ã³ã«ãã£ãŠã¯ãexternrefãTrue Typeã€ã³ããŒãã®ããã«ã€ã³ã¹ã¿ã³ã¹åã§ããªãå ŽåããexternrefãïŒç®èãªããšã«ïŒã¹ãŒããŒã¿ã€ããæã€ããšãã§ããªãå Žåãããããšãæå³ããå¯èœæ§ããããŸãïŒããšãã°ãæçµçã«anyrefãè¿œå ããããšã«ããå Žåã¯ãanyrefã®ãµãã¿ã€ãã«ãªãããšãã§ããŸãïŒã
詳现ãæããŠããã ããŸããïŒ æ¥ç¶ã衚瀺ãããŸããã
ããŸãã«ãå€ãã®çµè«ã«ãžã£ã³ãããªãããã«æ³šæããŠãã ããã ;ïŒ
ããªããã©ã®ãããªçµè«ãæããŠããã®ãããããŸããã ç§ãè¿°ã¹ãçµè«ã¯ã call_indirect
ãèªèããŠããå¿
èŠããããèšç»ãéå§ããå¿
èŠã®ããåé¡ãããã€ããããšããããšã§ãã ããªãã¯è§£æ±ºçãèããŠããã®ã§ããããã®åé¡ã¯éèŠã§ã¯ãªããšç€ºåããŠããããã§ãã ãããããã®è§£æ±ºçã¯CGã«ãã£ãŠã¬ãã¥ãŒãŸãã¯æ¿èªãããŠããªããããæ¿èªããããŸã§èšç»ãç«ãŠãã¹ãã§ã¯ãããŸããã 解決çã®è©äŸ¡ãšæ¯èŒã«ã¯æéããããããããã®è©äŸ¡ãšæ¯èŒãé©åã«è¡ãåã«æ±ºå®ãäžãå¿
èŠããããããç¹ã«è§£æ±ºçã«ã€ããŠè©±ãåããªãããã«èŠæ±ããŸããã ãããããã®åé¡ã解決ããããšããèªèã人ã
ã圢æããã®ãé²ãããã®çµæãå·®ãè¿«ã£ã決å®ãåé¿ããããã«ãç§ã¯ããªãã®è§£æ±ºçã«ã€ããŠè¿
éã«è°è«ããããã«å°ãæéãããããŸãã
ãããå®æœããããã®ç¢ºç«ãããæ¹æ³ã®1ã€ã¯ãåã·ã¹ãã ã«æ£ç¢ºãªåã®æŠå¿µãå°å ¥ããããšã§ãã
æ£ç¢ºãªã¿ã€ãã¯ã確ç«ããããœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸããã ã©ã¡ãããšããã°ãæ£ç¢ºãªã¿ã€ãã¯ããã®æ¯æè ããŸã 察åŠããããšããŠããåé¡ã確ç«ããŠããŸãã èå³æ·±ãããšã«ãããã«ïŒããªããããŠããææ¡ã¯ãããã€ãã®åé¡ã解決ããããšãã§ããããæ£ç¢ºãªãã©ãŒã ã®çš®é¡æŽ»åããŒã ããšããšã®ãããã¹ã¬ããã§ããããã®åŸã圌ãã¯æçµçã«[å®çŸïŒhttps://github.com/microsoft/TypeScript/issues/12936 ïŒissuecomment-284590083ïŒæ£ç¢ºãªã¿ã€ãã¯ã解決ãããããå€ãã®åé¡ãåŒãèµ·ãããŸããã ïŒã³ã³ããã¹ãã«é¢ãã泚æïŒãã®è°è«ã¯ãå®éã«ã¯ïŒçè«çãªæå³ã§ïŒæ£ç¢ºãªã¿ã€ãã®åœ¢åŒã§ã¯ãªãããã¬ãã£ãã¯ã¹ãµãã¿ã€ãã®ãªããžã§ã¯ãã¢ããã°ãåã«èš±å¯ããªãFlowã®æ£ç¢ºãªãªããžã§ã¯ãã¿ã€ãã«ãã£ãŠä¿ãããŸãããïŒç§ãã¡ã¯ãã®ã¹ã¬ãããåçããããšãæ³åã§ããŸããããã
ãããã®çš®é¡ã®åé¡ãWebAssemblyã§ã©ã®ããã«çºçãããã瀺ãäŸãšããŠããµãã¿ã€ãã³ã°ã延æããªãã£ããšããŸãã ref.null
ã¿ã€ãexact nullref
ãæ£ç¢ºãªã¿ã€ãã䜿çšãããšexact nullref
ã¯exact anyref
ãµãã¿ã€ãã§ã¯ãããŸããã å®éãæ£ç¢ºãªåã®éåžžã®ã»ãã³ãã£ã¯ã¹ã«ããã°ãå€ã®å®è¡æåãæ£ç¢ºã«anyref
ããå¯èœæ§ãäœãããã exact anyref
å±ããå€ã¯ãªãå¯èœæ§ãcall_indirect
ã¯anyref
ã®éå®å
šã«äœ¿çšã§ããªããªããŸãã
æ£ç¢ºãªã¿ã€ãã®ããã€ãã®ç°ãªãããŒãžã§ã³ã念é ã«çœ®ããŠãããããããŸãããããã®ç°ãªãããŒãžã§ã³ãæ£ç¢ºãªã¿ã€ãã«é¢ããå€ãã®æªè§£æ±ºã®åé¡ã«äœããã®åœ¢ã§å¯ŸåŠããŠããããšã確èªããã«ã¯æéãããããŸãã ãã®ãœãªã¥ãŒã·ã§ã³ãæããããã«ãããã¯ãããã解決çã§ããããšã¯æããã§ã¯ãªãããšãèªèãããã®æåŸ ããŠææ決å®ãããªãããšã§ã¯ãªããããã§ç§ã®ãã€ã³ãã¯ããã
詳现ãæããŠããã ããŸããïŒ æ¥ç¶ã衚瀺ãããŸããã
ããªãã¯é·ãæãåç
§ããŠããŸãã ãã®ã©ã®éšåã«ã€ããŠè©³ãã説æããŠã»ããã§ããïŒ 1ã€ã®æšæž¬ã§ã¯ã call_indirect
ãšã¿ã€ãã®ã€ã³ããŒãã«é¢ããå
šäœçãªåé¡ãèŠéããŠããå¯èœæ§ããããŸãã ããªãã®æ£ç¢ºãªã¿ã€ãã®ææ¡ã¯ãµãã¿ã€ãã®åé¡ã«ã®ã¿å¯ŸåŠããŸããã call_indirect
ã¯ãµãã¿ã€ãããªããŠãåé¡ãããããšãäžèšã§ç¢ºç«ããŸããã
ããã¯ãå€ãã®ãŠãŒã¹ã±ãŒã¹ãã€ãŸã
externref
åäœãããã¡ãŒã¹ãã¯ã©ã¹ã®é¢æ°ïŒã³ãŒã«ããã¯ãããã¯ãªã©ïŒã«é¢é£ãããã¹ãŠã®ãã®ãã²ã©ãæãªãããšã«ãªããŸãã
ãããããã¯ç§ããã£ãšæ
å ±ãåŸãããšæã£ãŠãããã®ã§ãã ç§ã®ç解ã§ã¯ã call_indirect
ã®äž»ãªäœ¿çšäŸã¯ãC / C ++é¢æ°ãã€ã³ã¿ãŒãšC ++ä»®æ³ã¡ãœããããµããŒãããããšã§ãã ç§ã®ç解ã§ã¯ããã®ãŠãŒã¹ã±ãŒã¹ã¯çŸåšãæ°å€çœ²åã«å¶éãããŠããŸãã call_indirect
ã®ããå€ãã®æœåšçãªäœ¿çšæ³ãç¥ã£ãŠããŸãããç§ãè¿°ã¹ãããã«ãäžæçãªå¶éãææ¡ããŠããã®ã§ãéèŠãªã®ã¯call_indirect
ã®çŸåšã®äœ¿çšæ³ã§ãã call_indirect
ã¯ãåãªãfuncref
ã§ã¯ãªããããŒãã«ãšã€ã³ããã¯ã¹ãå¿
èŠã§ããããšãèãããšãã³ãŒã«ããã¯ããµããŒãããããã«ç¹ã«é©åã«èšèšãããŠããããã«ã¯èŠããŸããã çŸåšãã®ç®çã§äœ¿çšãããŠããªããããã©ããã¯ããããŸããã§ããã
ãã®æ©èœã察象ãšããã³ãŒãããŒã¹ã¯ç§ãããã¯ããã«ããç¥ã£ãŠããã®ã§ããã®æ©èœãå¿ èŠãšããå®éã®ããã°ã©ã ãç¥ã£ãŠããå Žåã¯ãããã§å¿ èŠãªäœ¿çšãã¿ãŒã³ã®äŸãããã€ãæäŸãããšéåžžã«åœ¹ç«ã¡ãŸãã ãã®æ©èœãä»ãããµããŒãããå¿ èŠããããã©ãããå€æããã®ã«åœ¹ç«ã€ã ãã§ãªããæ©èœãä»å¿ èŠãªå Žåããããã®äŸã¯ãäžèšã®åé¡ã«å¯ŸåŠããªããããã®æ©èœãè¿ éã«æäŸããæåã®æ¹æ³ãéç¥ããã®ã«åœ¹ç«ã¡ãŸãã
@RossTate ïŒ
ã©ã¡ãããšããã°ãæ£ç¢ºãªã¿ã€ãã¯ããã®æ¯æè ããŸã 察åŠããããšããŠããåé¡ã確ç«ããŠããŸãã èå³æ·±ãããšã«ãTypeScriptããŒã ã¯ãææ¡ããŠãããã©ãŒã ã®æ£ç¢ºãªã¿ã€ããããã€ãã®åé¡ãã©ã®ããã«è§£æ±ºã§ããããæåã«èŠãã¹ã¬ããã§ãããæçµçã«ãæ£ç¢ºãªã¿ã€ãã解決ãããããå€ãã®åé¡ãåŒãèµ·ããããšã«æ°ä»ããŸããã ïŒã³ã³ããã¹ãã«é¢ãã泚æïŒãã®è°è«ã¯ãå®éã«ã¯ïŒçè«çãªæå³ã§ïŒæ£ç¢ºãªã¿ã€ãã®åœ¢åŒã§ã¯ãªãããã¬ãã£ãã¯ã¹ãµãã¿ã€ãã®ãªããžã§ã¯ãã¢ããã°ãåã«èš±å¯ããªãFlowã®æ£ç¢ºãªãªããžã§ã¯ãã¿ã€ãã«ãã£ãŠä¿ãããŸãããïŒç§ãã¡ã¯ãã®ã¹ã¬ãããåçããããšãæ³åã§ããŸããããã
ããã§ã¯æ¬åŒ§ãéèŠã§ãã ãã®ã¹ã¬ããã§åœŒããæ£ç¢ºã«äœãèããŠããã®ãã¯ããããŸããããåãããšã§ã¯ãªãããã§ãã ãã以å€ã®å Žåããã¿ã€ãT & U
ã¯åžžã«T
ã«å²ãåœãŠå¯èœã§ãããšæ³å®ãããŸããã T
ãæ£ç¢ºãªã¿ã€ãã§ããå Žåãããã¯å€±æããŸããã®ãããªã¹ããŒãã¡ã³ãã¯æå³ããããŸããïŒããã¯æå³ããããŸããã T & U
ãç¡å¹ãŸãã¯ããã ã«ãªãããã倱æããŸãïŒã ä»ã®è³ªåã¯äž»ã«èªçšè«ã«é¢ãããã®ã§ããã€ãŸããããã°ã©ããŒãïŒãªããžã§ã¯ãã«å¯ŸããŠïŒããããã©ãã§äœ¿çšãããããšããããšã§ãããããã¯ç§ãã¡ã®å Žåã«ã¯åœãŠã¯ãŸããŸããã
äœã¬ãã«ã®åã·ã¹ãã ã®å Žåãããªãèªèº«ã®è«æã®ããã€ãã§ãããæ£ç¢ºãªåã¯éèŠãªèŠçŽ ã§ã¯ãããŸããã§ãããïŒ
ãããã®çš®é¡ã®åé¡ãWebAssemblyã§ã©ã®ããã«çºçãããã瀺ãäŸãšããŠããµãã¿ã€ãã³ã°ã延æããªãã£ããšããŸãã ref.nullã®ã¿ã€ãã¯ãæ£ç¢ºãªã¿ã€ãã䜿çšããæ£ç¢ºãªnullrefã«ãªããŸãã ãã ããæ£ç¢ºãªnullrefã¯ãæ£ç¢ºãªanyrefã®ãµãã¿ã€ãã«ã¯ãªããŸããã
ããã§æèŠã®çžéã¯ãããŸããã ãµãã¿ã€ããæããªãããšãæ£ç¢ºãªã¿ã€ãã®ç®çã§ãã
å®éãæ£ç¢ºãªåã®éåžžã®ã»ãã³ãã£ã¯ã¹ã«ããã°ãå€ã®å®è¡æåãæ£ç¢ºã«anyrefã§ããå¯èœæ§ãäœããããæ£ç¢ºãªanyrefã«å±ããå€ã¯ãªãå¯èœæ§ããããŸãã
ããã§ããanyrefã®å¯äžã®ç®çãã¹ãŒããŒã¿ã€ãã§ããããšãèãããšã (exact anyref)
ã®çµã¿åããã¯æçšãªã¿ã€ãã§ã¯ãããŸããã ãããããªããããåé¡ãªã®ã§ããïŒ
ããã«ãããcall_indirectã¯anyrefã«å¯ŸããŠå®å šã«äœ¿çšã§ããªããªããŸãã
ããªãã¯ä»ã¬ãã«ãæ··ä¹±ãããŠããªããšç¢ºä¿¡ããŠããŸããïŒ é¢æ°å(exact (func ... -> anyref))
ã¯å®å
šã«äŸ¿å©ã§ãã ããšãã°ã (func ... -> (ref $T))
ã¿ã€ããšã¯äºææ§ããããŸããã ã€ãŸãã exact
ã¯ãé¢æ°åã®éèŠãªãµãã¿ã€ããé²ããŸãã ãããããããèŠç¹ã§ãïŒ
ãã¶ãããªãã¯(exact (func ... -> anyref))
ãš(func ... -> exact anyref)
ãŸããïŒ ãããã¯ç¡é¢ä¿ãªã¿ã€ãã§ãã
æ£ç¢ºãªã¿ã€ãã®ææ¡ã¯ãµãã¿ã€ãã®åé¡ã«ã®ã¿å¯ŸåŠããŸãããcall_indirectã«ã¯ãµãã¿ã€ãããªããŠãåé¡ãããããšãäžèšã§ç¢ºç«ããŸããã
æœè±¡ããŒã¿åãå®çŸ©ããæ段ãšããŠãå®çŸ©ãªãã§åããšã¯ã¹ããŒãã§ãããšã©ããããããæ³å®ããŠããŸãã æããã«ããã®ã¢ãããŒãã¯åçåãã£ã¹ãïŒcall_indirectãŸãã¯ãã®ä»ïŒã®ååšäžã§ã¯æ©èœããŸããã ãã®ãããMLã¹ã¿ã€ã«ã®åæœè±¡åã§ã¯ãªããnewtypeã¹ã¿ã€ã«ã®åæœè±¡åãå¿ èŠã«ãªããšç§ã¯èšãç¶ããŠããŸãã
ç§ã®ç解ã§ã¯ãcall_indirectã®äž»ãªäœ¿çšäŸã¯ãC / C ++é¢æ°ãã€ã³ã¿ãŒããµããŒãããããšã§ãã
ã¯ãããã ããææ¡ãããå¶éã«å«ãããããããã¯ç§ãèšåããref.func
ã®å¯äžã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ãããŸããïŒããããäžå¿
èŠã«ããã§ããïŒïŒã ç¹ã«ãã¿ã€ããã§ãã¯ãå«ãŸãªãcall_ref
ããããŸãã
æœè±¡ããŒã¿åãå®çŸ©ããæ段ãšããŠãå®çŸ©ãªãã§åããšã¯ã¹ããŒãã§ãããšã©ããããããæ³å®ããŠããŸãã æããã«ããã®ã¢ãããŒãã¯åçåãã£ã¹ãïŒcall_indirectãŸãã¯ãã®ä»ïŒã®ååšäžã§ã¯æ©èœããŸããã ãã®ãããMLã¹ã¿ã€ã«ã®åæœè±¡åã§ã¯ãªããnewtypeã¹ã¿ã€ã«ã®åæœè±¡åãå¿ èŠã«ãªããšç§ã¯èšãç¶ããŠããŸãã
ããŠãããªãã¯æ£ç¢ºãªåãcall_indirect
ãšåã®ã€ã³ããŒãã®åé¡ã«å¯ŸåŠããããã«äœãããªãããšã«åæããŠããããã§ãã ããããå®è¡æã®ãã£ã¹ããåå ã§ãšã«ããåé¡ã«ãªãããããã®åé¡ã«å¯ŸåŠããæå³ããªããšãèšã£ãŠããŸãã ãã®åé¡ãé²ãç°¡åãªæ¹æ³ããããŸããæœè±¡åã«å¯ŸããŠå®è¡æã®ãã£ã¹ããå®è¡ã§ããªãããã«ããŸãïŒæœè±¡åããã£ã¹ãå¯èœã§ãããšæ瀺çã«æå®ããŠããå Žåãé€ãïŒã çµå±ãäžéæïŒOPAQUEïŒåãªã®ã§ããã£ã¹ãã«å¿
èŠãªæ§é ãæã£ãŠãããšã¯æããŸããã ãããã£ãŠãæ£ç¢ºãªåããµãã¿ã€ãã³ã°ã®åé¡ã«å¯ŸåŠããå¯èœæ§ããããšããŠããåé¡ã®æ®ãã®ååãç¡èŠããã®ã¯ææå°æ©ã§ãã
ç§ãèšã£ãããã«ããã¹ãŠã®ãœãªã¥ãŒã·ã§ã³ã«ã¯ãã¬ãŒããªãããããŸãã ããªãã¯ãããªãã®ãœãªã¥ãŒã·ã§ã³ã«ã¯ããªãèªèº«ãç¹å®ãããã¬ãŒããªããããªããšæšæž¬ããŠããããã§ãããCGã¯ä»ã®ãœãªã¥ãŒã·ã§ã³ãããããªãã®ãœãªã¥ãŒã·ã§ã³ã奜ããšæšæž¬ããŠããããã§ãã ç§ãããã®åé¡ã«å¯Ÿããæœåšçãªè§£æ±ºçãæã£ãŠããŸãã äžå®æéã®ãã§ãã¯ãä¿èšŒããä»®æ³ãã·ã³ã§ãã§ã«äœ¿çšãããŠãããã¯ãããžãŒã«åºã¥ããŠãããããã§ã®ãã¹ãŠã®åé¡ã«å¯ŸåŠãïŒç§ã¯ä¿¡ããŠããŸãïŒãæ°ããã¿ã€ããè¿œå ããå¿ èŠã¯ãªããå®éã«æ¢ç¥ã®ã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠWebAssemblyã«æ©èœãè¿œå ããŸãã ããããç§ã¯ãããç§ãæåŸ ããããã«æ©èœãããšã¯æããŸããããããªããä»ã®äººããããèŠãæ©äŒããªãã£ãã®ã§ãç§ã¯ããã€ãã®æ¬ ç¹ãèŠéããŠããŸããã ãŸããCGã代æ¿ãªãã·ã§ã³ã®ãã¬ãŒããªãããããã¬ãŒããªãã奜ããšã¯æããŸããã 代ããã«ãç§ã ãã§ãªãCGããã®åé暪æçãªãããã¯ã«ã€ããŠååãªæ å ±ã«åºã¥ãã決å®ãäžããããã«ããªãã·ã§ã³ãåæããæéãäžããããã«äœãã§ããããèããããšããŠããŸãã
ç¹ã«ãã¿ã€ããã§ãã¯ãå«ãŸãªã
call_ref
ããããŸãã
ããªãã®æã®ããŒã¯ãŒãã¯æå¿ã§ãã ç§ã¯ã人ã
ããµããŒãããããšæãã§call_indirect
ã¢ããªã±ãŒã·ã§ã³ãããããšãååã«æ¿ç¥ããŠããŸãã ãããŠãç§ãã¡ã¯ãã®ãµããŒãã¯ãäžèšã®æ©èœãšã¢ãã¬ã¹ã®åé¡ãšãããã¶ã€ã³ãèãåºãããšãæåŸ
ããŠããŸãã ããããç§ãèšã£ãããã«ãçæ³çã«ã¯ããããã®åœ±é¿ã調æ»ããæ©äŒãåŸãåã«ã暪æçãªåœ±é¿ã䌎ãæ©èœãè¿
éã«åºè·ããªãããã«ããã®èšèšãéçºããæéããããŸãã ã ããç§ã®è³ªåã¯ãä»ãã®æ©èœãå¿
èŠãšããäž»èŠãªããã°ã©ã ããããã©ããã§ãã ããå Žåã¯ã仮説ãç«ãŠãå¿
èŠã¯ãããŸããã ããã€ããæããŠãçŸåšãã®æ©èœã«ã©ã®ããã«äŸåããŠãããã説æããŠãã ããã
æœè±¡ããŒã¿åãå®çŸ©ããæ段ãšããŠãå®çŸ©ãªãã§åããšã¯ã¹ããŒãã§ãããšã©ããããããæ³å®ããŠããŸãã æããã«ããã®ã¢ãããŒãã¯åçåãã£ã¹ãïŒcall_indirectãŸãã¯ãã®ä»ïŒã®ååšäžã§ã¯æ©èœããŸããã ãã®ãããMLã¹ã¿ã€ã«ã®åæœè±¡åã§ã¯ãªããnewtypeã¹ã¿ã€ã«ã®åæœè±¡åãå¿ èŠã«ãªããšç§ã¯èšãç¶ããŠããŸãã
ããã¯ç§ã«ã¯æ ¹æ¬çãªåé¡ã®ããã«æããŸãã ãšã¯ã¹ããŒããããã¿ã€ãã®å®çŸ©ã®æ©å¯æ§ãæå¹ã«ããããšã¯ãã¿ã€ãã€ã³ããŒãææ¡ã®ç®æšã§ããïŒ ç§ã¯@RossTateã¯ãããç®æšãšãã¹ããšèããŠããããšãããã®ã¹ã¬ããããåéã@rossbergã¯ããããçŸåšã®ç®æšã§ã¯ãªããšèããŠããŸãã ãœãªã¥ãŒã·ã§ã³ã«ã€ããŠèª¬æããåã«ããã®è³ªåã«ã€ããŠè©±ãåããåæããŠããã¹ãŠã®äººãåãäžé£ã®ä»®å®ããäœæ¥ã§ããããã«ããŸãã
@RossTate ïŒ
ããŠãããªãã¯æ£ç¢ºãªåãcall_indirectãšåã®ã€ã³ããŒãã®åé¡ã«å¯ŸåŠããããã«äœãããªãããšã«åæããŠããããã§ãã
ã¯ãããããæœè±¡ããŒã¿åãå®çŸ©ããããã®æ©èœãè¿œå ããæ¹æ³ã®åé¡ãæå³ããå Žåã¯ããã§ãã åã®æœè±¡åãäžè²«ããŠæ©èœããæ¹æ³ã¯ããã€ããããŸããããã®ãããªæ©èœã¯ããã«å ã«ãããŸãã
ããªãã®æã®ããŒã¯ãŒãã¯æå¿ã§ãã ç§ã¯ã人ã ããµããŒãããããšæãã§ãããéæ°å€åã®call_indirectã®ã¢ããªã±ãŒã·ã§ã³ãããããšãååã«æ¿ç¥ããŠããŸãã
call_ref
åœä»€ã¯ãé¢æ°refã®ææ¡ã«å«ãŸããŠããããããããã«ãããæœåšçãªæœè±¡ããŒã¿åã¡ã«ããºã ã®åã«ããªãè¿ããã®ã«ãªã£ãŠããŸãã ãããŸã§ä¿çã«ããããšãææ¡ããŠããŸããïŒ
@tlively ïŒ
ãšã¯ã¹ããŒããããã¿ã€ãã®å®çŸ©ã®æ©å¯æ§ãæå¹ã«ããããšã¯ãã¿ã€ãã€ã³ããŒãææ¡ã®ç®æšã§ããïŒ ç§ã¯@RossTateã¯ãããç®æšãšãã¹ããšèããŠããããšãããã®ã¹ã¬ããããåéã@rossbergã¯ããããçŸåšã®ç®æšã§ã¯ãªããšèããŠããŸãã
ããã¯ç®æšã§ãããæœè±¡ããŒã¿åã¡ã«ããºã ã¯å¥ã®æ©èœã§ãã ãããŠããã®ãããªã¡ã«ããºã ã¯ãèŒžå ¥åã®èšèšã«åœ±é¿ãäžããªãããã«èšèšãããªããã°ãªããŸããã ãããããªããç§ãã¡ã¯ãããéåžžã«ééã£ãŠè¡ãã§ããã-æœè±¡åã¯äœ¿çšãµã€ãã§ã¯ãªãå®çŸ©ãµã€ãã§ä¿èšŒãããªããã°ãªããŸããã 幞ããªããšã«ãããã¯ãã±ããç§åŠã§ã¯ãªãããã¶ã€ã³ã¹ããŒã¹ã¯ããªãããæŽåãããŠããŸãã
ããããšãã @ rossberg ãããã¯çã«ããªã£ãŠããŸãã åã®ã€ã³ããŒããšãšã¯ã¹ããŒãã®åŸã«ãã©ããŒã¢ããææ¡ã«æœè±¡åããªããã£ããè¿œå ããããšã¯ç§ã«ã¯åé¡ãªãããã«æããŸããããããã©ã®ããã«è¡ãäºå®ãã«ã€ããŠã®è©³çŽ°ãè¿ããã¡ã«æžãçããããšãã§ããã°çŽ æŽããããšæããŸãã åã®ã€ã³ããŒããšãšã¯ã¹ããŒãã®èšèšã¯ãæœè±¡åã®ã€ã³ããŒããšãšã¯ã¹ããŒãã®èšèšãå¶çŽããŠéç¥ãããããåæèšèšãå®æãããåã«ãæœè±¡åãå°æ¥ã©ã®ããã«æ©èœããããããç解ããŠããããšãéèŠã§ãã
ãã®èšç»ã®è©³çŽ°ã«å ããŠã call_indirect
ã«é¢ãããã®åé¡ã¯ãå·®ãè¿«ã£ã決å®ã«åœ±é¿ãäžããããšã瀺ããŠããã®ã§ãæœè±¡åããã£ã¹ãå¯èœã«ãã¹ãã§ã¯ãªããšããç§ã®ææ¡ãæåŠããŠããããã«èŠããçç±ã説æã§ããŸããïŒãã£ã¹ãå¯èœã«æ瀺çã«å¶çŽãããŠããªãéãïŒ ïŒïŒ ãããã¯äžéæã§ãããããææ¡ã¯æœè±¡åã®äžè¬çãªæ
£è¡ã«æ²¿ã£ãŠããããã§ãã
@tlively ãã¯ããåæããŸããã ããã«å ããŠãç§ããã°ããã®éæžãã€ããã ã£ãä»ã®ããŸããŸãªããšã ïŒ69ããã®ãã¹ãŠã®ãã©ãŒã«ã¢ãŠããåŠçãããå®è¡ããŸãã ;ïŒ
@RossTate ãããã¯ãæœè±¡ããŒã¿åããã£ã¹ããšäºææ§ã
@rossbergããªããèããŠãããã®äžå¿çãªãŠãŒã¹ã±ãŒã¹ãäœã§ããããæ確ã«ã§ããŸããïŒ ããªãã®äŸã解éããäžã§ã®ç§ã®æåã®æšæž¬ã¯ç°¡åã«è§£æ±ºã§ããŸãããããããããªãã¯äœãä»ã®ãã®ãæå³ããŸãã
@RossTate ãããªã¢ãŒãã£ãã¯é¢æ°ãæ€èšããŠãã ããã Wasm-genericsãé€ããŠãanyrefããã®ã¢ãã/ããŠã³ãã£ã¹ãã䜿çšããŠã³ã³ãã€ã«ããå Žåãå¥ã®ãªããžã§ã¯ãã«äœåã«ã©ããããããšãªããä»ã®æœè±¡åã®å€ã§ãããã䜿çšã§ããã¯ãã§ãã éåžžãæœè±¡åã®å€ãä»ã®å€ãšåãããã«åŠçã§ããããã«ããå¿ èŠããããŸãã
ããŠãããªã¢ãŒãã£ãã¯é¢æ°ãèããŠã¿ãŸããããã€ã³ããŒããããåãHandle
ãããšä»®å®ããŸãããã
CHandle
æå®ããŸãã ãã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã«ã¯ãã¿ã€ãHandle
ïŒwasmã¬ãã«ã®ïŒã¡ã³ããŒãšãããŸããŸãªã¯ã©ã¹ããã³ã€ã³ã¿ãŒãã§ã€ã¹ã¡ãœããã®å®è£
ãžã®é¢æ°ãã€ã³ã¿ãŒãæäŸããvããŒãã«ããããŸãã è¡šé¢ã¬ãã«ã®ããªã¢ãŒãã£ãã¯é¢æ°ïŒwasmã¬ãã«ã§ã¯ãªããžã§ã¯ãã®é¢æ°ïŒã«æå®ãããšãã¢ãžã¥ãŒã«ã¯ä»ã®ã¯ã©ã¹ãžã®ãã£ã¹ãã«äœ¿çšããã®ãšåãã¡ã«ããºã ã䜿çšããŠCHandle
ã«ãã£ã¹ãã§ããŸããHandle
ïŒwasmã¬ãã«ã®ïŒã¡ã³ããŒãæã€ä»£æ°çããŒã¿åãŸãã¯ã¬ã³ãŒãåTHandle
ãæå®ããå¯èœæ§ããããŸãã ãã®ããªã¢ãŒãã£ãã¯é¢æ°ã¯ãä»ã®ä»£æ°çããŒã¿åãŸãã¯ã¬ã³ãŒãåãšåãããã«ãOCamlå€ãTHandle
ãã£ã¹ãããŸããèšãæãããšãã¢ãžã¥ãŒã«ã¯ããªã¢ãŒãã£ãã¯é¢æ°ãªã©ãå®è£
ããããã«ãµãŒãã§ã¹ã¬ãã«ã®å€ãã©ã®ããã«è¡šããããã«ã€ããŠã®èŠç¯ã«äŸåããŠãããHandleã®ãããªæœè±¡ã€ã³ããŒãåã¯ãããã®èŠç¯ãæºãããªããããå€ã®ã©ããã¯é¿ããããŸããã ããã¯ã anyref
ã®å
ã®ã¢ããªã±ãŒã·ã§ã³ã®1ã€ãã€ã³ã¿ãŒãã§ã€ã¹ã¿ã€ãã«çœ®ãæããããã®ãšåãçç±ã§ãã ãŸããããªã¢ãŒãã£ãã¯é¢æ°ããµããŒãããããã«anyref
ãå¿
èŠã§ã¯ãªããé©åã§ããªãããšã瀺ãã±ãŒã¹ã¹ã¿ãã£ãéçºããŸããã
äžæ¹ããã£ã¹ãå¯èœãªanyref
ã䜿çšããŠãéçãªæœè±¡åã¡ã«ããºã ãåé¿ã§ããããšã瀺ããŸããã ããªããã»ã®ããããæœè±¡åã¡ã«ããºã ã®èšç»ã¯ãåçãªæœè±¡åã¡ã«ããºã ãéããŠãã®åé¡ã«ããããåœãŠãè©Šã¿ã§ãã ããããåçãªæœè±¡åã¡ã«ããºã ã«ã¯å€ãã®åé¡ããããŸãã ããšãã°ã i31ref
ã¿ã€ããæœè±¡çãªHandle
i31ref
ã¿ã€ããšããŠãšã¯ã¹ããŒãããã«ã¯ãä»ã®ã¢ãžã¥ãŒã«ãanyref
ããã³ãã«ãåœé ããããã«ãã£ã¹ããããªã¹ã¯ããããŸãïŒæ©èœãªã©ïŒã 代ããã«ãæšæºã®éçæœè±¡åãä¿èšŒããã ãã§ã¯äžèŠãªè¿œå ã®ããŒããšãªãŒããŒããããé£ã³è¶ããå¿
èŠããããŸãã
ãŸããïŒç§ãæãã«ïŒæ£ç¢ºãªåãã©ã®ããã«äœ¿çšããã€ããããããããã£ãã®ã§ãããªãã®æå³ã¯ã call_indirect
ãšãµãã¿ã€ãã§æ³šæãåèµ·ãã2ã€ã®äž»èŠãªåé¡ã®ã©ã¡ãã«ã察åŠããŠããªãããšã«æ°ä»ããŸããã
call_indirect
ãµãã¿ã€ãã³ã°ãå°éããã®ã«åœ¹ç«ã¡ãŸããïŒããã¯ãã§ã«æ瀺çã«èšã£ãŠãããšæããŸãïŒcall_indirect
ã䜿çšããŠããšã¯ã¹ããŒãããã眲åã§ã¯ãªããå®çŸ©ããã眲åã§ãšã¯ã¹ããŒããããé¢æ°ã䜿çšããããšã劚ããŸããããããã£ãŠãããã¯è§£æ±ºãã¹ãç°¡åãªåé¡ã§ã¯ãããŸããã ãã®ãããæéã®å¶çŽãèãããšãé©åã«è§£æ±ºããããã®æéãäžããæ¹æ³ã®è©äŸ¡ã«çŠç¹ãåœãŠãããšæããŸãã anyref
ãéçãªæœè±¡åãæšãŠã䟡å€ããããã©ããã«ã€ããŠãæåã«è°è«ããå¿
èŠã¯ãªããšæããŸãã ããã¯ãç©äºãããã«é
ãããªãããã«é¿ããããšæã£ãŠããäžçš®ã®å€§ããªè°è«ã§ãã
äžæ¹ããã£ã¹ã¿ãã«anyrefã䜿çšããŠéçæœè±¡åã¡ã«ããºã ãåé¿ã§ããããšã瀺ããŸããã
éçåã®æœè±¡åã¯ãåçåãã£ã¹ãã䜿çšããèšèªã§ã¯äžååã§ãã éçæœè±¡åã¯ãã©ã¡ããªã·ãã£ã«äŸåããŠããããã£ã¹ãã¯ãããç Žãããã§ãã ããã«ã€ããŠæ°ããããšã¯äœããããŸãããããã«ã€ããŠã®è«æãæžãããŠããŸãã ãã®ãããªç¶æ³ã§ã¯ãä»ã®æœè±¡åã¡ã«ããºã ãå¿ èŠã§ãã
æœè±¡åã®äœ¿çšãå¶éããããšã«ãã£ãŠãããåé¿ããããšãããšããã®ç®çãç¡å¹ã«ãªããŸãã WASIã®ãŠãŒã¹ã±ãŒã¹ãèããŠã¿ãŸãããã WASIã¢ãžã¥ãŒã«ãšããããšã¯ã¹ããŒãããã¿ã€ãããã¹ãã«ãã£ãŠå®è£ ãããŠãããWasmã«å®è£ ãããŠãããã¯é¢ä¿ãããŸããã ãŠãŒã¶ãŒå®çŸ©ã®æœè±¡åãä»»æã«å¶éãããšãWasmå®è£ ã¯äžè¬ã«ãã¹ãå®è£ ãšäºææ§ããªããªããŸãã
- call_indirectããµãã¿ã€ãã³ã°ãå°éããã®ã«åœ¹ç«ã¡ãŸããïŒãã§ã«æ瀺çã«èšã£ãŠãããšæããŸãïŒ
ã¯ïŒ ããã¯ãµãã¿ã€ãã³ã°ã«ãŒã«ã®äžéšã§ãããããå®çŸ©äžãåæ§ã§ãã
- call_indirectã䜿çšããŠããšã¯ã¹ããŒããããã·ã°ããã£ã§ã¯ãªããå®çŸ©ãããã·ã°ããã£ã§ãšã¯ã¹ããŒããããé¢æ°ã䜿çšããããšã劚ããŸããã
ç§ã¯ããã¯èšããªãã£ãã ããã¯call_indirectèªäœã®åé¡ã§ã¯ãªãããã£ã¹ãã®ããèšèªã«é©ããåæœè±¡åã¡ã«ããºã ãéžæããããšã®åé¡ã ãšèšããŸããã
äœè«ã§ãããOCamlïŒãŸãã¯åæ§ã®èšèªïŒãã³ã³ãã€ã«ããããã«ããªã¢ã³ãã¿ã€ãã®å°å ¥ãå¿ èŠã«ãªãçç±ã¯ãããŸããã çè«çã«ã¯ããããããã«éãå¯èœæ§ããããšããŠãïŒçŸåšã®äžä»£ã®ãšã³ãžã³ã®å Žåã¯ããã§ã¯ãªãå¯èœæ§ãé«ãã§ãããéã®å¯èœæ§ãé«ãã§ãïŒãããªã¢ã³ãã¿ã€ãã¯é倧ãªåé¡ã§ãããMVPã«ã¯å¿ èŠãããŸããã ææå°æ©ã®è€éãã«å¯Ÿããããªãã®æ¬²æ±ãå®å šã«ã¯å ±æããŠããŸããã ;ïŒ
é¢æ°ã®å¹³çæ§ïŒHaskellãSMLãªã©ãããããµããŒãããŠããªãèšèªããããããé¢æ°åç §ããçŽæ¥æ©æµãåããå¯èœæ§ããããŸãã OCamlã¯æ§é çãªåçæ§ãã¹ããŒããç©ççãªãã®ã«å¯ŸããŠå®è£ å®çŸ©ã®åäœãæ瀺çã«æã£ãŠããŸãã ãããåžžã«falseãè¿ãããšãèš±å¯ããããé¢æ°ãã¹ããŒããããšãèš±å¯ãããã©ããã¯éãããŸãŸã§ãããå®éã«ã¯ã©ã¡ãã§ãååã§ãããã³ã¹ãã®ãããäœåãªã©ããã³ã°ãè¡ãåã«èª¿æ»ãã䟡å€ããããŸãã
[ã¡ã¿ã³ã¡ã³ããšããŠãè¬çŸ©ãæ§ããã«ããŠãããããããã¯æèœãªäººã ã®ã»ãããã·ã³ã°ã«ãã³ã§ã¯ãªããè³ã®çè·¡ã以åã«æã é©çšãããäžçã§ãããšããèããæ€èšããŠããã ããã°å¹žãã§ãã]
ã¡ã¿ã³ã¡ã³ããšããŠãè¬çŸ©ãããŒã³ããŠã³ããŠããã ããã°å¹žãã§ãã
èããã
ãããŠãããããããã¯ããããæèœãªäººã ã®ã»ãããã·ã³ã°ã«ãã³ã§ã¯ãªããè³ã®çè·¡ã以åã«æã é©çšãããäžçã§ãããšããèããèæ ®ããŸããã
ããã§ã®ç§ã®ã¢ããã€ã¹ã¯ãè€æ°ã®å°é家ãšã®åè°ã«åºã¥ããŠããŸãã
éçåã®æœè±¡åã¯ãåçåãã£ã¹ãã䜿çšããèšèªã§ã¯äžååã§ãã éçæœè±¡åã¯ãã©ã¡ããªã·ãã£ã«äŸåããŠããããã£ã¹ãã¯ãããç Žãããã§ãã ããã«ã€ããŠæ°ããããšã¯äœããããŸãããããã«ã€ããŠã®è«æãæžãããŠããŸãã ãã®ãããªç¶æ³ã§ã¯ãä»ã®æœè±¡åã¡ã«ããºã ãå¿ èŠã§ãã
ç§ãçžè«ãããããã®å°é家ã«ã¯ãããã€ãã®è«æã®èè ãå«ãŸããŠããŸãã
ããŠãç§ã圌ãã®ã¢ããã€ã¹ãæ£ããçµ±åããããšã確èªããè©Šã¿ãšããŠãç§ã¯ãã®ãããã¯ã«ã€ããŠãããŸã§è°è«ããããšã®ãªããããã€ãã®è«æã®å¥ã®èè ã«é»åã¡ãŒã«ãéããŸããã ãããç§ãå°ãããã®ã§ãïŒ
ããªã¢ãŒãã£ãã¯é¢æ°fããããšããŸãã
ïŒ...ïŒã ç§ã®åä»ãèšèªã«ã¯ãïŒå å«çïŒãµãã¿ã€ãã³ã°ãšæ瀺çãªãã£ã¹ãããããŸãã ãã ããt1ããt2ãžã®ãã£ã¹ãã¯ãt2ãt1ã®ãµãã¿ã€ãã§ãããã©ãããã¿ã€ããã§ãã¯ããã ãã§ãã Xã®ãããªåå€æ°ã«ã¯ãããã©ã«ãã§ãµãã¿ã€ããã¹ãŒããŒã¿ã€ãããªããšããŸãïŒãã¡ããããèªäœä»¥å€ã«ïŒã fãXã«é¢ããŠé¢ä¿çã«ãã©ã¡ããªãã¯ã§ãããšæããŸããïŒ
ããã圌ãã®åå¿ã§ããïŒ
ã¯ããããã¯ãã©ã¡ããªãã¯ã«ãªããšæããŸããããã«ããåŸãããå¯äžã®æ©èœã¯ããã§ã«é¢ä¿çã«ãã©ã¡ããªãã¯ã§ããæçé¢æ°ãšåçã®ãã£ã¹ããXã«æžã蟌ãããšã§ãã
ããã¯ç§ã®ã¢ããã€ã¹ãšäžèŽããŠããŸãã ãã¡ãããããã¯ç®åã®åé¡ãåçŽåãããã®ã§ãããWebAssemblyã«å¯ŸããŠããå
·äœçã«åé¡ã調æ»ããããã«åªåããŠããŸããããããŸã§ã®èª¿æ»ã§ã¯ããã®æåŸ
ã¯WebAssemblyã®èŠæš¡ã§ãç¶æãããããšã瀺åãããŠããŸãã call_indirect
ãé€ããŠããããã£ãŠãã®åé¡ã
åç §ããŠããå®çã¯ããã¹ãŠã®å€ããã£ã¹ãå¯èœãªèšèªã«é©çšãããããšã«æ³šæããŠãã ããã ãã®èŠ³å¯çµæããããã£ã¹ã¿ããªãã£ãå¶éãããšããã¢ã€ãã¢ãæµ®ãã³ãŸããã
WASIã®ãŠãŒã¹ã±ãŒã¹ãèããŠã¿ãŸãããã
ç§ã¯ããªããããŠãã䞻匵ãç解ããŠããŸããã WASIã®ãŠãŒã¹ã±ãŒã¹ãæ€èšããŸããã ç§ãã¡ã«ã¯ãã»ãã¥ãªãã£ãç¹ã«æ©èœããŒã¹ã®ã»ãã¥ãªãã£ã®å°é家ãè€æ°å«ãŸããŠããŸãã
ã¡ã¿ã³ã¡ã³ããšããŠãç§ã®ææ¡ãèãããã«åœå±ãCGã«èšŽããå¿ èŠããªãããšãæ¬åœã«æè¬ããŸãã ãã£ã¹ããå¶éããããšã§ããã£ã¹ããååšããå Žåã§ãéçãªãã©ã¡ããªã·ãã£ã確ä¿ã§ããããã«ãªãããšãææ¡ããŸããã ããªãã¯ããã«ãã®ææ¡ãç¡èŠãããã®åŽäžãæ£åœåããããã«ä»¥åã®è«æã«èšŽããŸããã ããããç§ããããã®è«æã®èè ã«ãããšåãææ¡ããããšãã圌ãã¯ç§ãããã®ãšåãçµè«ã«ããã«å°éããŸããã ãã®åã«ãç§ã¯æœåšçãªè§£æ±ºçãè©äŸ¡ããããšã¯é·ãããã»ã¹ã«ãªãã ãããšææ¡ããŸããã ããªãã¯ãã®ææ¡ãç¡èŠããããªãã¯ïŒãã¹ãŠããªãèªèº«ã§ïŒåé¡ã解決ãããšäž»åŒµããç§ãã¡äž¡æ¹ããã®é·ãäŒè©±ã«åŒã蟌ã¿ãŸããã ææ¡ãããããªãç¹°ãè¿ãåŽäžããããšãé²æ©ãéããã€ã©ã€ã©ããªãããã«ããããšã¯éåžžã«å°é£ã§ãã ïŒç§ã¯ããã§å¯èœãªè§£æ±ºçãšããŠããªãã®ææ¡ãåŽäžããããšããŠããã®ã§ã¯ãªãããšãæ確ã«ããå¿ èŠããããŸããç§ã¯ãããå¯äžã®è§£æ±ºçã§ã¯ãªãããšãå®èšŒããããšããŠããã®ã§ãä»ã®ããŸããŸãªãã®ãšäžç·ã«è©äŸ¡ããå¿ èŠããããŸããïŒ
ãã®åé¡ã§æèµ·ãããæžå¿µã«å¯ŸåŠããããã®è©³çŽ°ãªèšèšãæ確ã«ãã粟æ»ããããšã¯éèŠã§ã¿ã€ã ãªãŒã ãšæããŸããå®éã«ã¯ãæœè±¡åãããé ãæ©èœãšèŠãªãã¹ãã§ã¯ãªããšæããŸãã WASIã¯ä»ããããå¿ èŠãšããŠããŸãã
ãŸãã exact
+ newtype
ãæžå¿µã«å¯ŸåŠã§ããããšãæåŸ
ããŠããŸãããçŸæç¹ã§ã¯ãææå°æ©ã«èšèšã«ã³ãããããããšã«ãã£ãŠããã®æç¹ã§ãã¡ãŒã ã«åçŽã«è³ããããšã¯ã§ããªãããšã«åæããŸããç§ãã¡ã¯ïŒãŸããªãïŒåç
§åãåºè·ããŸãã ããã«ã€ããŠé©åã«è©±ãåãã«ã¯æéãå¿
èŠã§ãã
ããã¯èšã£ãŠããåç
§åã®ææ¡ã§call_indirect
眲åã«externref
ãèš±å¯ããŠãå±éºã¯ãªããšæããŸãã ã¯ããã¢ãžã¥ãŒã«ãexternref
å€ãïŒconstã°ããŒãã«ãšããŠãŸãã¯é¢æ°ããè¿ã...ïŒãšã¯ã¹ããŒãããå Žåããã®externref
ããŠã³ãã£ã¹ãã§ãããã©ããã¯æ確ã«ãããŠããŸããã ãããã call_indirect
ã¯externref
ããŠã³ãã£ã¹ãããŠããŸããã funcref
ããŠã³ãã£ã¹ãããŠããã externref
ã¯ãfuncref-type-equalityãã§ãã¯ã§i32
ãšåã圹å²ãæãããŸãã ãããã£ãŠã call_indirect
ã§åã®ã€ã³ããŒããåã®ãšã¯ã¹ããŒããããã³ãµãã¿ã€ãã³ã°ãè¡ãããŠããªãå ŽåãMVPã§ãŸã ã³ãããããŠããªãæ°ãããã¶ã€ã³ã®éžæã«ã©ã®ããã«ã³ãããããŠãããããããŸããã ã
ãã¶ãŒãããªãå Žåã¯ããã®æ¿ããè°è«ããType Importsææ¡ïŒé©åãªæœè±¡åãµããŒããå«ããå¿ èŠããããšç§ã¯ãŸã èããŠããïŒã®ããã»ã©æ¿ãããªãè°è«ã«ãã€ã€ã«ããŠã³ããããšãã§ããŸããïŒ
ãã¡ããã ãã¶ãŒãããããã©ããã調ã¹ãã®ã¯è¯ãèãã ãšæããŸãã
WASIã«é¢ããŠã¯ãèšèšã¯ãŸã éåžžã«æµåçã§ããããŸã å®è¡å¯èœãšæããã1ã€ã®ãªãã·ã§ã³ã¯ãåçã¡ã¢ãªå²ãåœãŠãå¿
èŠãšããªããããããã³ãã«ãã«i31ref
ãããªãã®ã䜿çšããããšã§ãã WASIã¯ä»ã®ãªãã·ã§ã³ã決å®ãããããããŸããããèŠç¹ã¯çŸæç¹ã§ã¯èª°ãç¥ããªãã®ã§ãä»åŸãã®ãããªæ±ºå®ã«åœ±é¿ãäžããªãããã«ä»è¡ããã決å®ãããã°ããã§ãããã
çŸåšã externref
ãå©çšå¯èœãªå¯äžã®æœè±¡åã§ãããããWASIããŒã¹ã®ãã¹ãã¯i31ref
ïŒãŸãã¯WASIã®ããã³ãã«ããäœã§ããïŒã§externref
ãã€ã³ã¹ã¿ã³ã¹åããŸãã ããããç§ã®ç解ã§ã¯ãWASIã¯ããã¹ãã«äŸåããã³ãŒããæžããããã«ããã®å®è£
ãå¯èœãªéãWebAssemblyã«ç§»è¡ããããšèããŠããŸãã ããã容æã«ããããã«ãããæç¹ã§ãWASIã·ã¹ãã ã¯externref
ä»ã®ã¿ã€ãã®ã€ã³ããŒããšåãããã«æ±ããWASIã®æœè±¡ãšã¯ã¹ããŒããããHandle
ã¿ã€ãã§ã€ã³ã¹ã¿ã³ã¹åããå ŽåããããŸãã ãã ãã Handle
ãi31ref
å Žåãã¢ãžã¥ãŒã«ã®å¢çãè¶ããŠæ©èœã§ããããã«ããããã«å¿
èŠãªäžèšã®call_indirect
å®è£
ã䜿çšããŠã externref
ãä»ããŠãã³ãã«ãåœé ããããšãã§ããŸãã
ããã§ãç§ã®è³ªåã®1ã€ã¯ãå
ã®æçš¿ã§æ確ã«è¿°ã¹ãããŠããªãããšã«æ°ã¥ããŸããããä»ã®æœè±¡åã®ã€ã³ããŒããšåãããã«ã externref
ãã€ã³ã¹ã¿ã³ã¹åã§ããããã«ãããã§ããïŒ
ããã§ãç§ã®è³ªåã®1ã€ã¯ãå ã®æçš¿ã§æ確ã«è¿°ã¹ãããŠããªãããšã«æ°ã¥ããŸããããä»ã®æœè±¡åã®ã€ã³ããŒããšåãããã«ã
externref
ãã€ã³ã¹ã¿ã³ã¹åã§ããããã«ãããã§ããïŒ
ãã®è³ªåãæ瀺çã«æèµ·ããŠããã ãããããšãããããŸãã FWIWãç§ã¯externref
ãWebAssemblyã¢ãžã¥ãŒã«å
ããã€ã³ã¹ã¿ã³ã¹åå¯èœã§ããããšãç解ããããšããããŸããã ããã¯ãWASIãexternref
ããã³ãã«ãšããŠäœ¿çšãããå Žåãä»®æ³åãžã®ãã¹ãã®åå ãæå³ããŸãããããã¯ç§ã«ã¯åé¡ãªãããã«æããããå°ãªããšãåé¢å¯èœãªè°è«ã®ããã§ãã
ããŒããã¯ã£ãããããŠãããªããèŠãŠã¿ãŸãããã ããªãã¯ãã§ã«æ¬¡ã®ãããªãã®ãããããæã£ãŠãããšæããŸãããç§ã«ãšã£ãŠã¯æåããå§ããã»ããç°¡åã§ãã
wasmã¢ãžã¥ãŒã«ã®èŠ³ç¹ããã¯ã externref
ã¯ãã¹ãåç
§ãæå³ãããã®ã§ã¯ãããŸããã ã¢ãžã¥ãŒã«ãäœãç¥ããªãã®ã¯äžéæïŒOPAQUEïŒåã§ãã ããããããããã¹ãåç
§ãšããŠè§£éããã®ã¯externref
åšãã®èŠåã§ãã äŸãã°ã䜿çšããŠã¢ãžã¥ãŒã«ã®èŠåexternref
DOMãšå¯Ÿè©±ããããã«ã¯ãé¢ä¿ããæ©èœã«ã¯æããã§ãããexternref
ã®ããã«ãã¢ãžã¥ãŒã«ã®èŒžå
¥ãã®ãparentNode : [externref] -> [externref]
ãšchildNode : [externref, i32] -> [externref]
ã ãã¹ãèªäœãªã©ã®ã¢ãžã¥ãŒã«ã®ç°å¢ã¯ããã¹ãåç
§ãšããŠexternref
ã®è§£éãå®éã«æäŸãããã®ã§ããããã®è§£éãè£ä»ããã€ã³ããŒããããã¡ãœããã®å®è£
ãæäŸããŸãã
ãã ããã¢ãžã¥ãŒã«ã®ç°å¢ã¯ãã¹ãã§ããå¿
èŠã¯ãªãã externref
ã¯ãã¹ãåç
§ã§ããå¿
èŠã¯ãããŸããã ç°å¢ã¯ãäºæ³ãããèŠåã瀺ããã¹ãåç
§ã®ããã«èŠããããã€ãã®ã¿ã€ãã®æ©èœãæäŸããå¥ã®ã¢ãžã¥ãŒã«ã§ããå¯èœæ§ããããŸãã ã¢ãžã¥ãŒã«Eãã¢ãžã¥ãŒã«Mã®ç°å¢ã§ããããã®ã¢ãžã¥ãŒã«Mãäžèšã®ããã«parentNode
ãšchildNode
ãã€ã³ããŒããããšããŸãã Eãã¢ãžã¥ãŒã«Mã䜿çšãããããDOMãžã®Mã®ã¢ã¯ã»ã¹ãå¶éããããšããŸããããšãã°ãEã¯Mã®ä¿¡é Œãå¶éããŠããããããŸãã¯Eã¯Mãæã€å¯èœæ§ã®ãããã°ãå¶éããããšèããŠãããMã®ããŒãºããããã®å¶éãè¶
ããŠã¯ãªããªãããšãç¥ã£ãŠããŸãã Eãã§ããããšã¯ãMã®externref
ãšããŠãMonitoredRefãã䜿çšããŠMãã€ã³ã¹ã¿ã³ã¹åããããšã§ãã ç¹ã«ãEãMåã®DOMããŒããæäŸãããããMãDOMããªãŒã®äžäœã«ç§»åããªãããã«ããããšããŸãã ãã®å ŽåãEã®MonitoredRefã¯å
·äœçã«ã¯ref (struct externref externref)
ã«ãªããŸããããã§ã2çªç®ã®externref
ïŒEã®èŠ³ç¹ããïŒã¯MãæäœããŠããDOMããŒãã§ãããæåã®externref
ã¯ã®ç¥å
ã§ãã Mãéãéããããšãèš±å¯ãããŠããªããã®ããŒãã 次ã«ãEã¯Mã®parentNode
ã€ã³ã¹ã¿ã³ã¹åããŠãããã2ã€ã®åç
§ãåãã§ããå Žåã«ãšã©ãŒãçºçããããã«ããããšãã§ããŸãã Eèªäœãç¬èªã®parentNode
ããã³childNode
é¢æ°ãã€ã³ããŒãããEãå¹æçã«DOMçžäºäœçšã®ã©ã³ã¿ã€ã ã¢ãã¿ãŒã«ããŸãã
ããŸãããã°ãããã¯é©åãªçµµãæãã®ã«ååå
·äœçã§ãããã詳现ã«è¿·ãã»ã©å
·äœçã§ã¯ãããŸããã§ããã æããã«ããã®ãããªãã¿ãŒã³ã¯ãããããããŸãã ã§ãããã質åãèšãæããå¥ã®æ¹æ³ã¯ã externref
ããã¹ãåç
§ã®ã¿ãæ£ç¢ºã«è¡šãããã«ãããã®ããšããããšã§ãã
ç§ã«ãšã£ãŠçããããšæãããå¯äžã®éšåã¯ããEãã§ããããšã¯ãMã®externref
ãšããŠãMonitoredRefãã䜿çšããŠMãã€ã³ã¹ã¿ã³ã¹åããããšã§ãããã§ãã æœè±¡åãããã®ãä»ã®ã¢ãžã¥ãŒã«ã§externref
ãšããŠè¡šç€ºã§ããããã«ããèšç»ããããšããå°è±¡ã¯ãããŸããã ç§ã®ç解ã§ã¯ã externref
ã¯æœè±¡åããŒã«ã§ã¯ãããŸããã
ç§ããã®ãããªèšç»ãç¥ããŸããã 誰ãããã®ãªãã·ã§ã³ãæ€èšãããã©ãããããããŸããã ã€ãŸãã externref
ãããšãã°i32
ãããªãããªããã£ããåã«ããå¿
èŠããããŸããããããšãã€ã³ããŒããããåãªã©ã®ãã€ã³ã¹ã¿ã³ã¹åå¯èœãªãåã«ããå¿
èŠããããŸããïŒ
ç§ã®å
ã®æçš¿ã§ã¯ãã©ã¡ãã®æ¹æ³ã§ã管çã§ããããšã瀺ããŸããã ãããªããã£ãããªè§£éãæ¡çšããããšã®ãã¬ãŒããªãã¯ãã€ã³ããŒããããã¿ã€ããããexternref
æçšæ§/æ§æå¯èœæ§ã倧å¹
ã«äœãããšã§ããããã¯ãã€ã³ããŒããããã¿ã€ããäžèšã®ãã¿ãŒã³ãšåæ§ã«externref
ã®ãŠãŒã¹ã±ãŒã¹ããµããŒãããããã§ãã ãã®ããããããªããã£ãã externref
ã¯çè·¡çã«ãªãå¯èœæ§ãé«ããäžäœäºææ§ã®ããã«ã®ã¿ååšããŸãã ãããããããç¹ã«åé¡ã«ãªãå¯èœæ§ã¯äœããè¿·æãªã ãã§ãã ç§ãèŠãããšãã§ããæ倧ã®åé¡ã¯ãããbehavednessãšåãããã«ãã€ãŸãcall_indirect
æ°å€åã«ã¯ã圌ããäœã®ã¹ãŒããŒã¿ã€ããæã£ãŠããªãã®ã§ãã®ããbehavednessããŸãããcall_indirect
äŸåçµããå¯èœæ§ãexternref
ã«ãã¹ãŒããŒã¿ã€ãã¯ãããŸããã
ãããããã§ããããã¯ç解ã®éãã説æããŠããŸãã externref
ã¯ãŸã£ããæœè±¡çã§ã¯ãªããã externref
ãåã§ã€ã³ã¹ã¿ã³ã¹åããããšããæŠå¿µããªãããšã«@tlivelyã«åæããŸããããããã¯ããªãèªä¿¡ãæãŠããšæããŸãã ïŒ externref
ã¯ãæ瀺çã«å®£èšãããåãã©ã¡ãŒã¿ãŒãšã¯å¯Ÿç
§çã«ãããªããã£ãåã§ãããããã¢ãžã¥ãŒã«ããšã«ã€ã³ã¹ã¿ã³ã¹åãè©Šã¿ãæ¹æ³ããæ確ã§ã¯ãããŸãããïŒ
ããŠã³ãã£ã¹ãããªãå Žåã«ã¯ããã®äºå®ã¯WASIã®ããã®èšç»ã¯ããã®é·ç§»ã«ãªã£ãŠããçç±ã§ããWASIã®APIãä»®æ³å/å®è£
ããããã®ã»ãŒåœ¹ã«ç«ããªãwasmãäœãi32
çŽæ¥ãã³ãã«ã¿ã€ã茞å
¥ïŒãšããªãç§ãæåºããã¿ã€ã-茞å
¥ã/ïŒ6 ãb / cããå°ãå¿
èŠã§ãïŒã
externref
ã¯ãæ瀺çã«å®£èšãããåãã©ã¡ãŒã¿ãŒãšã¯å¯Ÿç §çã«ãããªããã£ãåã§ãããããã¢ãžã¥ãŒã«ããšã«ã€ã³ã¹ã¿ã³ã¹åãè©Šã¿ãæ¹æ³ããæ確ã§ã¯ãããŸããã
ã¿ã€ãã€ã³ããŒããè¿œå ãããšãã¿ã€ãã€ã³ããŒããªãã§ã externref
ãå
é ã«import type externref
ãããã¢ãžã¥ãŒã«ãæ±ãããšãã§ããŸãã ä»ã®ããªããã£ãåãšã¯ç°ãªãã externref
ã¯ïŒããã©ã«ãå€ä»¥å€ã«ïŒé¢é£ããããªããã£ãæäœããªãããããã¹ãŠããŸã£ããåãããã«åãã§ãã¯ãããŸãã ãããããã®æé»çãªã€ã³ããŒãã«ãããä»®æ³åããµã³ãããã¯ã¹åãå®è¡æç£èŠãªã©ãå®è¡ã§ããããã«ãªããŸããã
ãããããããè¡ã£ããæ¥ããããåã«ãç§ãã¡å
šå¡ãäœãã«ã€ããŠåãããŒãžã«ãããã©ãããå€æããã®ã«åœ¹ç«ã€ãšæããŸãã 次ã®ã¹ããŒãã¡ã³ãã«åæãããåæããªãããããã³ãã®çç±ããç¥ãããã ããããã¿ã€ãã€ã³ããŒããå©çšå¯èœã«ãªããšãã¢ãžã¥ãŒã«ã¯externref
ã䜿çšããçç±ããªããªãã代ããã«ã¿ã€ãã€ã³ããŒãã䜿çšãããšãããåå©çšå¯èœ/æ§æå¯èœã«ãªããŸããã
次ã®ã¹ããŒãã¡ã³ãã«åæãããåæããªãããããã³ãã®çç±ããç¥ãããã ããããã¿ã€ãã€ã³ããŒããå©çšå¯èœã«ãªããšãã¢ãžã¥ãŒã«ã¯
externref
ã䜿çšããçç±ããªããªãã代ããã«ã¿ã€ãã€ã³ããŒãã䜿çšãããšãããåå©çšå¯èœ/æ§æå¯èœã«ãªããŸããã
ç§ã¯èŠçŽã®ãã®å£°æã«åæããŸãã å®éã«ã¯ãexternrefã¯ãã€ã³ã¹ã¿ã³ã¹åæã«è¿œå ã®æ§æãå¿ èŠãšããªããããå€éšJSãªããžã§ã¯ããåç §ããããã®Webã³ã³ããã¹ãã§ã¯åŒãç¶ãäžè¬çã§ãããšæããŸãã ããããããã¯åãªãäºæž¬ã§ãããç§ãééã£ãŠããããšãå€æããçµå±ã誰ããåã€ã³ããŒãã®äœ¿çšã«åãæ¿ããŠãããŸããŸããã externrefã®äŸ¡å€ã¯ãåã®ã€ã³ããŒããªã©ã®ããè±å¯ãªã¡ã«ããºã ãããæ©ãååŸã§ããããšã§ãã externrefãã·ã³ãã«ã«ä¿ã¡ãåŸã§ãããšã¬ã¬ã³ããªéžæè¢ããããšãã«ãåä»ã«éŽã¹ãã䜿ã£ãŠãã匷åãªãã®ã«ãããããã䜿çšãããªããªãããšã確èªããããšæããŸãã
@tlively ã
FWIWãç§ã¯externrefãWebAssemblyã¢ãžã¥ãŒã«å ããã€ã³ã¹ã¿ã³ã¹åå¯èœã§ããããšãç解ããããšããããŸããã
ããã§ããexternrefã¯ãããªããã£ããã¿ã€ãã®å€éšãã€ã³ã¿ã§ãããšããèãã§ãã åç §åã®å®è£ ã®è©³çŽ°ãæœè±¡åããã«ã¯ãanyrefãåã€ã³ããŒããªã©ã®ä»ã®äœããå¿ èŠã«ãªããŸãã
@lukewagner ãå¿ èŠã«
@RossTate ïŒ
ç§ãçžè«ãããããã®å°é家ã«ã¯ãããã€ãã®è«æã®èè ãå«ãŸããŠããŸãã
åªç§ãªã ãããããããªããããå€ãã®æš©åšãæ¢ããŠããå Žåã«åããŠãããªãã¯æ¬åœã«ããªãããããã®è«æã®ããã€ãã®èè ã§ããããšã«æ°ã¥ãããšæããŸãã :)
ãããç§ãå°ãããã®ã§ãïŒ
ããªã¢ãŒãã£ãã¯é¢æ°fïŒ...ïŒããããšããŸãã ç§ã®åä»ãèšèªã«ã¯ãïŒå å«çïŒãµãã¿ã€ãã³ã°ãšæ瀺çãªãã£ã¹ãããããŸãã ãã ããt1ããt2ãžã®ãã£ã¹ãã¯ãt2ãt1ã®ãµãã¿ã€ãã§ãããã©ãããã¿ã€ããã§ãã¯ããã ãã§ãã Xã®ãããªåå€æ°ã«ã¯ãããã©ã«ãã§ãµãã¿ã€ããã¹ãŒããŒã¿ã€ãããªããšããŸãïŒãã¡ããããèªäœä»¥å€ã«ïŒã fãXã«é¢ããŠé¢ä¿çã«ãã©ã¡ããªãã¯ã§ãããšæããŸããïŒ
ã¯ãã ãã®ç¹å®ã®è³ªåã«ãåãåçãããŸãã ãããããã®è³ªåã¯ããã£ã¹ãã®æ§è³ªããããã°ã©ãã³ã°èšèªã«ã¯ãã£ãã«ååšããªãæçãšéæçã®å®éåã®ããªãçããåºå¥ãªã©ãããã€ãã®ç¹å®ã®ä»®å®ãå ·äœåããŠããŸãã ãããŠãããã¯çç±ããããšæããŸãã
ãéçåã®æœè±¡åãäžååã§ããããšèšã£ããšããããã_æè¡çã«_äžå¯èœã§ãããšããæå³ã§ã¯ãããŸããã§ãããïŒãã¡ããå¯èœã§ãïŒãããã¯_å®éçã«_é©åã§ã¯ãããŸããã å®éã«ã¯ãåã®æœè±¡åãšãµãã¿ã€ãã³ã°/ãã£ã¹ãå¯èœæ§ã®éïŒãŸãã¯ãã©ã¡ããªãã¯åãšãã³ãã©ã¡ããªãã¯åã®éïŒã®åå²ã¯ããã£ã¹ãã«åºã¥ãæ§æã人çºçã«å£ããŠããŸããããæãŸãããããŸããã
ç§ã¯ããªããããŠãã䞻匵ãç解ããŠããŸããã
æœè±¡åã®å€ãåãåã£ãå Žåã§ãããã®æ£ç¢ºãªåãå¿ããŠãããšãã°ãããçš®ã®åéåã«å ¥ããŠãåŸã§ããŠã³ãã£ã¹ãã«ãã£ãŠå埩ãããå ŽåããããŸãã ä»ã®åç §åã®å Žåãšåãçç±ã§ããããå®è¡ããããšããå§ãããŸãã åã®æœè±¡åã¯ãåãçš®é¡ã®éåžžã®åã§æå¹ãªç¹å®ã®äœ¿çšãã¿ãŒã³ã®éªéã«ãªããªãããã«ããå¿ èŠããããŸãã
ããªãã®çãã¯æ¬¡ã®ããã«æãããŸãïŒããã§ãããããã®äœ¿çšãµã€ãã§ãã¹ãŠãè£å©ã¿ã€ãã«ãããšãã°ããªã¢ã³ãã«ã©ããããŸãã ããããããã¯ããªãã®ã©ããã³ã°/ã¢ã³ã©ããã³ã°ã®ãªãŒããŒããããæå³ããå¯èœæ§ããããããè€éãªã¿ã€ãã®ã·ã¹ãã æ©èœãå¿ èŠã§ããã䜿çšããã®ãããè€éã§ãã
ãããç§ãã¡ã®æèŠã®çžéã®ããã€ãã«åž°çãããšæããŸãïŒMVPãåç §åã®çµåããµããŒãããã¹ããã©ããããŸãã¯æ瀺çãªããªã¢ã³ãåã®å°å ¥ãšãšã³ã³ãŒããå¿ èŠãšãããã©ããã è¯ããæªããããŠããªã³ã¯äžè¬çãªãšã³ãžã³ã®ããŒãã€ã³ã¿ãŒãã§ã€ã¹ã«èªç¶ã«äžèŽããä»æ¥ã®ãµããŒãã¯ç°¡åã§å®äŸ¡ã§ãã ããªã¢ã³ãã¯ããã»ã©å€ãã¯ãããŸããããå°ãªããšãæ¢åã®ãšã³ãžã³ã§ã¯ãäœåãªãªãŒããŒããããšäºæž¬äžå¯èœãªããã©ãŒãã³ã¹ãåŒãèµ·ããå¯èœæ§ãé«ããã¯ããã«ç 究çãªã¢ãããŒãã§ãã ãããŠç§ã¯ãåã·ã¹ãã ã®äººãšããŠããŠãŒã¶ãŒåãèšèªãªã©ã®ä»ã®ç¶æ³ã§ã¯ããŠããªã³ãããããªã¢ã³ããéåžžã«å¥œããšèšã£ãŠããŸãã ;ïŒ
ã¡ã¿ã³ã¡ã³ããšããŠãç§ã®ææ¡ãèãããã«åœå±ãCGã«èšŽããå¿ èŠããªãããšãæ¬åœã«æè¬ããŸãã
ããŸããŸãªææ¡ã«ã€ããŠã®äŒè©±ã¯ãæ確ã§ãªãããšã«ã€ããŠããããã®ãã£ã³ããªã³ã«å°ããããšã«ãã£ãŠéå§ãããå ŽåãããããŸããããããããªãããšã芪åã«ææ¡ã§ããŸããïŒãããã®ä»®å®ã«åºã¥ããŠçããåºããå¹ åºã䞻匵ãææ¡ãããŸããïŒ
åªç§ãªã ãããããããªããããå€ãã®æš©åšãæ¢ããŠããå Žåã«åããŠãããªãã¯æ¬åœã«ããªãããããã®è«æã®ããã€ãã®èè ã§ããããšã«æ°ã¥ãããšæããŸãã :)
ã¯ããããã¯ãç§ã®ææ¡ããããã®äž»åŒµããªãããæ¡ä»¶ã«å ·äœçã«å¯ŸåŠããŠããããšãç¥ã£ãŠããŠããç§ã®ææ¡ãæ©èœããªããšäž»åŒµããè«æãããããšãææ¡ãããšããéåžžã«åé¡ã«ãªããŸãã
å®éã«ã¯ãåã®æœè±¡åãšãµãã¿ã€ãã³ã°/ãã£ã¹ãå¯èœæ§ã®éïŒãŸãã¯ãã©ã¡ããªãã¯åãšãã³ãã©ã¡ããªãã¯åã®éïŒã®åå²ã¯ããã£ã¹ãã«åºã¥ãæ§æã人çºçã«å£ããŠããŸããããæãŸãããããŸããã
ããã¯æèŠã§ãããäºå®ã§ã¯ãããŸããïŒç§ãã¡ãåæããªãããšã¯å®å šã«åççãªããšã§ãïŒã å€èšèªã·ã¹ãã ã«ã¯ãèšèªã«ãšããããªãæ¥çã¿ã€ãã®ã¢ã»ã³ããªèšèªããªããããå®è·µã«ã€ããŠäž»åŒµããããšã¯äžå¯èœã ãšæããŸãã ããã¯ã培åºçãªïŒåå¥ã®ïŒè°è«ã«å€ãããã®ã§ãã ãã®è°è«ã®ããã«ãCGããã¬ãŒããªããæ¯èŒã§ããããã«ãæåã«ããã€ãã®è©³çŽ°ãªã±ãŒã¹ã¹ã¿ãã£ãæäŸããããšã圹ç«ã¡ãŸãã
ããŸããŸãªææ¡ã«ã€ããŠã®äŒè©±ã¯ãå ·äœçãªæ ¹æ ãå°æ¥ã®èšç»ïŒå¿ ãããæ確ã§ã¯ãªãããŸãã¯ãŸã æžãããŠããªãïŒãªã©ãæ確ã§ãªãããšã«ã€ããŠããããã®ãã£ã³ããªã³ã«å°ããããšããå§ããæ¹ãããŸããããããããªãããšã芪åã«ææ¡ã§ããŸããïŒãããã®ä»®å®ã«åºã¥ããŠçããåºããå¹ åºã䞻匵ãææ¡ãããŸããïŒ
WebAssembly / proposal-type-importsïŒ4ãWebAssembly / proposal-type-importsïŒ6ãããã³WebAssembly / proposal-type-importsïŒ7ã¯ãããããåºæ¬çã«ãã®èšç»ã®è©³çŽ°ãèŠæ±ããŸããã ãããã®æåŸã®ãã®ã¯åé¡ãGCã«ãã³ãããŸãããWebAssembly / gcïŒ86ã¯ãçŸåšã®GCææ¡ãå®éã«ã¯åçæœè±¡åã¡ã«ããºã ããµããŒãããŠããªãããšãææããŠããŸãã
ã¡ã¿ã¬ãã«ã§ã¯ããã®è°è«ãèã«çœ®ããç®åã®ãããã¯ã«çŠç¹ãåœãŠãããæ±ããããŸããã ç§ã®è³ªåã«å¯Ÿãã@tlivelyã®åçã¯éåžžã«åœ¹ã«ç«ã¡ãŸããã ç§ã¯å®éããã®è³ªåã«ã€ããŠå ·äœçã«ããªãã®èããåŸãããšã«éåžžã«èå³ããããŸãã
@RossTate ïŒ
ç§ã®è³ªåã«å¯Ÿãã@tlivelyã®åçã¯éåžžã«åœ¹ã«ç«ã¡ãŸããã ç§ã¯å®éããã®è³ªåã«ã€ããŠå ·äœçã«ããªãã®èããåŸãããšã«éåžžã«èå³ããããŸãã
ãã ãç§ã¯ãã§ã«ããã«ã€ããŠã³ã¡ã³ãããŠæã£ã以äžã ãããšãäœãä»ã®ããšãæå³ããŸããïŒ
ãããã ã³ã¡ã³ãã¯åœŒã®åçã«åæããããšãæå³ããŠããã®ã§ã¯ãªãããšæããŸããããæåã«ç¢ºèªããããšæããŸããã ããããšãïŒ
@lukewagner ãããªãã¯ã©ãæããŸããïŒ
externref
ã¯æ°žä¹
ã«ããªããã£ãåã§ãããåãã©ã¡ãŒã¿ãŒãšããŠããã®ãŒã£ãŠå解éãããªãããšã«åæããŸãã ãããèãããšãåç
§åã¯ãã®ãŸãŸã§ãããšæããŸãã
@rossbergãåãäžããŠãType Importsææ¡ã®ç¯å²ãæ¡å€§ããwasmãæœè±¡åãå®è£ ããæ©èœãã«ããŒã§ããããã«ããããšæããŸãã ãããçªãæ¢ããããšãã§ããã°ãé¢æ°åç §ãšãµãã¿ã€ãã«é¢ãããããªãè°è«ã®ãããã¯ã解é€ã§ãããšæããŸãã
çŽ æŽãããã 次ã«ãç§ãã¡ã¯ãã¹ãŠåãããŒãžã«ããŸãïŒãããŠãç§ããé¢ä¿ãããã¬ãŒããªããšæ±ºå®ã®æ ¹æ ã®çŽ æŽãããèŠçŽã@tlivelyãæäŸãããšæããŸãïŒã
ãããã£ãŠã externref
ã¯ã€ã³ã¹ã¿ã³ã¹åã§ãããã¿ã€ãã€ã³ããŒãã®è¿œå ã®æè»æ§ãæ¢ããŠããã¢ãžã¥ãŒã«ã¯ãæ©èœããªãªãŒã¹ããããšãã«ã¿ã€ãã€ã³ããŒãã«å€æãããããšãæåŸ
ãããŸãã ãã®ç§»è¡ãã¹ã ãŒãºã«ããããã«ãã€ã³ã¹ã¿ã³ã¹åãæäŸãããŠããªãå ŽåãïŒããã€ãã®ïŒïŒã¿ã€ãã®ã€ã³ããŒããããã©ã«ãã§externref
ã«ãã£ãŠã€ã³ã¹ã¿ã³ã¹åãããããã«ããå¿
èŠããããšæããŸãã
ãŸããã¿ã€ãã€ã³ããŒãã®ç¯å²ãæ¡å€§ãããšããç³ãåºãåããããšæããŸãã åã€ã³ããŒãã®äž»èŠãªã¢ããªã±ãŒã·ã§ã³ã®å€ãã¯æœè±¡åãå¿ èŠãšãããããæœè±¡åããã®ææ¡ã®äžéšã«ãªãã®ã¯èªç¶ãªããšã®ããã«æããŸãã
ãã®éã externref
ã«é¢ããå·®ãè¿«ã£ã質åã«å¯ŸåŠããŸãããã call_indirect
ã«ã€ããŠããäžè¬çã«äœããã¹ããã¯ã解決æ¹æ³ã«ã€ããŠã®æçãªè°è«ã¯ãããã®ã®ããŸã 解決ãããŠããŸãããåé¡ã¯æªè§£æ±ºã®ãŸãŸã«ããŠãããŸãã
ããããšãïŒ
æãåèã«ãªãã³ã¡ã³ã
éçåã®æœè±¡åã¯ãåçåãã£ã¹ãã䜿çšããèšèªã§ã¯äžååã§ãã éçæœè±¡åã¯ãã©ã¡ããªã·ãã£ã«äŸåããŠããããã£ã¹ãã¯ãããç Žãããã§ãã ããã«ã€ããŠæ°ããããšã¯äœããããŸãããããã«ã€ããŠã®è«æãæžãããŠããŸãã ãã®ãããªç¶æ³ã§ã¯ãä»ã®æœè±¡åã¡ã«ããºã ãå¿ èŠã§ãã
æœè±¡åã®äœ¿çšãå¶éããããšã«ãã£ãŠãããåé¿ããããšãããšããã®ç®çãç¡å¹ã«ãªããŸãã WASIã®ãŠãŒã¹ã±ãŒã¹ãèããŠã¿ãŸãããã WASIã¢ãžã¥ãŒã«ãšããããšã¯ã¹ããŒãããã¿ã€ãããã¹ãã«ãã£ãŠå®è£ ãããŠãããWasmã«å®è£ ãããŠãããã¯é¢ä¿ãããŸããã ãŠãŒã¶ãŒå®çŸ©ã®æœè±¡åãä»»æã«å¶éãããšãWasmå®è£ ã¯äžè¬ã«ãã¹ãå®è£ ãšäºææ§ããªããªããŸãã
ã¯ïŒ ããã¯ãµãã¿ã€ãã³ã°ã«ãŒã«ã®äžéšã§ãããããå®çŸ©äžãåæ§ã§ãã
ç§ã¯ããã¯èšããªãã£ãã ããã¯call_indirectèªäœã®åé¡ã§ã¯ãªãããã£ã¹ãã®ããèšèªã«é©ããåæœè±¡åã¡ã«ããºã ãéžæããããšã®åé¡ã ãšèšããŸããã
äœè«ã§ãããOCamlïŒãŸãã¯åæ§ã®èšèªïŒãã³ã³ãã€ã«ããããã«ããªã¢ã³ãã¿ã€ãã®å°å ¥ãå¿ èŠã«ãªãçç±ã¯ãããŸããã çè«çã«ã¯ããããããã«éãå¯èœæ§ããããšããŠãïŒçŸåšã®äžä»£ã®ãšã³ãžã³ã®å Žåã¯ããã§ã¯ãªãå¯èœæ§ãé«ãã§ãããéã®å¯èœæ§ãé«ãã§ãïŒãããªã¢ã³ãã¿ã€ãã¯é倧ãªåé¡ã§ãããMVPã«ã¯å¿ èŠãããŸããã ææå°æ©ã®è€éãã«å¯Ÿããããªãã®æ¬²æ±ãå®å šã«ã¯å ±æããŠããŸããã ;ïŒ
é¢æ°ã®å¹³çæ§ïŒHaskellãSMLãªã©ãããããµããŒãããŠããªãèšèªããããããé¢æ°åç §ããçŽæ¥æ©æµãåããå¯èœæ§ããããŸãã OCamlã¯æ§é çãªåçæ§ãã¹ããŒããç©ççãªãã®ã«å¯ŸããŠå®è£ å®çŸ©ã®åäœãæ瀺çã«æã£ãŠããŸãã ãããåžžã«falseãè¿ãããšãèš±å¯ããããé¢æ°ãã¹ããŒããããšãèš±å¯ãããã©ããã¯éãããŸãŸã§ãããå®éã«ã¯ã©ã¡ãã§ãååã§ãããã³ã¹ãã®ãããäœåãªã©ããã³ã°ãè¡ãåã«èª¿æ»ãã䟡å€ããããŸãã
[ã¡ã¿ã³ã¡ã³ããšããŠãè¬çŸ©ãæ§ããã«ããŠãããããããã¯æèœãªäººã ã®ã»ãããã·ã³ã°ã«ãã³ã§ã¯ãªããè³ã®çè·¡ã以åã«æã é©çšãããäžçã§ãããšããèããæ€èšããŠããã ããã°å¹žãã§ãã]