ïŒãã®å·ã¯ãå°æ¥ã®CGããŒãã£ã³ã°ã§ã®æ祚ã«åããŠãããå€ãã®ãã£ãŒãããã¯ãåŸãããšãç®çãšããŠã CG-03-02ã§ã®ãã¬ãŒã³ããŒã·ã§ã³ããã£ããã£ããŸããïŒ
ã¢ãžã¥ãŒã«ãªã³ã¯ã®ææ¡ã§ã¯ãã€ã³ã¹ã¿ã³ã¹ã®åäžã¬ãã«ã®ã€ã³ããŒãã®ç ç³ãšããŠ2ã¬ãã«ã®ã€ã³ããŒãããŸãã äŸãã°ïŒ
(module
(import "a" "foo" (func))
(import "a" "bar" (func))
)
次ãšåãASTã«è±ç³ãããŸãïŒ
(module
(import "a" (instance
(export "foo" (func))
(export "bar" (func)))
)
ããã«é¢ãã1ã€ã®åé¡ã¯ãçŸåšwasmãïŒåããŸãã¯ç°ãªã眲åãæã€ïŒéè€ã€ã³ããŒããèš±å¯ããŠããããšã§ãã
(module
(import "a" "b" (func))
(import "a" "b" (func))
)
éè€ãããšã¯ã¹ããŒãã¯èš±å¯ãããŠããŸããã ãããã£ãŠãäžèšã次ã®ããã«è±ç³ããŸãã
(module
(import "a" (instance
(export "b" (func))
(export "b" (func)))
)
ç¡å¹ã«ãªããŸãã module-linking /ïŒ7ã§ã¯ããã®äžäžèŽã調æŽããããã®ããŸããŸãªæ¹æ³ã«ã€ããŠèª¬æããŠããŸãããæãç°¡åãªè§£æ±ºçã¯ãéè€ããã€ã³ããŒããããã®ãŒã£ãŠçŠæ¢ããããšã§ãã
ãã°1647791ã¯ãFirefoxã§éè€ã€ã³ããŒãã枬å®ããããã®ãã¬ã¡ããªãè¿œå ããFirefox Beta 86ã®çµæã¯ãããŒãžèªã¿èŸŒã¿ã®0.00014ïŒ ã«éè€ã€ã³ããŒããå«ãŸããŠããããšã瀺ããŠããŸãïŒããã¯ãèªååãŸãã¯ä»ã®åæãœãŒã¹ã§ã®åäœãã¹ãã§ããå¯èœæ§ããããŸãïŒã ãããã£ãŠãããã¯ç§ãã¡ãå®éã«è¡ãããšãã§ããç Žå£çãªå€æŽã§ããããã«æãããŸãã
éè€ã€ã³ããŒããèš±å¯ããªããã1ã€ã®äž»ãªçç±ã¯ãç°ãªã眲åãæã€éè€ã€ã³ããŒãã¯ãã¹ãã«ãã£ãŠã®ã¿å®è£ ã§ãããããwasmãåžžã«ä»®æ³åïŒããªãã£ã«ãã¢ãã¯ãªã©ïŒã§ããããã«ãããšããäžè¬çãªç®æšãç Žãããšã§ãã
å ·äœçãªçµéšãšããŠãã¹ããã¯ãã¹ãã¹ã€ãŒãã«ã¯ïŒå°å·é¢æ°ã®ããŸããŸãªããªãŒããŒããŒããã«å¯ŸããŠïŒéè€ããã€ã³ããŒãããããŸãããããã¹ããå®è¡ããã人ã«åé¡ãçºçãããããããã¯åé€ãããŸããã
ãããã£ãŠãã¢ãžã¥ãŒã«ãªã³ã¯ã®ææ¡ã®æžå¿µã¯å¥ãšããŠãããã®å¶éã¯äžè¬ã«wasmãšã³ã·ã¹ãã ã«ãšã£ãŠé©åãªå¶éã§ãããšäž»åŒµããããšãã§ããŸãã
ãã®å€æŽãè¡ããªãã£ãå Žåãã¢ãžã¥ãŒã«ãªã³ã¯ã®ææ¡ã§ã©ã®ãããªæªãããšãèµ·ãããŸããïŒ ããã¯ããã®è±ç³ãå®å šã«æ©èœããããããã£ãŠèŒžå ¥åã®ä»æ§ã®èª¬æãããè€éã«ãªãããšãæå³ããã®ã§ããããïŒ ãããšããææ¡ããªã³ã¯ããã¢ãžã¥ãŒã«ã®æ©èœãããæ ¹æ¬çã«åŠšå®³ããŸããïŒ ïŒç§ã¯ãã®å€æŽã«ãŸã£ããå察ããŠããŸãããåæ©ãããããç解ããããšããŠããã ãã§ããïŒ
ã«ãŒã¯ã®ãã¬ãŒã³ããŒã·ã§ã³ã§èŠããŠããããã«ãçŸåšãéè€ãããšã¯ã¹ããŒãã¯èš±å¯ãããŠããŸããã
ãã®å¶éã解é€ããéè€ãšã¯ã¹ããŒããèš±å¯ãããšã©ããªããŸããïŒ ããã«ããããã®åé¡ãå¥ã®æ¹æ³ã§è§£æ±ºããããã®ã¢ãžã¥ãŒã«ãªã³ã¯ã®èšèšã¹ããŒã¹ãéãããŸãã
çŸåšããšã³ãžã³ã¯2ã€ã®çç±ã§ã€ã³ããŒã/ãšã¯ã¹ããŒãåãæ€æ»ããã ãã§æžã¿ãŸããUTF-8ã®æŽåœ¢åŒæ§ãšéè€ãããšã¯ã¹ããŒããã§ãã¯ã§ãã UTF-8ã®å¶éã解é€ããããšã«ã€ããŠãªãã©ã€ã³ã§è©±ããŸããããäž¡æ¹ã解é€ã§ãããããããŸããã
ãšã¯ã¹ããŒããéè€ãããšãååããŒã¹ã®ãªã³ã¯ããããŸãã«ãªããŸãã
@tlivelyéè€ã€ã³ããŒããèš±å¯ããªãå Žåã module-linking /ïŒ7ã§èª¬æãã代æ¿ãœãªã¥ãŒã·ã§ã³ã¯ãæ€èšŒãšãªã³ã¯ã®å®è£ ã«ããªãã®è€éããè¿œå ããããã«æãã
@titzeréè€ãããšã¯ã¹ããŒããè¿œå ãããšããœãŒã¹ãšèšèªã®çµ±åããšã«éåžžã«è€éã§ãã ãã®JSé¢æ°ãwasmããïŒ WebAssembly.instantiate
çµç±ã§ïŒã€ã³ããŒãããããšãããšã©ããªããŸããïŒ äžå¯èœãªèšèšäžã®åé¡ã ãšèšã£ãŠããããã§ã¯ãããŸããããNèšèªã®çµ±åã«ã€ããŠããããã®é£ãã/åä»ãªè³ªåãå®å
šã«åé¿ãããªãã·ã§ã³ãããå Žåã¯ããããæãŸãããšæãããŸãã
éè€ã€ã³ããŒãã¯ãåãé¢æ°ãããŸããŸãªçœ²åãæã€ããšãã§ããJSã®ãããªåçèšèªããã®ã€ã³ããŒããåŒã³åºãã®ã«éåžžã«äŸ¿å©ã§ããå¢çã®åã·ã¹ãã ãè±å¯ã«ãªããšã䜿çšãããéãå°ãªããªãããšã¯ãªããšæããŸããæ°å€ãŸãã¯æåååŒæ°ããããã¯1ã€ãŸãã¯2ã€ã®åŒæ°ãæã€åãé¢æ°ã ãã®æ©èœãåé€ããããšã¯ãJSãšã®çžäºéçšã«ãšã£ãŠéåžžã«æ®å¿µãªããšã ãšæããŸãã
@lukewagner ãããã¯ã¢ãžã¥ãŒã«ãªã³ã¯ã®ææ¡ã«ç²ŸéããŠããªãããæªãèããããããŸããããMVPã€ã³ããŒããšã€ã³ã¹ã¿ã³ã¹ã€ã³ããŒããåºå¥ããããšã¯å¥ã®ãªãã·ã§ã³ã§ã¯ãªãã§ããããïŒ ããããçµ±åãããŠããªãå Žåã§ããMVPã€ã³ããŒãã¯è€è£œãããå¯èœæ§ããããè€éãªäº€å·®ã¿ã€ãã¯å¿ èŠãããŸããã
éè€ã€ã³ããŒãã¯ãåãé¢æ°ãããŸããŸãªçœ²åãæã€ããšãã§ããJSã®ãããªåçèšèªããã®ã€ã³ããŒããåŒã³åºãã®ã«éåžžã«äŸ¿å©ã§ããå¢çã®åã·ã¹ãã ãè±å¯ã«ãªããšã䜿çšãããéãå°ãªããªãããšã¯ãªããšæããŸããæ°å€ãŸãã¯æåååŒæ°ããããã¯1ã€ãŸãã¯2ã€ã®åŒæ°ãæã€åãé¢æ°ã ãã®æ©èœãåé€ããããšã¯ãJSãšã®çžäºéçšã«ãšã£ãŠéåžžã«æ®å¿µãªããšã ãšæããŸãã
ãã®ã ããã®ååã ç§ã¯ãassemblyscriptéçºè ã«ãã¹ããã¬ãŒã ã¯ãŒã¯ãæäŸãããããžã§ã¯ãã®äž»èŠãªéçºè ã§ãããããã¯ããããçŸæç¹ã§Webã¢ã»ã³ããªã®æãéèŠãªéšåã®1ã€ã§ãããšèããŠããŸãã
0.00014ïŒ ã«ã¯ã @ jtennerã«ããAssemblyScriptã®ãã¹ãã©ã³ããŒã§ããããŠããŸããããã¯ãæé·ããAssemblyScriptãšã³ã·ã¹ãã ã®éèŠãªéšåã§ãã
éè€ã€ã³ããŒãã¯ãåãé¢æ°ãããŸããŸãªçœ²åãæã€ããšãã§ããJSã®ãããªåçèšèªããã®ã€ã³ããŒããåŒã³åºãã®ã«éåžžã«äŸ¿å©ã§ãã
WebAssemblyã®èµ·æºã¯JavaScriptãåãããã©ãŠã¶ãŒã«ãããããå°ãªããšãããã«ä»£ãããã®ãããã°ãããã¯çŽ æŽãããããšã§ãã ãã®ã¿ãŒã²ããã®ããã«ç©äºãç°¡åã«ä¿ã¡ãŸãããã
@tlivelyããã¯å¯èœãªä»£æ¿ãªãã·ã§ã³ã®1ã€ã§ããã¯ãããããããã¯ã»ãŒåãããšããã2ã€ã®æ¹æ³ããããšããäžå¹žãªçµæããããããŸããããã¯äžè¬çã«é¿ããã®ãè¯ãããšã§ãããããŠããã¯ãŸãå®è£ ãæ°ã«ããããå€ãã®ã±ãŒã¹ãäœæããŸãæ€èšŒããµãã¿ã€ãã®ãã§ãã¯ãããã³ã€ã³ã¹ã¿ã³ã¹åäžã
@jtenner @trusktræ確ã«ããããã«ãåãJSé¢æ°ãè€æ°åã€ã³ããŒãããããšãã§ããŸããå¯äžã®éãã¯ãã€ã³ããŒãã«äœ¿çšããåå¥ã®çœ²åããšã«ç°ãªãååãå¿ èŠã«ãªãããšã§ãã ãããã£ãŠãããšãã°ãæŸåºãã代ããã«ïŒ
(module
(import "env" "log" (func (param i32)))
(import "env" "log" (func (param f32)))
(import "env" "log" (func (param i64)))
(import "env" "log" (func (param f64)))
...
)
ãä»ããŠã€ã³ã¹ã¿ã³ã¹åïŒ
WebAssembly.instantiate(module, { env: { log:log } });
ããªããæŸåºããå¯èœæ§ããããŸãïŒ
(module
(import "env" "log_i32" (func (param i32)))
(import "env" "log_f32" (func (param f32)))
(import "env" "log_i64" (func (param i64)))
(import "env" "log_f64" (func (param f64)))
...
)
ã€ã³ã¹ã¿ã³ã¹åïŒ
WebAssembly.instantiate(module, { env: { log_i32:log, log_f32:log, log_i64:log, log_f64:log } })
ããã¯ããªããè¡ãããšãã§ããå¯èœæ§ã®ããå€æŽã§ããããããšãäœããã®æ¹æ³ã§æ³å€ãªãã®ã§ããïŒ
ããã¯ããªããè¡ãããšãã§ããå¯èœæ§ã®ããå€æŽã§ããããããšãäœããã®æ¹æ³ã§æ³å€ãªãã®ã§ããïŒ
çŠæ¢ïŒ ãããããªã³ã¯å ã®é¢æ°ã®ååãå€æŽããã ãã§ããã°åé¡ãããŸããã è¿·æã§ãããåé¡ãããŸããã æ£ããèãããŠããããšã確èªãããã ãã§ãã
ãã®ã¿ãŒã²ããã®ããã«ç©äºãç°¡åã«ä¿ã¡ãŸãããã
JavaScriptéçºè ã¯ããã®å€æŽã«ãã£ãŠæã圱é¿ãåããŸãã ãããŠãç§ãã¡ã¯ãWebã¢ã»ã³ããªãã§ããããããã®ãããªå°æ¥ã®åé¡ã«é¢ããŠWebéçºè ãã©ã®ããã«æ±ããã«ã€ããŠã¯éåžžã«æ³šæããå¿ èŠããããŸãã
ãããç©äºãããè¯ããããªããç§ã¯ãã¹ãŠå€åãæ±ããŠããŸãã ã§ããããç§ãæãéèŠã ãšæããã®ããæãéèŠã§ãªããã®ã®é ã«ã次ã®è³ªåããããŸãã
ç§ãèŠãéãïŒ å€åã ããã«ãããéçºè ã¯ã€ã³ããŒãã«ã€ããŠããæ確ã«ãªããJavaScriptéçºè ãjavascriptyãå°ãªãããããšãæããšã©ãŸãããŸãã ãã¶ããããå€ãã®å¶éã¯ããå€ãã®åµé æ§ã«ã€ãªãããŸãã ãããCïŒããã³Javaéçºè ã«ã©ã®ããã«åœ±é¿ããããšããããšã¯ã決ããŠè¡ãããŠããªãããã«æãããäŒè©±ã§ãã ããã¯ãWebã¢ã»ã³ããªã³ã³ãã€ã©ãäœæããCïŒéçºè ã«ãæªåœ±é¿ãäžãã
ããã«å¯Ÿããçãã¯ããããŸããã ã³ã³ãã€ã©éçºè ã¯ããã®çš®ã®ããšã«ç²ŸéããŠããã§ãããã ç§ã®æšæž¬ã§ã¯ãwasmãšã³ãžã³ãä¿å®ããããšããŠããéçºè ã«ãšã£ãŠã¯ãã䟿å©ã ãšæããŸãã ãããŠããããããã¯ããéããªãã§ãããããããã¯å°ãªããšãããã¯ããæ確ã§ãã¢ãžã¥ãŒã«ã®ç¶æ ãæ€èšŒããã®ãããç°¡åã«ãªãã§ãããã
ç§ã®ç¥ãéãããã®æ©èœã䜿çšããŠããå°æ°ã®äººã ã¯ãèªåãã¡ã®ãã®ãå£ããŠããŸããæ»ã£ãŠãœãããŠã§ã¢ãä¿®æ£ããæ¹æ³ãèŠã€ããªããã°ãªããªãããšã«äžæºãæ±ãã§ãããã
AssemblyScriptã®ãã¹ããã¬ãŒã ã¯ãŒã¯ãœãããŠã§ã¢ãä¿å®ããåŸããã®ãããªå°ããªå€æŽãäžè¬çãªãšã³ãéçºè ã«åœ±é¿ãäžããªãããšã«æ°ä»ããŸããã ãããã®å€æŽã¯ããšã³ã·ã¹ãã ãœãããŠã§ã¢ãéçºããŒã«ãããã³ã³ã³ãã€ã©ãä¿å®ãã人ã ã«åœ±é¿ãäžããŸãã ãã®ãããªä»æ§ã®åŸ®åŠãªå€æŽã«ãããéåžžã«å€§ããªãã«ãªã¯ãšã¹ããçºçããåŠçã«æ°æ¥ãŸãã¯æ°é±éãããå ŽåããããŸãã
ç§ã®æåŸã®tl; drã®æèŠïŒç§ã¯ãã®å€æŽã奜ãã§ã¯ãããŸããããå€æŽãå ããå Žåã¯ããã§ã«ãã³ããšã€ããå€ããŠãã ããã ä»ããé£éåå¿ãéå§ãããããæ°ããŸãã
ããã«ã¯ãã1ã€ã®æ¬ ç¹ããããŸãã
(module
(import "env" "log_i32_f32_f64" (func (param i32 f32 f64)))
(import "env" "log_f32_i32_f64" (func (param f32 i32 f64)))
...
)
ïŒããã³ã°ãªã³ã°ã®ããã«ïŒå ã®ã€ã³ããŒãåãä¿æããå¿ èŠããããã€ã³ããŒãåãå§çž®ããbinaryenã®ãã¹ãé©çšã§ããªãå Žåããã€ããªãµã€ãºã倧ãããªãå¯èœæ§ããããŸãã
ãã ããäžè¬çãªã±ãŒã¹ã§ã¯ããã»ã©å€§ããªåé¡ã§ã¯ãããŸãã
ç§ãèŠãŠããäž»èŠãªåé¡ã¯ããŠãŒã¶ãŒãã€ã³ããŒããªããžã§ã¯ããæåã§ãã³ã°ã«ããããã«ããã¹ãŠã®ã¢ãªãã£ãšåŒæ°ã®ã¿ã€ããäºåã«ç¥ã£ãŠããå¿
èŠãããããšã§ãããçŸåšãã³ã³ãã€ã©ã¯ãããšãã°Math
ãå
šäœãšããŠã€ã³ããŒããããŠãããšæ³å®ããã€ã³ããŒããçæã§ããŸãã³ã³ãã€ã«äžã«ã€ã³ããŒãåŒã³åºããçºçãããšãã«ãååã¯åãã§ãããã¢ãªãã£ãŸãã¯åŒæ°ã®ã¿ã€ããç°ãªããŸãã ããã§ã®ç°¡åãªäŸã¯Math.max
ãå°ãè€éãªã®ã¯ã眲åã
CGããŒãã£ã³ã°ã§è¡šçŸã§ããªãã£ãã®ã¯ãã¢ãžã¥ãŒã«ãªã³ã¯ã®ææ¡ãååããŒã¹ã®ãªã³ã¯ãããšã³ãžã³ã«èŠä»¶ãæŒãäžããããšããŠããããšã ãšæããŸããããã«ã¬ã€ã€ãŒãããã®ã¯åœç¶ã®ããšã§ããæŒãäžããããªãã§ãã ããã ããšãã°ãã³ã¢wasmã®ãã€ããªåœ¢åŒãå¶éããå Žåããšã³ãžã³ã¯æºæ ããŠããªãã¢ãžã¥ãŒã«ããã§ãã¯ããŠæåŠããå¿ èŠãããããšã宣èšããŠããŸãã åå®å šæ§ã劥åœãªãµã€ãºå¶éãããã³ãšã³ãžã³ã«ãšã£ãŠéèŠãªãã®ä»ã®äºé ã«ã€ããŠã¯ãããã¯å®å šã«çã«ããªã£ãŠããŸãã
ååã¯ãšã³ãžã³ã«ãšã£ãŠéèŠã§ã¯ãªããšç§ã¯äž»åŒµããŸãã ãããã¯åã蟌ã¿ããã¹ãããããšã ããéèŠã§ããããšã³ãžã³ã¯å®éã«ã¯ååã調ã¹ãå¿ èŠã¯ãããŸããïŒæåŠããããšã¯ã¯ããã«å°ãªãã§ãïŒã ããã¯ãä»ã®ã³ã¡ã³ãæäŸè ãèšåããJSã®éè² è·ç¶æ³ã§èšŒæãããŠããŸãã
UTF-8ã«ã€ããŠã®ç§ã®ã³ã¡ã³ãã¯ãã®æ¹ââåã«ãããŸããã ãšã³ãžã³ã¯ãäžæ£ãªååãæåŠããããšãé€ããŠãæåéãUTF-8åŠçãå¿ èŠãšããŸããã éè€ãããšã¯ã¹ããŒãã«ã€ããŠãåãã§ãã çªç¶UTF-8ããªããŒã¿ãŒãæåããå®è£ ããªããã°ãªããªãã£ãã®ã§ãããã¯ãŠã£ã¶ãŒããå®è¡ããã®ã«éåžžã«é¢çœãã«ãããããŸãã...ããŒãã ãŸããéè€ãšã¯ã¹ããŒããã§ãã¯ã¯ããŠã£ã¶ãŒããããã·ã¥ããŒãã«ã䜿çšããå¯äžã®å Žæã§ãã 100è¡ã»ã©ã®ã³ãŒããå±æ©ã§ãããšããããã§ã¯ãããŸãããããã以å€ã®å Žåã¯èšç®æåã®VMæŒç¿ã§ã¯å¥åŠãªããšã§ãã
ã¢ãžã¥ãŒã«ãªã³ã¯ææ¡ã®ç®æšã¯ãWasmã«æšæºã®ååããŒã¹ã®ãªã³ã¯ãœãªã¥ãŒã·ã§ã³ãæäŸããããšã§ããããšãç解ããŠããŸãããããã€ãã®çç±ãããäžè¬çã«ååã«æ©èœããªããªã¹ã¯ããããããçŠæ¢ããããšã«é Œãå¿ èŠããããšæããŸãããšã³ãžã³ã¬ãã«ã§ããšã³ãžã³ã®èŠ³ç¹ããèŠäºã«å®ç§ã§ãã
ã§ããããç§ã¯ä»¥åã®ææ¡ãæ¯æããããããã£ãšãªãã©ã«ã«ãã¹ãã§ãããããããéè€èŒžåºã®å¶éã解é€ãã¹ãã§ãã
ã¢ãžã¥ãŒã«ãªã³ã¯ã®ææ¡ã§ãååã®åé¡ã®ããã«ãªã³ã¯ã§ããªãã¢ãžã¥ãŒã«ãä»ããæåŠãããå Žåã¯ãã³ã¢wasmã®äžã®ã¬ã€ã€ãŒå¶éãšããŠå®å šã«åé¡ãªãããã§ãã ããããç§ãèšã£ãããã«ãã¢ãžã¥ãŒã«ãªã³ã¯ã®ææ¡ãéåžžã«å€ãã®ããã°ã©ãã³ã°èšèªã®ãªã³ã¯ã®åé¡ã解決ããªããªã¹ã¯ãããã代ããã«ãã¡ãŒã¹ãã¯ã©ã¹ã®ã¢ãžã¥ãŒã«ã®APIãå«ãããããã°ã©ã å¯èœãªãœãªã¥ãŒã·ã§ã³ãå¿ èŠã«ãªããŸãã ããããããã¯ããããããé·ãäŒè©±ã§ãããããã¯ããªãçãåé¡ã§ãã ãããããã§ã®ç§ã®èãã®æèã§ãã
ãããé¢çœã@titzerã ç§ãåããããªèããæã£ãŠããŸãã èŠããã«ãã³ã³ãã€ã«ãšãªã³ã¯ã¯æ¥ç¶ãããŠããŸãããããã§ãå¥åã®ãã®ã§ããããã®åé¡ã¯ãããããããŸãã«ãå¯æ¥ã«çµåãããŠãããšããã«ããªã¢ã§ãã
WebAssemblyã®ãã¹ãŠã®ãªã³ã¯é¢é£ã®åŽé¢ãåãäžããŠãå¥ã®ã»ã¯ã·ã§ã³ã«é 眮ããããšãæ³åã§ããŸãã ãã³ã³ãã€ã«ãã»ã¯ã·ã§ã³ã«ã¯åŒãç¶ãã€ã³ããŒãããããŸãããååã¯ä»ããããŠããŸããïŒã€ã³ããã¯ã¹ä»¥å€ïŒãããªã³ã¯ãã»ã¯ã·ã§ã³ãåããç©Žã ãã§ãã ãã³ã³ãã€ã«ãã»ã¯ã·ã§ã³ã«ã¯ãŸã ãšã¯ã¹ããŒããå«ãŸããŠããå¯èœæ§ããããŸãããããã§ãååããªããããªã³ã¯ãã»ã¯ã·ã§ã³ãååã®æäŸãæ åœããŸãã
ãããã£ãŠãã»ã¯ã·ã§ã³ããªã³ã¯ãããšãåã蟌ã¿è
åºæã®ã³ã³ãã³ããå«ãŸããå¯èœæ§ããããŸãã ããšãã°ãã€ã³ã¿ãŒãã§ã€ã¹ã¿ã€ãã®ãªã³ã¯ã»ã¯ã·ã§ã³ã¯adapter_func
æäŸã§ããŸãããJSã®ãªã³ã¯ã»ã¯ã·ã§ã³ã¯@tebbiã®WebAssembly / gcïŒ132ã®ããã«rtt
ãã£ã¯ã·ã§ããªãã€ã³ã¹ããŒã«ã§ããŸããã©ã¡ãã®å Žåãããã®è¿œå ã³ã³ãã³ãã¯ãç¹å®ã®åã蟌ã¿ã®ããã«çã«ããªã£ãŠãããšããã®ç¹å®ã®åã蟌ã¿ã®ããã«æ¥µããŠæçšã§ãã ã¢ãžã¥ãŒã«ã¿ã€ãã®ææ¡ã¯æ¬è³ªçã«å¥ã®ãªã³ã¯åã蟌ã¿ã§ãããç·åŒµã®äžéšã¯ãããã§æãæå³ã®ãããã®ïŒããšãã°ãåçŽãªãªã³ã¯è§£æ±ºã®åäžã®ååïŒãJSã§æãæå³ã®ãããã®ïŒããšãã°ããªãŒããŒããŒããããååïŒã§ã¯ãªããšããããšã§ãã
è£éºïŒããã¯ããžããã£ã³ã°ããµããŒãããã®ã«åœ¹ç«ã€å¯èœæ§ããããŸãã ã¢ãžã¥ãŒã«ã¯ããããã®é¢æ°ãçµã¿èŸŒã¿ãªã³ã¯ã·ã¹ãã ã«å ¬éããããšãªããåçã«çæããè¿œå ã®ã¢ãžã¥ãŒã«ããé¢æ°ãçŽæ¥åŒã³åºãããšãã§ããããšãæãã§ããŸãã
@titzerãèšã£ãããã«ãããããã®è°è«ã®ç¯å²ãè¶ ããŠããŸãããç§ã¯èªåã®èããã¢ã€ãã¢ã«ãæ··ãããã£ãã®ã§ãã
@dcodeIOãããŸã§èŠãŠãããã¹ãŠã®ã·ããªãªã§ãwasmã¢ãžã¥ãŒã«ãã€ã³ã¹ã¿ã³ã¹åããJSã³ãŒãã¯ãwasmã¢ãžã¥ãŒã«ãçæããã®ãšåãããŒã«ãã§ãŒã³ã«ãã£ãŠçæãããŸãïŒb / cã€ã³ã¹ã¿ã³ã¹åã«ã¯ãäžè¬ã«å€æ°ã®ã°ã«ãŒã³ãŒããå¿ èŠã«ãªãåŸåããããŸãïŒããã®æé»ã®è©³çŽ°ããŠãŒã¶ãŒã«ããã«ããããšãèªèããŠããŸããã ããããããªãã¯éã£ãèŠæ¹ãããŸãããïŒ
æ確ã«ããŠåŒ·èª¿ãããããšã®1ã€ã¯ãçŽç²ãªJSãšã³ã·ã¹ãã POVããã®éè€ã€ã³ããŒãã¯å±éºã§ããããã¯ãJS APIãšESMçµ±åã®äž¡æ¹ã«ãBã«éè€ã€ã³ããŒãããã2ã€ã®wasmã€ã³ã¹ã¿ã³ã¹AãšBãæ¥ç¶ããæ¹æ³ããªãããã§ãã Aã¯é©åãªçœ²åã§2ã€ã®é¢æ°ããšã¯ã¹ããŒãã§ããå¯èœæ§ããããŸãããBã¯ãã®ãã¡ã®1ã€ããã€ã³ããŒãã§ããŸããïŒ1ã€ã®çœ²åã§ã¯ãéåžžãäž¡æ¹ã®ã€ã³ããŒããæºããããšã¯ã§ããŸããïŒã
@titzerååãé ãããããšããé¡æãç解ããŠããŸãããçŸåšææ¡ãããŠããããã«ã¢ãžã¥ãŒã«ãã€ã³ããŒãããã®ã§ã¯ãªããç®æšãå®çŸããããã§ãã
(module
(import "other" (module
(import "foo" (func))
(export "bar" (func))
))
)
代ããã«ãã€ã³ããŒãã¿ã€ããã"foo"
ãš"bar"
ãåé€ããŠãçŽç²ã«äœçœ®çãªãã®ãæ®ãå¿
èŠããããŸãã
(module
(import "other" (module
(import (func))
(export (func))
))
)
åå¥ã®ã³ã³ãã€ã«ã·ããªãªïŒããšãã°ãå ±æã©ã€ãã©ãªãåºãåå©çšãããã¢ãžã¥ãŒã«ã«å解ããïŒã楜ãã¿ã«ããŠããå Žåãäœçœ®ã®é åºã«å®å šã«äŸåãããããããã¯å€ãC ++ã®å£ããããããŒã¹ã®åé¡ã®wasmããŒãžã§ã³ã«ã€ãªãããŸãã ããã¯ãã€ã³ããŒã/ãšã¯ã¹ããŒãåãä¿®æ£ãããã®ã§ãã ããã¯ããªããææ¡ããŠããããšã§ããïŒ ïŒãã¡ãŒã¹ãã¯ã©ã¹ã®ã¢ãžã¥ãŒã«åç §ããã³/ãŸãã¯ãã¡ãŒã¹ãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹/ã€ã³ã¹ã¿ã³ã¹åã«ã¯ãã¹ãŠãããšåãåé¡ãããããšã«æ³šæããŠãã ãããçŽäº€ããŠããŸããïŒ
ãããããããããªããææ¡ããŠãããã®ã§ã¯ãªãå Žåãã¢ãžã¥ãŒã«ãªã³ã¯ã®éèŠãªéšåã§ããååããããã£ãŠéè€ããã€ã³ããŒã/ãšã¯ã¹ããŒãã«ãã£ãŠåŒãèµ·ãããããããŸããããã©ã®ããã«éããããšãã§ãããããããŸããã
ããããç§ã¯äœçœ®ãªã³ã¯ãææ¡ããŠããŸããã ç§ã¯ããã確ãã«éåžžã«å£ããããã§ãããããšã«åæããŸãã
ããããJawaã®ãŠãŒã¹ã±ãŒã¹ãšã€ã³ã¿ãŒãã§ã€ã¹ã®çš®é¡ãèãããšãç®ç«ã€ã®ã¯ãå®éã«ããžãã¯ã解æããŠã€ã³ããŒãã«é©çšããå¿ èŠãããããšã§ãã Jawaã§ã¯ãã€ã³ããŒãåã¯æååã§ã¯ãªããå®éã«ã¯èšèªã®åŒã§ãããã€ã³ããŒãåŒæ°ã䜿çšãããšãåãšé¢æ°ãã€ã³ããŒããšããŠåãåãããšãã§ããŸãã Javaãé«çŽèšèªã®IMHOãšã®é 延ãã€ã³ãã£ã³ã°ã«å¯ŸããçŽç²ãªwasmãœãªã¥ãŒã·ã§ã³ã¯ãããŸããã äœã¬ãã«ã®ååããŒã¹ã®ãªã³ã¯ãœãªã¥ãŒã·ã§ã³ã¯ãéåžžã«éãããèšèªã®ã»ããã§æ§ç¯ãããããããªwasmãšã³ã·ã¹ãã ã«åœ¹ç«ã€å¯èœæ§ããããŸãããé·æçã«ã¯é«ã¬ãã«èšèªã®ãŠãŒã¹ã±ãŒã¹ã解決ããŸããã ã€ãŸããIMOã¯ãããé«ãã¬ãã«ã§ãªã³ã¯ãæ§ç¯ããã®ã«ååãªäžè¬çãªã¡ã«ããºã ãè¿œå ããã®ã§ã¯ãªããæ°ããéåžžã«éå®ããããšã³ã·ã¹ãã ã®äœæãå¯èœã«ããã¡ã«ããºã ãæ§ç¯ããŠããŸãã
ãããã£ãŠããã¡ãŒã¹ãã¯ã©ã¹ã®ã¢ãžã¥ãŒã«ã«ã€ããŠã®ç§ã®ã³ã¡ã³ãã é·æçã«ã¯ãå®å šã«ããã°ã©ã å¯èœãªãªã³ã¯ãå¯èœã«ãããªãã¬ã¯ã·ã§ã³ããã³JITing APIãå¿ èŠã«ãªããŸããéåžžã«å³æ ŒãªååããŒã¹ã®ãããã³ã°ã·ã¹ãã ã§ã¯ãèšèªã®å®éã®åé¡ãå®éã«è§£æ±ºããããååãªããŒããæäŸãããããããšã¯ã§ããŸããã
ãŸããååããŒã¹ã®ãããã³ã°ãéåžžã«è匱ã§ãã ã€ã³ããŒãçšã®ãã©ã¡ãŒã¿ãŒåã¡ã«ããºã ããŸã ãªããããèšèªã¯ååãã³ã°ãªã³ã°ã«é Œãå¿ èŠããããŸããããã¯éããŠå£ããããããµãã¿ã€ãããªãŒããŒããŒããªã©ã®åçŽãªãã®ã§ããµããŒãã§ããŸããã
ã³ã¡ã³ããé·ããªã£ãŠãã¿ãŸããã ç§ãã¡ã¯ä»ããã倧ããªåé¡ã«ã€ããŠå®éã«è°è«ããŠããŸãããããã¯ããããããã®ãããªçãåé¡ã§ã¯ãªãã¯ãã§ãã
ç§ãèŠããã¹ãŠã®ã·ããªãªã§ãwasmã¢ãžã¥ãŒã«ãã€ã³ã¹ã¿ã³ã¹åããJSã³ãŒãã¯ãwasmã¢ãžã¥ãŒã«ãçæããã®ãšåãããŒã«ãã§ãŒã³ã«ãã£ãŠçæãããŸãïŒb / cã€ã³ã¹ã¿ã³ã¹åã«ã¯ãäžè¬ã«ãå€æ°ã®ã°ã«ãŒã³ãŒããå¿ èŠã«ãªãåŸåããããŸãïŒ
ããšãã°ãAssemblyScriptã¯ã¢ãžã¥ãŒã«åºæã®ã°ã«ãŒã³ãŒããçæããŸããããçæãåé¿ããããšããŸãã åã«ãããŒããŒããšåŒã¶å°ããªæ±çšã³ã³ãããªã³JSã©ã€ãã©ãªïŒJSããã®ãã䟿å©ãªäœ¿çšæ³ã®ããã«é«ã¬ãã«ã®ãšã¯ã¹ããŒãåãããã³ã°ã«ããããšãã§ããŸãïŒã§äœ¿çšããããã®ã¿ã€ãå®çŸ©ïŒéçºç®çïŒã®ã¿ãåºåããŸãããããã䜿çšããããšã¯å€ãã®å Žåãªãã·ã§ã³ã§ãç¹ã«ãASã䜿çšããŠãæå°éã®Wasmã¢ãžã¥ãŒã«ãçæããããã®ãããã«åªããæ§æãšããŠäœ¿çšããå Žåãããšãã°ãå§çž®ã¢ã«ãŽãªãºã ïŒããšãã°ãCã®ãããªé¢æ°ã®ãšã¯ã¹ããŒãïŒã®å ŽåããŸãã¯WASIçšã«ã³ã³ãã€ã«ããå Žåã æçµçã«ã¯MyClass#myMethod
ãããªååãå€æŽããå¿
èŠããªããªãããšãé¡ã£ãŠããŸãããããããã®åé¡ã«é¢é£ããŠãããã©ããã¯ããããŸããã
JS APIãšESMçµ±åã®äž¡æ¹ã«ã2ã€ã®wasmã€ã³ã¹ã¿ã³ã¹AãšBãæ¥ç¶ããæ¹æ³ããªããããéè€ã€ã³ããŒãã¯å±éºã§ããããã§ãBã«ã¯ãAã§æºããå¿ èŠã®ããéè€ã€ã³ããŒãããããŸãã
ãããããWasmãšã¯ã¹ããŒããWasmã€ã³ããŒãã«ãªã³ã¯ããŠãããšãã«ããã®ã±ãŒã¹ã§ãšã©ãŒãçºçãã眲åã®äžäžèŽãæºããããªããªããšäºæ³ããŠããŸããããå®è¡æã«å€ãã®æ¥œããåäœãçºçããŸãã JSã€ã³ããŒããšã®äžäžèŽã®çœ²åããŸãã¯ä»ã®åçèšèªããã®ã€ã³ããŒãã
Wasmé¢æ°ã«ã¯åºå®çœ²åãããããïŒãã¹ãŠã®åŒæ°ã匷å¶ããŠæå®ããã眲åã«åãè¿ãJSãã¹ãé¢æ°ãšã¯ç°ãªãïŒãåãååã䜿çšããŠç°ãªã眲åãæã€è€æ°ã®Wasmé¢æ°ãã€ã³ããŒãããå¿ èŠãããçç±ã¯ããããŸããã ç§ã¯ãã®åæã誀解ããŸãããïŒ
æå®ãããã€ã³ããŒããWasmé¢æ°ã§ããå Žåãèªå匷å¶ãåŒã³åºãç°ãªãã·ã°ããã£ãæã€é¢æ°ãæå®ã§ããããã«æšæºãæ¡åŒµãããŠããªãéãããã®ã·ããªãªã§ãšã©ãŒãçºçããã®ã¯å®å šã«æ£åžžãªããã§ãã
ç§ã¯åœåãéè€ããã€ã³ããŒããåé€ããããšã«æ éã§ããããçŸåšã¯ãã®å€æŽã匷ãæ¯æããŠããŸãã
éèŠãªèŠ³å¯ã¯ã @ lukewagnerãææããŠããããã«ãéè€ããã€ã³ããŒãã¯ããŸããŸãªç°å¢ã§åŠçã§ããªããšããããšã§ãã ãããŠåœŒãèšãããã«ãããã¯JSã®ãŠãŒã¹ã±ãŒã¹ã§ãåé¡ããããŸãã
æãéèŠãªããšã¯ãåºæ¬çãªã¢ãžã¥ã©ãŒããããã£ãå£ãããšã§ããã€ãŸãããã¹ãŠã®ã€ã³ããŒããWasmãŸãã¯ãã¹ãã¢ãžã¥ãŒã«ã§çããå®è£ ã§ãããšããããšã§ãã ããã¯ãä»®æ³åãªã©ã®ãŠãŒã¹ã±ãŒã¹ã«ãšã£ãŠéèŠã§ãã
éè€ã€ã³ããŒãã¯ãã¯ã©ã€ã¢ã³ãåŽã§ãªãŒããŒããŒããŸãã¯åçåä»ãã¡ã«ããºã ã®ãããããå¹æçã«åŒ·å¶ããŸããããã¯ããã¹ãŠã®ã¯ã©ã€ã¢ã³ããããããµããŒãããæ段ãæã£ãŠããããã§ã¯ãªãããã§ãïŒä»ã®Wasmã¢ãžã¥ãŒã«ãå«ãïŒã
ãããŠããã¹ãã¹ã€ãŒãã®æŽå²ã瀺ããŠããããã«ãããã¯å®éã«ã¯å®éã®åé¡ã§ãã
@titzer ãç§ã¯ãã©ããŒããŠããªãã®ã§ã¯ãªãããšæããŸãã æ確ãªåœåã¯ããã©ã¡ãŒã¿åãšçŽäº€ããåé¡ã®ããã«æãããŸãã åŸè ããã£ããšããŠããååãïŒãã©ã¡ãŒã¿ãŒåãããïŒãšã³ãã£ãã£ãŒãäžæã«æ±ºå®ããããšã確èªããããšæããŸãã ä»ã®æ段ã§ãªãŒããŒããŒããããã€ã³ããŒãåã解決ããããšã¯ããããã®ä»ã®æ段ãããè€éã«ãªããšããã«è€éã«ãªãã®ã§ãããããããã«ããã§ããïŒ
ç§ãèšã£ãããã«ãååã¯ãšã³ãžã³ã«ãšã£ãŠéèŠã§ã¯ãªãã®ã§ããããã®äžææ§ããšã³ãžã³ã«ãšã£ãŠéèŠã§ã¯ãããŸããã ãããã¯_linkers_ã«ãšã£ãŠéèŠã§ãããããã€ã³ããŒãåïŒãŸãã¯ãã®ããšã«ã€ããŠã¯ãšã¯ã¹ããŒãåïŒã«äžææ§ãé©çšããå Žåã¯ãç¹å®ã®ãªã³ã¯ãœãªã¥ãŒã·ã§ã³ãéžæããŸãã ãããŠãéçã«ãããªã³ã«ãŒã¯ãæçµçã«ã¯å®å šã«ããã°ã©ã å¯èœãªãœãªã¥ãŒã·ã§ã³ãå¿ èŠãšããŸããããã¯ããã¡ãŒã¹ãã¯ã©ã¹ã®ã¢ãžã¥ãŒã«ãšã€ã³ã¹ã¿ã³ã¹ã ãã§ãªããJITãšãããã段éçã«æ§ç¯ããæ©èœã§ããããŸãã
ãã¹ãŠã®åé¡ã¯ãååã«åºã¥ããŠã€ã³ããŒããããšã¯ã¹ããŒããŸã§ãã¢ãžã¥ãŒã«ãéçã«åæå®ããããã¡ã³ã¯ã¿ãŒ[*]ã«ããããšããããšããæ¥ãŠãããšæããŸãã ãã®çµæãååã¯åã®äžéšã«ãªãããã®åãwasmã®èšèªã«å°å ¥ããã«ã¯ãåãã§ãã¯ãå¿ èŠã«ãªããããååã®äžèŽã«ãŒã«ãå¿ èŠã«ãªããŸãã ããããããã«é¢ããåé¡ã¯ããããã®ååãäœã¬ãã«ã®ååã§ããããã³ã°ã«ãããC / C ++åã«äŒŒãŠããããšã§ãã ãã®æçµçµæã¯3ã€ã®æªãããšã§ãïŒ
ãããã®åé¡ã¯ãéçã¢ãžã¥ãŒã«ã¿ã€ããå°å ¥ããããšããé¡æããçŽæ¥çããŠããŸããããã¯ããšã³ãžã³ã«åçŽãªãªã³ã¯ãœãªã¥ãŒã·ã§ã³ã®ååããŒã¹ã®ãããã³ã°ãå®è¡ãããããšã«ãã£ãŠåæ©ä»ããããŠããããã§ãã ãããå®éã«ã¯ããšã³ãžã³ã¯æ±ºããŠååãèŠãã¹ãã§ã¯ãããŸããã ãã1ã€ããªã³ã«ãŒã¯ååã調ã¹ãŠããšã³ãžã³çšã«ååã解決ããå¿ èŠããããŸãã ã¯ãããã®åé¡ã解決ãã1ã€ã®æ¹æ³ã¯ãAPIããªã³ã«ãŒã«ã€ã³ããŒãã®ãã¯ãã«ãæäŸãããšã¯ã¹ããŒãã®ãã¯ãã«ãè¿ãããšã§ããããã¯ããŠã£ã¶ãŒãã§è¡ã£ãããšã§ãããCåã蟌ã¿APIã®åäœæ¹æ³ã§ãã
[ ]ç§ããããèããŠããŸãããwasmã¢ãžã¥ãŒã«ã¯ã€ã³ããŒããããšã¯ã¹ããŒããŸã§ã®æ©èœã§ããã ããããããã¯éèŠãªäœããæ¬ ããŠããŸãïŒããé«ãã¬ãã«ã®èšèªããæ¥ããªã³ã¯ã®ããã®è«çã 説æã
@titzer ãã¢ãžã¥ãŒã«ãªã³ã¯ã®ææ¡ãå€ãã®ãŠãŒã¹ã±ãŒã¹ã«ååãªåŒ·åãªãªã³ã¯ã¢ãã«ãæäŸããªãããšã«åæããŸãïŒããšãã°ãCãªããžã§ã¯ããã¡ã€ã«ã眮ãæããããšã¯ã§ããŸããïŒããæ±çšãªã³ã¯ãæäŸãããšã¯æããŸããã¢ãã«ã¯ææ¡ã®ç®æšã§ãã ããã¯ãçŸåšã®æååããŒã¹ã®ã€ã³ããŒã/ãšã¯ã¹ããŒãã·ã¹ãã ã®æ¡åŒµã§ãããWebã§äžè¬çã§ãWasmã®ã¢ãžã¥ãŒã«æ§é ã«ããçšåºŠçµã¿èŸŒãŸããŠãããã³ãã©ãŒã¹ã¿ã€ã«ã®ãªã³ã¯ã«ååãã€æçšã§ãããšèããŠããŸãã ãšã«ããã¢ãžã¥ãŒã«æ§ãWebAssemblyã®äžã«éå±€åããå¿ èŠããããããé«æ°Žæºèšèªåºæã®ãªã³ã«ãŒã¯ãåœåã«é¢ããŠå¿ èŠãªããšãäœã§ãå®è¡ãç¶ããããšãã§ããŸãã
@titzerã€ã³ããŒããšãšã¯ã¹ããŒãã®ååãã¢ãžã¥ãŒã«ã®ã¿ã€ãã®äžéšã§ã¯ãªãå Žåãåé¿ããããšèšã£ãè匱æ§ã®åé¡ãåé¿ããããšãã©ã®ããã«ææ¡ããŸããïŒ
ãŸããä»®æ³åã®åé¡ã«ã©ã®ããã«å¯ŸåŠããŠããã®ããããããŸããã @rossbergã®ã³ã¡ã³ããèªãã§ãä»®æ³åã¯ããã§è§£æ±ºãã¹ãããåºæ¬çãªæ¢åã®åé¡ã§ãããå®éã«ã¯ã¢ãžã¥ãŒã«ãªã³ã¯ã®ææ¡ãšã¯äœã®é¢ä¿ããªãããšãç解ããŠããŸãã
ç§ã¯ãã®å€æŽã«å ±æããŠããŸãããWebAssembly / module-linkingïŒ7ãèŠããšãèæ ®ãããŠãããªãã·ã§ã³ã¯ããŸããªãããã§ãã 亀差åã«ã€ããŠã¯å€ãã®è°è«ããããŸããã亀差åã䜿çšããå€æãJS APIãªã©ã®åŒ·å¶ãªã³ã¯ã·ã¹ãã ã§ã¯æ©èœããªãããšã«ã€ããŠã¯èšåãããŠããŸãããããã¯ãããã§èšåãããŠãããŠãŒã¹ã±ãŒã¹ã®äžéšãäŸåããŠãããã®ã§ãã èæ ®ããããã¹ãŠã®ãªãã·ã§ã³ã¯ãè¡šé¢èšèªã®ã¢ãžã¥ãŒã«æ§é ã«åºã¥ããŠããããã§ãïŒäž»ã«ãAndreasã®ç¹ã«é¢æ°åèšèªã®ã¢ãžã¥ãŒã«ã«é¢ããç¥èã«åºã¥ããŠããŸãïŒããäœã¬ãã«ã®ã¢ãžã¥ãŒã«æ§é ã«ã€ããŠã¯ããŸãèæ ®ãããŠããªãããã§ãã äœã¬ãã«ã®ã¢ãžã¥ãŒã«ã·ã¹ãã ã¯ãã¢ãžã¥ãŒã«ãªã³ã¯ã®ææ¡ïŒååããŒã¹ã®è§£æ±ºãå«ãïŒã®ç®æšãæãããªãããããã§ã®åé¡ãç°¡åã«è§£æ±ºããŸãã åæã«ãããã€ãã®éèŠãªæ¡åŒµæ©èœãæ§ç¯ããæ¹ãç°¡åã§ãã
@RossTate ãããã§ãäœã¬ãã«ã¢ãžã¥ãŒã«ã·ã¹ãã ããšåŒãã§ãããã®ãããã§ã«èª¬æãããã®ãšã©ã®ããã«éãã®ãããããŸããã ããŸããŸãªãœãªã¥ãŒã·ã§ã³ã®ã¢ã€ãã¢ãããå Žåã¯ã httpsïŒ//github.com/WebAssembly/module-linking/issues/7ã§è°è«ããŠãéè€ã€ã³ããŒããçŠæ¢ããç¹å®ã®ææ¡ããããœãªã¥ãŒã·ã§ã³ã«ãã®åé¡ãéäžãããããšãã§ããŸãã
https://github.com/WebAssembly/module-linking/issues/7#issuecomment -791063260ã«ã¡ã¢ãæ®ããŸãããããã¯ãæ¢åã®ã³ãŒãã®äžäœäºææ§ã®åé¡ãåŒãèµ·ããããšãªããã¢ãžã¥ãŒã«ãªã³ã¯ã®æ€èšŒã®äžéšã«ãªãåŸããã©ãããå°ããŠã
ããã¯ãŸãã«ç§ãçŽé¢ããã®ã«ãšãŠãæéãããã£ãåé¡ã§ãã ã¢ãžã¥ãŒã«ã«ã¯ãã€ã³ããŒãã«é¢é£ä»ããããååãšå¶çŽã«æå³ãäžããã€ã³ããŒãããã»ããµãèæ ®ããªãã¿ã€ãã¯ãããŸãããã€ãŸããã€ã³ããŒãïŒååä»ãïŒãããšã¯ã¹ããŒããŸã§ã®çŽç²é¢æ°ã§ãã ãããã¯èŒžå ¥ã«æå³ãäžããããã«ãªã³ã¯ã·ã¹ãã ãå¿ èŠãšããŸãã ç§ãã¡ããã®ãã€ã³ããééãããŸã§ãç§ãèšã£ãŠããããšã®æ®ãã®ã©ããæå³ããããŸããã ããã¯ãã¢ãžã¥ãŒã«ãªã³ã¯ã®ææ¡ã«ãããéåžžã«åºæ¬çãªä»®å®ã§ãããè°è«ã®ããã«æããã«ãããŠããªããšæããŸãã ãããŠãç§ãã¡ã¯ãããæ¬åœã«çã£ãŠããªããšæããŠããŸãã äžå¯§ã«æãããããæ·±ã質åããŠããã®ã§ãç¹°ãè¿ããŠããããã§ãã ãã¡ããã倱瀌ãªããšãæå³ããããã§ã¯ãããŸããããã¢ãžã¥ãŒã«ããã¡ã³ã¯ã¿ãŒã®ããã«èŠããå¿ èŠãããããšã«ææŠããã€ããã§ãã ãããŠãç§ãã¡ã¯ãããçã£ãŠããŸããã
ã¢ãžã¥ãŒã«ããã¡ã³ã¯ã¿ãŒã§ããããšãæããã«ããã§ã¯ãªãçç±ã«ã€ããŠãäŸã次ã ãšæããããšãã§ããŸãã
wasmã¢ãžã¥ãŒã«ãJavaScriptã«ãªã³ã¯ããã«ã¯ãimportsãªããžã§ã¯ããçµç±ããŸããimportsãªããžã§ã¯ãã¯ãå®éã«ã¯ãããã·ã§ãããããã¥ãŒãªã³ã°å®å šããžãã¯ãååã«é©çšããåäœïŒããšãã°ãååã®ãã³ãŒãïŒãæã€ããšãã§ããç¶æ ãããããããã¡ã³ã¯ã¿ãŒãšããŠãã£ã¹ãããŸãã ããã¯æåéããJavaScriptãªããžã§ã¯ãã®ã€ã³ããŒããã€ã³ããŒãã«ãã£ãŠåãåãããã¢ã«ãŽãªãºã ãšããŠæäœäžå®çŸ©ãããŠããŸãã ãã®ãªã³ã¯ãšã³ã·ã¹ãã å šäœãã¢ãžã¥ãŒã«ãªã³ã¯ã§è¡šçŸããããšã¯ã§ããŸããã
Cåã蟌ã¿APIãåãæ¹æ³ã§ãã ããã¯ãå®å šã«æ€æ»å¯èœãªãšã³ãã£ãã£ãšããŠåã蟌ã¿ã«ã¢ãžã¥ãŒã«ãæäŸããæ€æ»çšã®ååãçš®é¡ãããã³çœ²åãåããŠããŸãã ã¢ãžã¥ãŒã«ãã€ã³ã¹ã¿ã³ã¹åããããã«ãåã蟌ã¿è ã¯ãã€ã³ã¹ã¿ã³ã¹åã®ããã«ãšã³ãžã³ãžã®ãã€ã³ãã£ã³ã°ãïŒã¯ããäœçœ®çã«ïŒæäŸããã ãã§ããéãã奜ããªããžãã¯ãé©çšã§ããŸãã ãŸããå®å šã«ããã°ã©ã å¯èœã§ãã¢ãžã¥ãŒã«ãªã³ã¯ã§è¡šçŸãããŠããªããšã³ã·ã¹ãã ã
ãžã£ã¯ããã¯ããããªæãã§ãã Jawaã¯å®å šã«éçã«åæå®ãããŠããŸããããã®ã€ã³ããŒãã¯ãåçŽãªååã®äžèŽãé©åã§ãªãæ¹æ³ã§ã€ã³ããŒãèšèªã§ãšã³ã³ãŒããããŠããŸãã Jawaã©ã³ã¿ã€ã ã¯ããšã³ãžã³ã«æäŸããæ°ããé¢æ°ãåãããã³ãã®ä»ã®ãã€ã³ãã£ã³ã°ãåæïŒJITïŒããå¿ èŠããããŸãã Pywaã¯å®å šã«åçã«åæå®ãããŠããããã®JSå®è£ ã¯åæ§ã®æ¹æ³ã§ãªãŒããŒããŒãã䜿çšããŸãã
ã¢ãžã¥ãŒã«ãšãã®ã€ã³ããŒãã¯ããªã³ã¯ã¹ããŒã ãèšèªãã€ã³ããŒãããã»ããµãªã©ãäœãšåŒã³ããããšããã³ã³ããã¹ãã§ã®ã¿æå³ããããŸãã ç¹°ãè¿ããŸããããããã¯ãã¡ã³ã¯ã¿ãŒã§ã¯ãããŸããã ã¢ãžã¥ãŒã«ã®ã€ã³ããŒãã¯ããšã³ãžã³ãç解ã§ããªãããŸãã¯ç解ã§ããªãå€åœèªã§æžããããå€éšããå¿ èŠãªãã®ã®èª¬æã§ãã ã¢ãžã¥ãŒã«èªäœã¯Wasmã®åã·ã¹ãã ã«åŸã£ãŠã€ã³ããŒããšã¯ç¡é¢ä¿ã«åå¥ã«ã¿ã€ããã§ãã¯ã§ããããã«ããŸãã€ã³ããŒãã¯ã€ã³ããŒãå¶çŽã«èšè¿°ãããŠããä»®å®ã«ç §ãããŠãã§ãã¯ã§ããããã«ãWasmã¿ã€ãã®ã¿ããããŸãã ããã§ããã¢ãžã¥ãŒã«ãwasm-yåã®ãã¡ã³ã¯ã¿ãŒã«ããããšãããŸã§ãååã«ã€ããŠã¯äœã衚瀺ãããŸããã ãããããããã®ååã¯çŽ«è²ã§ãïŒ ããã§ããã¹ãŠã®ãœãŒã¹èšèªãåç¶ããŸãã ãã¡ãããæååã®æ¯èŒã§ãããããããåãããšã¯ããŸããããŸããã
ããã念é ã«çœ®ããŠãã食ãæ°ã®ãªãããªã³ã¯ãœãªã¥ãŒã·ã§ã³ãäœããããšããé¡æã¯æªããã®ã§ã¯ãããŸããã ååãããŸãã¯ã¬ã€ãžãŒã§ãªãå Žåãããã¯çã«ããªã£ãŠããŸãã ããã¯ãååãéåžžã«åçŽã§ãåçŽãªãããã³ã°ã§ååãªå°ããªãšã³ã·ã¹ãã ãäœæãããããªãã®ã§ãã ããã¯æ£ããããªããã£ãã§ã¯ãªãã®ã§ãããªããã£ãã§ããå¿ èŠã¯ãããŸããã å®å šã«ããã°ã©ã å¯èœãªãªã³ã¯APIã§ããæ¬åœã«å¿ èŠãªãã®ã«å°éãããšãã«ãã€ãŸãããå¥åŠãªç£èŽ ã«ãªããªã¹ã¯ãããæ¹æ³ã§ããã®ä»®å®ãçŽæ¥wasmã®ã³ã¢ã«çŒãä»ããŠããã®ã§ãããã¯æããã§ãã ãªã³ã¯çšã®ããã°ã©ã å¯èœãªAPIãããã°ãã¢ãžã¥ãŒã«ãªã³ã¯ã®ææ¡ã¯åãªãã©ã€ãã©ãªã§ããå¯èœæ§ããããŸãã ãããã£ãŠãCåã蟌ã¿APIãããæšæºçãªwasm APIã«å€æãããã®APIã«å¯Ÿããã©ã€ãã©ãªãšããŠã¢ãžã¥ãŒã«ãªã³ã¯ãäœæããæ¹æ³ãæ€èšããå¿ èŠããããŸãã
@lukewagner ãè匱æ§ãã®åé¡ïŒååãç Žæ£ããããšã
ãããŠãããããã®åé¡ã«ã€ããŠã¯ãç§ããã°ããèããŠããéè€ã€ã³ããŒãã®åªãããŠãŒã¹ã±ãŒã¹ããããŸããããã§ããéè€ã€ã³ããŒãã¯ãã€ã³ã©ã€ã³ãã£ãã·ã¥ãå ±æããïŒãŸãã¯å ±æããªãïŒãšããè°è«ãŸã§ãããŸãã ããšãã°ãJavaScriptããããã£ã¢ã¯ã»ã¹ãå®è¡ããé¢æ°ãã€ã³ããŒãããå Žåã¯ããGetProperty [foo]ããšããååãä»ããããšãã§ããŸãã äžåºŠã ãã€ã³ããŒãããå Žåããšã³ãžã³ã¯ã©ã®ã€ã³ã©ã€ã³ãã£ãã·ã¥ã䜿çšããå¿ èŠããããŸããïŒ wasmã³ãŒããæ€æ»ããŠãæ°ããåŒã³åºããµã€ããçæããå¿ èŠããããŸããïŒ ã¢ãžã¥ãŒã«ããŸã£ããåãååã§åãé¢æ°ãè€æ°åã€ã³ããŒãã§ããããæ¯åæ°ããICãååŸã§ããå Žåãã¢ãžã¥ãŒã«ã¯ããšã³ãžã³ãããŸããŸãªããªã¢ãŒãã£ãºã ã«ã©ã®ããã«é©å¿ããããå¶åŸ¡ããæ段ãåããŠããŸãã ïŒãã¡ãããæååã®æåŸã«æããªäžæã®ãžã£ã³ã¯ã貌ãä»ããããšã¯ãã€ã§ãã§ããŸããããªãããããããã®ã§ããïŒããã¯ãwasmã§äœ¿çšããŠããªããŸã£ããç°ãªããã®ããã®å¶éãåé¿ããã ãã§ãã
@titzerããªãã
ç¬ç«ããŠãããã§æ ¹æ¬çãªè³ªåã§ãããšç§ãåŠãã ããšã¯æ®ã£ãŠããŸãïŒwasmã¢ãžã¥ãŒã«ã¯wasmãšã¯ã¹ããŒããä»®æ³åã§ããã¹ãã§ããïŒ ãwasmã¢ãžã¥ãŒã«ã¯ã©ã®ããã«ãªã³ã¯ãããã®ãããšãã質åãå®å šã«èã«çœ®ããŠãããã¯CGã«æå±ããååã®åºæ¬çãªè³ªåã®ããã§ãã ãªã³ã¯ã«é¢ãã質åãšã¯é¢ä¿ãªãããã®è³ªåã ãã«çŠç¹ãåœãŠãã®ã¯ãå¥ã®èšèšäžã®åé¡ã«å€ããã®ã§ã¯ãªãããšæããŸãã
ä»®æ³åã¯éèŠã§ãããããã°ã©ã å¯èœãªãªã³ã¯ã¯ç¢ºå®ã«ããããµããŒãããå¿ èŠããããŸãã
å®éãç§ã話ããŠããããšã¯ãä»æ¥ã®wasmãšããã»ã©å€ãããªããšæããŸãããããŠãç§ã話ããŠããããšã¯ããžã£ã¯ã ãã«åãããããã®ã§ã¯ãããŸããã .NETãŸãã¯ä»ã®èšèªã©ã³ã¿ã€ã ã®ãªã³ã¯ã«ã€ããŠèãããšãã«ãåãããšãèµ·ãããŸãã äžèšã®3ã€ã®äŸãæããŸãããããã®ãã¡ã®2ã€ã¯çŸåããåã蟌ã¿ã§ãããå¥ã®èšèªã«åã蟌ãŸããŠãããããå®å šãªããã°ã©ã å¯èœæ§ãåŸãããŸãã
CGã®ãã¬ãŒã³ããŒã·ã§ã³ããŸãšããããšæããŸãã
Fwiwã¯ãWasmãããå°ãªããŠãŒã¹ã±ãŒã¹ã§ã¯ãªãããå€ãã®ãŠãŒã¹ã±ãŒã¹ã§å®è¡å¯èœã«ãããšããtitzerã®ææ¡ãç解ããŠãããããä»ã®æ¹æ³ãããã¯ããã«ç§ã®æåŸ ã«æ²¿ã£ãŠããŸãã ä»ã®å Žæã§ãåæ§ã®çç±ã§åæ§ã®åé¡ã§ãã§ã«èµ·ãã£ãŠãããã¹ãŠã®è«äºãèãããšãWasmã®æ¹åæ§ã«ã€ããŠã®ããäžè¬çãªè°è«ãå¿ èŠã«ãªãå¯èœæ§ãããããšã瀺åãããšãããŸã§è¡ããŸãã
ããšãã°ãç§ã¯æ¬¡ã®ãããªã¹ããŒãã¡ã³ããèŠã€ããŸã
ããªããç¯ããŠããèŠè§£ã¯ãwasmãæå®ãããå®è£ ãããä»æ¥åºã話é¡ã«ãªã£ãŠããæ¹æ³ããããªãé¢ããŠããã®ã§ããã®èŠç¹ã®å€æŽãCGã«ææ¡ããããçšåºŠã®è³åãåŸãããšã¯ããªãã®è² æ ã ãšæããŸããããã¯ãwasmã®æ§è³ªã§ãããšäž»åŒµã§ãããã®ã ãšã¯æããªãã§ãã ããã
æèã®äžã§æ·±ãæžå¿µããŠããã ããã§ã¯ãwasmã®æå®æ¹æ³ã«ããã«åºç¯ãªåé¡ãããå¯èœæ§ããããã©ã¡ãã®åŽãåºçºããã®ãã¯ç§ã«ã¯ããããŸããã
@titzerç§ã¯äž»ã«ããªããèšã£ãŠããããšã®ãã®éšåïŒãããŠãã¹ãŠã®çµæïŒã«èšåããŠããŸããïŒ
ã¢ãžã¥ãŒã«ã«ã¯ãã€ã³ããŒãã«é¢é£ä»ããããååãšå¶çŽã«æå³ãäžããã€ã³ããŒãããã»ããµãèæ ®ããªãã¿ã€ãã¯ãããŸããã ããã¯ãããã¹ããã¡ã€ã«ã®çš®é¡ãå°ãããããªãã®ã§ãã
ããã¯ãçŸåšã®ä»æ§ïŒããšãã°ããã®éšåïŒããã®å€§å¹ ãªéžè±ã«ãªããŸãã
@lukewagnerãããææããŠãããŠããããšãã
ãã®å®åŒåã§ã¯ïŒã¢ãžã¥ãŒã«ã®ãªã³ã¯ã«é¢ããè°è«ãææããŠããããã«ïŒãã€ã³ããŒããšãšã¯ã¹ããŒãã¯ãã¯ãã«ã§ããããããã£ãŠäœçœ®çã§ãã ããã¢ãžã¥ãŒã«ã®ïŒäœçœ®ïŒãšã¯ã¹ããŒããå¥ã®ã¢ãžã¥ãŒã«ã®ïŒäœçœ®ïŒã€ã³ããŒãã«ãã€ã³ãããã«ã¯ããããã³ã°é¢æ°ãå¿ èŠã§ãã ã食ãæ°ã®ãªããæ£ç¢ºãªååç §åé¢æ°ã¯1ã€ã®éžæè¢ã«ãããããã®ãããã³ã°é¢æ°ããã¹ãèšèªã§å®å šã«ããã°ã©ã å¯èœã§ããä»ã®2ã€ã®åã蟌ã¿ããã§ã«ããããšãææããŠããŸãã
@titzerããã¯æ¬åœã§ããã泚æããŠãã ããïŒJS APIã¯å®å
šã«ããã°ã©ã å¯èœã§ããã«ãããããããïŒç°ãªãã¿ã€ãã®ïŒéè€ããã€ã³ããŒããæã€wasmã¢ãžã¥ãŒã«ãæäŸãããšãJSAPIã䜿çšããŠãããã®ã€ã³ããŒããwasmãšã¯ã¹ããŒãã§å®è£
ããããšã¯ã§ããŸããWebAssembly.instantiate()
ã§ååã«ãã¯ã¢ããã䜿çšããŠããããã åãããšãESMçµ±åã«ã
ãããã£ãŠãç§ãã¡ãå°ããªããã°ãªããªã質åã¯ããwasmãšã³ã·ã¹ãã å šäœã§å¿ ç¶çã«åºçŸããç¡æ°ã®wasmãªã³ã¯ã¹ããŒã ããéè€ã€ã³ããŒãã®ä»®æ³åããµããŒãããããšã«ãªãã®ã§ããããïŒããšããããšã ãšæããŸãã ãããŠãç§ãã¡ã®çŸåšã®ãµã³ãã«ã»ããã«åºã¥ããšãããã¯ããããããªãããã«èŠããŸãã
WebAssemblyã®ã€ã³ããŒããšãšã¯ã¹ããŒãã«é¢é£ä»ããããæååããªãã£ããšæ³åããŠãã ããã JS APIã¯ãçŽç²ã«äœçœ®ã€ã³ããã¯ã¹ã䜿çšããŠãã€ã³ããŒããšãšã¯ã¹ããŒãã«ã¢ã¯ã»ã¹ããŸãã ç§ã®ç¥ãéããæ¢åã®ããŒã«ãã§ãŒã³ããã®ãããªèšå®ã§æ©èœãããã®ã¯ïŒçžå¯Ÿçãªæå³ã§ïŒç°¡åã§ãã ïŒå Žåã«ãã£ãŠã¯ãemscriptenã®ãããªãã®ããã€ã³ã©ã€ã³ãJSã³ãŒãïŒ EM_ASM
ïŒãããã¯ã¢ããããããã«ä»»æã®ååãçæããå¿
èŠããªããããããç°¡åãªå ŽåããããŸããïŒ
ãã®ãããªäžçã§ã¯ãä»®æ³åã®åé¡ã¯ãããŸããã ã€ãŸããä»®æ³åã®åé¡ã¯ãäœçœ®ã€ã³ããã¯ã¹ã§ã¯ãªãååã䜿çšããããšãéžæããããšãåå ã§çºçããŸãã äž¡æ¹ãJSAPIã§äœ¿çšã§ããããã«ããããšã§ãäžäœäºææ§ã®ããæ¹æ³ã§ããã解決ããããšãã§ããŸãã
éèŠãªã®ã¯ãéäœçœ®ã®ã€ã³ããŒã/ãšã¯ã¹ããŒãã¯ãå®éã«ã¯ãwasmã¢ãžã¥ãŒã«ã®ãšã³ã·ã¹ãã ãžã®çµ±åã容æã«ããããã«äœ¿çšãããåã蟌ã¿åºæã®è£ 食ã§ãããšããããšã§ãã ãããã®è£ 食ãã©ã®ããã«æå®ããããã¯ãçæ ç³»ã®ïŒæ¢åãŸãã¯äºæ³ãããïŒèŠç¯ã«å®éã«é©åãããå¿ èŠããããŸãã
ããšãã°ãESMçµ±åã§ã¯ãä»ã®ã¢ãžã¥ãŒã«ã«ãã£ãŠãšã¯ã¹ããŒããããJSå€ããªãŒããŒããŒããããå¯èœæ§ããããŸãããWebAssemblyã¯ãªãŒããŒããŒãããµããŒãããŠããªããããESMã€ã³ããŒã/ãšã¯ã¹ããŒãè£ é£Ÿãã¶ã€ã³ã¯ãã®ã®ã£ãããåããŠãWebAssemblyã¢ãžã¥ãŒã«ãå€ãã®JSã®ä»£ããã«ãªãããã«ããå¿ èŠããããŸãå¯èœãªéãã¢ãžã¥ãŒã«ã ããã¯ãå¥ã®JSã¢ãžã¥ãŒã«ããã€ã³ããŒããããé¢æ°ã®ããŸããŸãªãªãŒããŒããŒããæœåºããããã«ãéè€ããã€ã³ããŒããšåæå®ã®åŒ·å¶ãè¡ãããšã§å®è¡ã§ããŸãã ãšã¯ã¹ããŒããããã¿ã€ãããã¹ãŠãååã«åé¢/åºå¥å¯èœãªãã©ã¡ãŒã¿ãŒãæã€é¢æ°ã§ãããåäžã®ãªãŒããŒããŒããããJSé¢æ°ã«çµåã§ããéããéè€ãšã¯ã¹ããŒããèš±å¯ããããšãã§ããŸãã ãããŠãã¡ãããããããé·æãšçæãæã€ä»ã®ãã¶ã€ã³ãªãã·ã§ã³ããããŸãã
å¯Ÿç §çãªäŸãšããŠãWebAssemblyã®äž»èŠãªåã蟌ã¿èšèªããäœçœ®ãã©ã¡ãŒã¿ãŒã§ã¯ãªãé¢æ°ã®ååä»ããã©ã¡ãŒã¿ãŒãäž»ã«äœ¿çšããŠãããšä»®å®ããŸãã ãã®å Žåãã€ã³ããŒããšãšã¯ã¹ããŒãã®è£ 食ã¯ããªãç°ãªããé¢æ°ã®ãšã¯ã¹ããŒãã«ãã£ãŠãã¹ãŠã®ãã©ã¡ãŒã¿ãŒã«ååãå²ãåœãŠãããŸãã ããããäœã¬ãã«ã§ã¯ãWebAssemblyã¢ãžã¥ãŒã«ã¯äŸç¶ãšããŠäœçœ®ã®ã€ã³ããŒããšãšã¯ã¹ããŒãã«ãããŸããã
ã ãããããäžæ©äžãã£ãŠåé¡ã解決ããããšãææ¡ããã®ã§ãã ãã³ã¢ãWebAssemblyã¢ãžã¥ãŒã«ãªã³ã¯ãã€ãŸãåããã¡ã€ã«å ã§å®çŸ©ãããWebAssemblyã¢ãžã¥ãŒã«ããªã³ã¯ããããã«äœ¿çšãããã®ïŒããšãã°ãã€ã³ã¿ãŒãã§ã€ã¹ã¿ã€ãã¢ããã¿ã¢ãžã¥ãŒã«ããããé©å¿ããã¢ãžã¥ãŒã«ã«ãªã³ã¯ããããïŒã¯ãå®äœçœ®ã§ããå¿ èŠããããŸãã ãåã蟌ã¿ãWebAssemblyã¢ãžã¥ãŒã«ãªã³ã¯ãã€ãŸããç¹å®ã®ãšã³ããããŒå ã®å¥ã ã®ãã¡ã€ã«ã§å®çŸ©ãããWebAssemblyãšãšã³ããããŒåºæã®ã¢ãžã¥ãŒã«ã®äž¡æ¹ããªã³ã¯ããããã«äœ¿çšãããã®ã¯ããšã³ããããŒåºæã®ã»ã¯ã·ã§ã³ã§ããããšã³ããããŒéã®å€æãå®çŸ©ããäž»ãªåœ¹å²ãæãããŸãã匷å¶é¢æ°ããšã¯ã¹ããŒããããé¢æ°/ã€ã³ã¹ã¿ã³ã¹/ã¢ãžã¥ãŒã«ãžã®è£ 食ã®è¿œå ãïŒã·ã³ã°ã«/ããã«/ãªã¹ããªãïŒååãšäœçœ®ã€ã³ããŒãã®é¢é£ä»ããªã©ãç¹å®ã®ã³ã³ã¹ãã©ã¯ããšWebAssemblyã³ã³ã¹ãã©ã¯ãã ããããã°ããã³ã¢ãWebAssemblyã¯æ°ãšäœçœ®ä»¥å€ã®ããšãå¿é ããããšã¯ãªããéè€ã€ã³ããŒããªã©ã®åé¡ã¯ãã³ã¢ãåé¡ã§ã¯ãªããåã蟌ã¿è åºæã®åé¡ã«ãªããŸãã
ãã®èãæ¹ã§ããã®åé¡ã¯ãJS APIãŸãã¯ESã¢ãžã¥ãŒã«ã®å Žåã2ã€ã®ã€ã³ããŒããåãæååã«é¢é£ä»ããããšãèš±å¯ããå¿ èŠããããŸããïŒããšæžãçŽãããšãã§ããŸãã çãã¯ã¢ãžã¥ãŒã«ãªã³ã¯ã®ææ¡ã«ã¯æå³ããããŸããã ããã¯æçšãªè³ªåã§ãããäž»ãªè°è«ã¯ïŒç§ãæãã«ïŒååšããŠã¯ãªããªãçµåã«åºã¥ããŠãããããçŸæç¹ã§ã¯è¯ãçããåŸãã®ã¯é£ããã§ãã
ç§ã¯ãäœçœ®ã®ã€ã³ããŒã/ãšã¯ã¹ããŒãã質åå šäœã®éè€ãåé¿ããããšã«åæããŸãã ãã ããé¿ãããåé¡ã¯ãå¥ã ã®æéã«å¥ã ã®ã³ã³ãã€ã«ãè¡ãå ŽåãããŒãžã§ã³ç®¡çã«æ³šæãæãå¿ èŠãããå Žåãäœçœ®ã®ã€ã³ããŒã/ãšã¯ã¹ããŒãã«ã¯ãã³ã³ããŒãã³ãã·ã¹ãã ã§å ·äœçã«æããããå€å žçãªè匱ãªåºæ¬ã¯ã©ã¹ã®åé¡ããããŸãã ïŒäœçœ®ïŒC ++ vtableã¬ã€ã¢ãŠãã«åºã¥ãCOMã®ãããªãã®ã§ãã
@RossTateãš@titzerãäœãææ¡ããŠããã®ããç解ããå Žåãããã¯ãã¹ãã¬ã€ã€ãŒã§è§£æ±ºããå¿
èŠã®ããåé¡ã§ããããã¹ãããã®ãã¹ãã«é©åãªååãå°å
¥ã§ããããã«ããŸãã ç§ãèŠãŠããåé¡ã¯ããã®çãã«æ®ã£ãŠãããšããããšã§ããããã¯ãwasmããŒã«ã®ãšã³ã·ã¹ãã ããã¹ãããšã«æ¬è³ªçã«åå²ããŠãããšããããšã§ãã ããšãã°ãclangãäœããã®åœ¢ã®ãªã³ã¯ãå®è¡ãããå ŽåïŒããšãã°ãäžè¬çãªlibc
ãé€å€ããããïŒããclangã¿ãŒã²ãã£ã³ã°wasmãã䜿çšããããšã¯ã§ããŸããïŒããã¯ããã®æ°ããã«ããŽãªã®é«åºŠãªæé©åã§éèŠã§ãããã«ãã¢ãžã¥ãŒã«wasmå®è¡ãã©ãããã©ãŒã ïŒïŒ-ã¿ãŒã²ãããšããŠãããã¹ãŠã®ç°ãªãå
·è±¡ãã¹ãã«ã€ããŠclangã«æãããã¹ããclangã®ãã©ã¡ãŒã¿ãŒã«ããå¿
èŠããããŸãã ããã«ãçæãããåºåã¯ãã®ãã¹ãã§ã®ã¿å®è¡ã§ããããã«ãªãããã¹ãéã§åå©çšå¯èœãª.wasm
ã¢ãžã¥ãŒã«ãçæã§ããªããªããŸããã å
±æããŒã«ãšåå©çšå¯èœãªã¢ãžã¥ãŒã«ãå®çŸããã«ã¯ããªã³ã¯ã«å¯Ÿå¿ããããçš®ã®å
±éã®æœè±¡ã³ã³ãã€ã«ã¿ãŒã²ãããå¿
èŠã§ãïŒç¹ã«ãååãšã€ã³ã¹ã¿ã³ã¹ã®éã«1ïŒ1ã®é¢é£ä»ããæ³å®ããŠããªããã®ã§ãå€ãã®ãŠãŒã¹ã±ãŒã¹ã«ã¯äžååã§ãïŒïŒ -ããã¯ãŸãã«ã¢ãžã¥ãŒã«ãªã³ã¯ã®ææ¡ã確ç«ããããšãæãã§ãããã®ã§ãã
ããã¯èšã£ãŠããã¢ãžã¥ãŒã«ãªã³ã¯ããã¹ãã«äŸåããªãã¹ããã¯ã¬ã€ã€ãŒãšããŠã³ã¢wasmã®äžãšJSAPIã®äžã«è¿œå ããããã€ããªãããœãªã¥ãŒã·ã§ã³ãæ³åããããšãã§ããŸãã ããã«ããããã¹ãã«äŸåããªãããŒã«ãšã¢ãžã¥ãŒã«ãäœæã§ãïŒãã®ãã¹ãã«äŸåããªãã¹ããã¯ã¬ã€ã€ãŒãã¿ãŒã²ããã«ïŒããã¹ãã®åã蟌ã¿ã§ãã®ã¬ã€ã€ãŒãå®å šã«åé¿ããç¹æ®ãªãªã³ã¯ã¹ããŒã ã䜿çšããŠã³ã¢ã¢ãžã¥ãŒã«ãçŽæ¥ã€ã³ã¹ã¿ã³ã¹åã§ããŸãã
ããã¯ããããã®çžåããç®æšã解決ããããã®åççãªæ¹æ³ã®ããã«èãããŸããïŒ
@lukewagner ãç§ãšäžç·ã«ããŠãããŠããããšãïŒ ããªããèšã£ãããšã¯ãç§ãã©ãããæ¥ãã®ããããæ£ç¢ºã«ç解ããŠããããã«èãããŸãããåæã«ãè匱æ§ãšããŒã«/ãšã³ã·ã¹ãã ã«ã€ããŠã®ããªãã®æžå¿µãèããŠããŸãã
ãã€ããªãã/ 2å±€ãœãªã¥ãŒã·ã§ã³ã¯ç§ãææ¡ããããšããŠãããã®ã ãšæããŸãã2å±€ã¯ãå éšããšãå€éšãã®ãªã³ã¯ã«å¯Ÿå¿ããŠããŸãã å éšãªã³ã¯ã¯å®äœçœ®ã§ãããã¢ãžã¥ãŒã«ãæ§ç¯/æ¥ç¶/ã€ã³ã¹ã¿ã³ã¹åããããã®æ瀺ãæå®ããŸããããã¯ããã¹ãŠã®WebAssemblyãšã³ãžã³ïŒã¢ãžã¥ãŒã«ãªã³ã¯ã䜿çšïŒãå®è£ ããå¿ èŠããããã®ã§ãã å€éšãªã³ã¯ã¯ãšã³ãããŒåºæã§ãããä»ã®ãã¡ã€ã«ãªã©ããïŒäœçœ®ïŒã¢ãžã¥ãŒã«ãæ§ç¯ããæ¹æ³ãæå®ããŸããããšãã°ããã¡ã€ã«åãæåååãã€ã³ããŒã/ãšã¯ã¹ããŒãã«é¢é£ä»ããæ¹æ³ãæå®ããŸããããã¯ãWebAssemblyãšã³ãããŒãå®è£ ããå¿ èŠããããã®ã§ãã ãã®é¢å¿ã®åé¢ã«ãããWebAssemblyããã°ã©ã ã®ãã³ã¢ãã®åŽé¢ãšWebAssemblyãšã³ãžã³ã®ãã³ã¢ãã®åŽé¢ãè€æ°ã®ãšã³ã·ã¹ãã éã§åå©çšãããããªããŸãã ïŒãŸãããã®åé¢ã«ãããå éšã¢ãžã¥ãŒã«ã®ãªã³ã¯ã®åŽé¢ãã¯ãªãŒã³ã¢ãããããå¯èœæ§ããããšæããŸããïŒ
ããããããªããèšåããããã«ã2ã€ã®å€ãã®ãå€éšãã«ã¹ã¿ãã€ãºããããšãæ·±å»ãªç Žç ã«ã€ãªããå¯èœæ§ããããŸãã ç§ã¯åé¢ããå¿ èŠããããªã³ã¯ãå éšããšãå€éšããšèããªããããããç§ã¯ãŸãããæ®éãã®å€éšãªã³ã¯ã®æšæºããããšäŸ¿å©ã ãšæããŸãã ç¹å®ã®ãšã³ã·ã¹ãã ã®è©³çŽ°ã«ããŸãé©åãŸãã¯æŽ»çšããããã«ãããå°éçãªå€éšãªã³ã¯ã·ã¹ãã ãéçºããå ŽåããããŸããïŒããããããã«ãããå°éçãªããŒã«ã䜿çšïŒãå€ãã®ããã°ã©ã ã®ããŒãºã¯åçŽãªå ±éã®æšæºã«é©åããŸãã
ãããã£ãŠãèŠçŽãããšã1ã€ã®ãå éšããªã³ã¯ã·ã¹ãã ïŒäœã¬ãã«ãããšãã°äœçœ®ïŒãå¿ èŠã§ããããã®äžã«è€æ°ã®ãå€éšããªã³ã¯ã·ã¹ãã ãååš
ããŠããã®çš®ã®å€æŽãçæçã«å
·äœçã«äœãæå³ããããèãããšãã¢ãžã¥ãŒã«ãªã³ã¯ãã³ã¢ä»æ§ã®äžã®ãå
±éãªã³ã¯ãã¬ã€ã€ãŒãšããŠïŒå¿
èŠã«å¿ããŠãJS / Webä»æ§ã®äžã§ïŒåæ§æããããšã¯ãã³ã¢ã¹ããã¯ã«äœãè¿œå ããå¿
èŠã¯ãããŸããã ç¹ã«ãã³ã¢ã¢ãžã¥ãŒã«ã®ã€ã³ããŒã/ãšã¯ã¹ããŒãã¯å®äœçœ®ã®ãŸãŸã§ããå¯ââèœæ§ããããã¢ãžã¥ãŒã«ãªã³ã¯ã¬ã€ã€ãŒã¯ã€ã³ã¹ã¿ã³ã¹åãå®è¡ãããšãã«ãããã®ååãå®å
šã«ç¡èŠããŸãã ããã«åºã¥ããŠãããããããšããçãã§ãã®åé¡ã解決ã§ããŸãããã®å Žåããã®äžã®@titzerã®ãã€ã³ãã«""
ã "a"
ã "b"
ãå«ããããã«åŒ·å¶ããããšã¯ãããŸããã "c"
...æ€èšŒã容æã«ããããã ãã«ååããšã¯ã¹ããŒãããŸãã
ïŒå°æ¥çã«ã¯ãã¢ãžã¥ãŒã«/ã€ã³ã¹ã¿ã³ã¹ã®äœçœ®ããŒãžã§ã³ã䜿çšããŠã³ã¢wasmãæ¡åŒµããããšã«ã€ããŠè©±ãããšãã§ããŸãããã¢ãžã¥ãŒã«ãªã³ã¯ã®ææ¡ã§çŠç¹ãåœãŠãæåã®äžé£ã®ãŠãŒã¹ã±ãŒã¹ãšèŠä»¶ã«è¿œå ã§å¿ èŠã«ãªããšã¯æããŸãããïŒ
@rossberg @titzer @tlivelyæèïŒ
ã³ã¢Wasmã®ã€ã³ããŒããšãšã¯ã¹ããŒããå³å¯ã«å®äœçœ®ã§ãªããã°ãªããªãããšãã³ãŒãåãããšã httpsïŒ//github.com/WebAssembly/gc/issues/148ã®ãã¢ãéãŸãã®ã§ã¯ãªãããšå¿é
ããŠãimportexport
ã¡ã«ããºã ã®å°å
¥ã瀺åããŠããŸãã茞å
¥ãšèŒžåºã®åé¡ã¯å¿
ç¶çã«é察称ã§ããã ææ¡ãããã¡ã«ããºã ã¯ãåºæ¬çã«ã³ã¢Wasmã¬ãã«ã§åã®åŒ±ããªã³ã±ãŒãžãå°å
¥ããæååèå¥åãªãã§ã©ã®ããã«äœçœ®çã«æ©èœãããã¯ããããŸããã
GCææ¡ããã®æ¹åã«é²ããããã®ã³ã³ã»ã³ãµã¹ããªããããããã¯æããã«ä»®èª¬ã§ãããå人çã«ã¯ãGCææ¡ã«ãšã£ãŠååã«é åçãªãªãã·ã§ã³ã§ããããã®ãããªç¡é¢ä¿ãªéçºã«ãã£ãŠå®çŸå¯èœæ§ãäœäžããã®ãèŠãã®ã¯æ²ããããšã§ãããã£ãä»ã ãã®ææ¡ãããå€æŽãäœçœ®çã«æ©èœããæ¹æ³ããŸãã¯ãã®åé¡ã誀解ããæ¹æ³ããããŸãããïŒ
ãããèå³æ·±ãã€ãªããã@ tlivelyïŒ ããã¯ç§ã«ããã€ãã®ã¢ã€ãã¢ãèããããŸãã
1ã€ã®ã¢ã€ãã¢ã¯ãéçãªã³ã¯ã«é¢é£ããŠããŸãã ååä»ãã€ã³ããŒããå€éšã«ãªã³ã¯ãããã¢ãžã¥ãŒã«ã®å€æŽå¯èœæ§ã«åœ¹ç«ã€ã®ãšåãããã«ãããã©ã«ãã®ã€ã³ããŒããåæ§
å¥ã®ã¢ã€ãã¢ã¯ããã€ãããã¯ãªã³ã¯ã«é¢é£ããŠããŸãã ããã§ã¯ãæååãã°ããŒãã«ããŒãšããŠäœ¿çšãããŸãã importexport
åºæ¬çã«ãããã®ããŒã«é¢é£ä»ããããå€ãã€ã³ããŒããããã®å€ããŸã å®çŸ©ãããŠããªãå Žåã¯ããã®ããŒã«å¯Ÿå¿ããå€ãšããŠä»¥äžãã°ããŒãã«ã«ç»é²ããããšèšããŸãã ïŒç¹°ãè¿ããŸãããããã¯ãã¹ãŠå€éšãªã³ã¯å±€ã«ãããŸããïŒ
WebAssemby / gcïŒ148ã¯åç®åã«é¢ãããã®ã§ãããäžèšã®äž¡æ¹ã®èãæ¹ãäŸå€ã«ãåœãŠã¯ãŸãããšã«æ³šæããŠãã ããã éçãªã³ã¯ã®å Žåãã¢ãžã¥ãŒã«ã®äžè¬çãªãã¿ãŒã³ã¯ãããã©ã«ãã§æ°ããçæãããäŸå€ã€ãã³ããã€ã³ããŒãããããšã§ãããéããŒã«ã«å¶åŸ¡ãå
±æããããã«ä»ã®ã¢ãžã¥ãŒã«ïŒã€ã³ã¹ã¿ã³ã¹ïŒïŒãšåãã€ãã³ãã䜿çšããããã«ã€ã³ã¹ã¿ã³ã¹åã§ããŸãã圌ããšäžç·ã«ã ãã€ãããã¯ãªã³ã¯ã®å Žåãäžå€®ã®ã©ã³ã¿ã€ã ã¢ãžã¥ãŒã«ïŒäººã
ã¯ãã§ã«ç§ã®èããç¥ã£ãŠããŸãïŒããªãããšãæ¬åœã«æãã§ããå ŽåãäŸå€ã®ããèšèªã¯ããã€ãããã¯ãªã³ã¯ãããã¢ãžã¥ãŒã«ãšimportexport
éã§äŸå€ã€ãã³ãã調æŽããå¿
èŠããããŸã
ãã¡ããšããïŒ ç§ãæ£ããç解ããŠããã°ã importexport
ã¡ã«ããºã ã¯ãå®çŸ©ãããã¿ã€ããã€ã³ããŒãããããã®ãããã©ã«ãããšã¯ã¹ããŒãã¢ãžã¥ãŒã«ãæé»çã«äœæããããšã«ãããäœçœ®ã®ã€ã³ããŒããšãšã¯ã¹ããŒãã«ãã·ã¥ã¬ãŒããã¢ãžã¥ãŒã«ãªã³ã¯ã¬ã€ã€ãŒã®äžéšãšèããããšãã§ããŸãã ããã¯ç§ã«ã¯çã«ããªã£ãŠããããã«æãããã®ã§ãç§ã¯ãã®æ¹åæ§ã«ã€ããŠãã以äžå¿é
ããå¿
èŠã¯ãããŸããã
éå±€åã®è°è«ã¯äž¡æ¹ã®éãåãéããšæããŸãã åæ§ã«ãim / exportsãæ確ã«ããããã«æ¡çšããïŒé«ã¬ãã«åãè¿œå æ å ±ïŒãã¢ã¹ããŒã ãäœã¬ãã«åã®æ確ãªã¹ããŒã ã«ãããã³ã°ããã®ã¯ãäžäœå±€ã®è²¬ä»»ã§ãããšäž»åŒµã§ããŸãã
äžäœã¬ãã«ã®å Žåãå¯èœãªéãæ瀺çãã€æ確ã§ããããšãåžžã«æãŸããããã«æãããŸãã ããã«ãããã·ã¹ãã ãšã·ã¹ãã ãšã®ã€ã³ã¿ãŒãã§ãŒã¹ãã·ã³ãã«ã«ä¿ããããã¹ãŠã®äººã§ã¯ãªããã·ã¹ãã ãå¿ èŠãšãããšã³ã·ã¹ãã ã§ããè€éãªã¹ããŒã ãåŠçããè² æ ãããããŸãã
å¥ã®ã¬ã€ã€ãŒãšããŠã®ãªã³ã¯ã®ææ¡ã«ã€ããŠã¯ãæœè±¡çã«ã¯è¯ãããã«èãããŸããããããã¹ã ãŒãºã«æ©èœãããããšãã§ãããã©ããã«ã€ããŠã¯å°ãæççã§ãã ããšãã°ããã®ææ¡ã§ã¯çŸåšãå éšã¢ãžã¥ãŒã«ãã¢ãžã¥ãŒã«ãåãªã©ã®éçãšã³ãã£ãã£ã®å€éšåå空éãåç §ã§ããããã«ãªã£ãŠããŸãããããã¯ããªãäžå¿çã§ãããã³ã¢ä»æ§ã«ãããã³ã°ã§ããŸããïŒã©ã ããªããã£ã³ã°ãšåçã®å€æãé€ããŠãå£ããŸãïŒã€ã³ããŒãã®éšåé©çš/ã€ã³ã¹ã¿ã³ã¹åãã€ãŸããã¢ãžã¥ãŒã«ã¯ããŒãžã£ãã®åœ¢åŒãå°å ¥ããªãéããæå³ãããæ§æãã¿ãŒã³ã
ããšãã°ããã®ææ¡ã§ã¯çŸåšãå éšã¢ãžã¥ãŒã«ãã¢ãžã¥ãŒã«ãã¿ã€ããªã©ã®éçãšã³ãã£ãã£ã®å€éšåå空éãåç §ã§ããããã«ãªã£ãŠããŸãã
ããã¯ãããã€ãã®åçŽåã䜿çšã§ãããšç§ãæããåŽé¢ã®1ã€ã§ããã
ã€ã³ããŒãã®éšåé©çš/ã€ã³ã¹ã¿ã³ã¹åãã€ãŸããã¢ãžã¥ãŒã«ã¯ããŒãžã£ãã®åœ¢åŒãå°å ¥ããªãéã
ããã¯ããã®åçŽåãå®çŸããã®ã«åœ¹ç«ã€ãšç§ãèããææ³ã®1ã€ã§ããã
ç§ã¯äžè¬çã«ããªã³ã¯ä»æ§ãã¬ã€ã€ãŒã®äžã«ç§»åãããšããèããæ¯æããŸãã ããã¯åºæ¬çã«ç§ã䞻匵ããŠããããšã§ãã ãšã³ãžã³ã¯ååãç¥ãå¿ èŠã¯ãããŸããã
@rossbergç§ã¯äžè¬çã«ããæ確ã§ææ§ãã®ãªããã¯äžäœå±€ã«æé©ã ãšæããŸããããã®ã€ã³ã¹ã¿ã³ã¹ã¯èŠç¯çã§ãããã©ããã«é¢ãããã®ã§ãããäžäœå±€ã¯ãããã«é¢ä¿ã®ãªãããšã«ã€ããŠèŠç¯çã§ã¯ãªãããã«ããŸãããã¯ãã§ãã IMOã
https://github.com/WebAssembly/design/issues/1399#issuecomment -808401005ã«é¢é£ããæèŠãããi64
åŒæ°ãçç¥ããŠWasmãšã¯ã¹ããŒããåŒã³åºããšãã«åŒã³åºãã倱æããåé¡ã説æããŠããŸãã JSããWasmã«åŒã³åºããšãã«ãéè€ãããšã¯ã¹ããŒããèš±å¯ããäžèŽããã¢ãªãã£ãæã€ãã®ãéžæããããšã¯ãã³ã³ããã¹ãã§ã®æšå¥šããããœãªã¥ãŒã·ã§ã³ã§ãã
æãåèã«ãªãã³ã¡ã³ã
éè€ã€ã³ããŒãã¯ãåãé¢æ°ãããŸããŸãªçœ²åãæã€ããšãã§ããJSã®ãããªåçèšèªããã®ã€ã³ããŒããåŒã³åºãã®ã«éåžžã«äŸ¿å©ã§ããå¢çã®åã·ã¹ãã ãè±å¯ã«ãªããšã䜿çšãããéãå°ãªããªãããšã¯ãªããšæããŸããæ°å€ãŸãã¯æåååŒæ°ããããã¯1ã€ãŸãã¯2ã€ã®åŒæ°ãæã€åãé¢æ°ã ãã®æ©èœãåé€ããããšã¯ãJSãšã®çžäºéçšã«ãšã£ãŠéåžžã«æ®å¿µãªããšã ãšæããŸãã