WebAssemblyã®çºè¡šã¯2015幎ã«è¡ãããŸãã-ããããä»ã§ã¯ãäœå¹Žãçµã£ãä»ã§ããå®çšŒåã§èªæ ¢ã§ãã人ã¯ã»ãšãã©ããŸããã ãã®ãããªçµéšã«é¢ããè³æã¯ãã¹ãŠãã䟡å€ããããŸããå®éã«ãããã©ã®ããã«çãããã«ã€ããŠã®çŽæ¥çãªæ å ±ã¯ãŸã äžè¶³ããŠããŸãã
HolyJSã«ã³ãã¡ã¬ã³ã¹ã§ãWebAssemblyã䜿çšããçµéšã«é¢ããã¬ããŒããèŽè¡ããé«ãè©äŸ¡ãåããçŸåšããã®ã¬ããŒãã®ããã¹ãçãHabrçšã«ç¹å¥ã«æºåãããŠããŸãïŒãããªãæ·»ä»ãããŠããŸãïŒã
ç§ã®ååã¯ã¢ã³ãã¬ã€ã§ããWebAssemblyã«ã€ããŠèª¬æããŸãã åäžçŽã«ãŠã§ãã«æºããå§ãããšèšããŸãããç§ã¯è¬èãªã®ã§ãããã¯èšããŸããã ãã®éãç§ã¯ãªããšãããã¯ãšã³ããšããã³ããšã³ãã®äž¡æ¹ã§äœæ¥ããããšãã§ããå°ãã®ãã¶ã€ã³ãããæããŸããã ä»æ¥ãWebAssemblyãC ++ããã®ä»ã®ãã€ãã£ããªãã®ã«èå³ããããŸãã ç§ã¯ã¿ã€ãã°ã©ãã£ã倧奜ãã§ãå€ããã¯ãããžãŒãåéããŠããŸãã
æåã«ãããŒã ãšç§ããããžã§ã¯ãã«WebAssemblyãå®è£ ããæ¹æ³ã«ã€ããŠèª¬æãã次ã«WebAssemblyããäœããå¿ èŠãã©ãããè°è«ãããããèªåã§å®è£ ãããå Žåã«ããã€ãã®ãã³ãã§çµãããŸãã
WebAssemblyã®å®è£ æ¹æ³
ç§ã¯Inetraã§åããŠãããããã·ãã«ã¹ã¯ã«ãããç¬èªã®ãããžã§ã¯ããããã€ãè¡ã£ãŠããŸãã ãããã®1ã€ã¯ByteFogã§ãã ããã¯ããŠãŒã¶ãŒã«ãããªãé ä¿¡ããããã®ãã¢ããŒãã¢ãã¯ãããžãŒã§ãã ç§ãã¡ã®é¡§å®¢ã¯ã倧éã®ãããªãé ä¿¡ãããµãŒãã¹ã§ãã 圌ãã«ã¯åé¡ããããŸããããšãã°ã誰ãã®èšè äŒèŠãã¹ããŒãã€ãã³ããªã©ã®äººæ°ã®ããã€ãã³ããçºçãããšããæºåãæŽããæ¹æ³ãããããã®ã¯ã©ã€ã¢ã³ãããµãŒããŒã«å¯ãããã£ãŠããµãŒããŒãæ²ããã§ãã çŸæç¹ã§ã¯ã顧客ã®ãããªå質ã¯éåžžã«äœããªã£ãŠããŸãã
ãããã誰ããåãã³ã³ãã³ããèŠãŠããŸãã ãŠãŒã¶ãŒã®è¿é£ã®ããã€ã¹ã«ãããªã®æçãå ±æããããã«äŸé ŒããŠã¿ãŸãããããµãŒããŒãã¢ã³ããŒãããŠåž¯åå¹ ãç¯çŽãããŠãŒã¶ãŒã¯ããè¯ãå質ã§ãããªãåä¿¡ããŸãã ãããã®ã¯ã©ãŠãã¯ãåœç€Ÿã®ãã¯ãããžãŒã§ãããByteFogãããã·ãµãŒããŒã§ãã
ãããªã衚瀺ã§ãããã¹ãŠã®ããã€ã¹ã«ã€ã³ã¹ããŒã«ããå¿ èŠããããããWindowsãLinuxãAndroidãiOSãWebãTizenãªã©ãéåžžã«å¹ åºããã©ãããã©ãŒã ããµããŒãããŠããŸãã ããããã¹ãŠã®ãã©ãããã©ãŒã ã§åäžã®ã³ãŒãããŒã¹ã䜿çšããããã«éžæããèšèªã¯äœã§ããïŒ C ++ãéžæããã®ã¯ãæãå©ç¹ãããããšãå€æããããã§ã:-Dããã«æ·±å»ãªããšã¯ãC ++ã®å°éç¥èããããå®éã«é«éãªèšèªã§ããã移æ€æ§ã«ãããŠã¯ãCã«æ¬¡ãå¯èœæ§ãããããšã§ãã
ããªã倧ããªã¢ããªã±ãŒã·ã§ã³ïŒ900ã¯ã©ã¹ïŒãååŸããŸããããããŸãæ©èœããŸãã Windowsããã³Linuxã§ã¯ããã€ãã£ãã³ãŒãã«ã³ã³ãã€ã«ããŸãã Androidããã³iOSã®å Žåãã¢ããªã±ãŒã·ã§ã³ã«æ¥ç¶ããã©ã€ãã©ãªãæ§ç¯ããŠããŸãã Tizenã«ã€ããŠã¯å¥ã®æ©äŒã«è©±ãããŸããã以åã¯Webã§ãã©ãŠã¶ãã©ã°ã€ã³ãšããŠåããŠããŸããã
ããã¯ãNetscape Plugin APIãã¯ãããžãŒã§ãã ååã瀺ãããã«ãéåžžã«å€ããæ¬ ç¹ããããŸããã·ã¹ãã ã«éåžžã«åºç¯å²ã«ã¢ã¯ã»ã¹ã§ããããããŠãŒã¶ãŒã³ãŒããã»ãã¥ãªãã£äžã®åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã ããããããã2015幎ã«Chromeããã®ãã¯ãããžãŒã®ãµããŒãããªãã«ãããã¹ãŠã®ãã©ãŠã¶ãŒããã®ãã©ãã·ã¥ã¢ãã«åå ããçç±ã§ãã ãã®ãããç§ãã¡ã¯ã»ãŒ2幎éãWebããŒãžã§ã³ãªãã§æŸçœ®ãããŠããŸããã
2017幎ãæ°ããªåžæã蚪ããŸããã ãæ³åã®ãšãããããã¯WebAssemblyã§ãã ãã®çµæãã¢ããªã±ãŒã·ã§ã³ããã©ãŠã¶ã«ç§»æ€ããã¿ã¹ã¯ãèšå®ããŸããã FirefoxãšChromeã®ãµããŒãã¯æ¢ã«æ¥ã«ç»å ŽããŠããããã2017幎ã®ç§ã«ã¯EdgeãšSafariã姿ãæ¶ããŸããã
ãã°ã®æ°ã2åã«ãªããªãããã«ã2åã«ããããªãããžãã¹ããžãã¯ããããããããããæ¢è£œã®ã³ãŒãã䜿çšããããšãéèŠã§ããã ã³ã³ãã€ã©ãŒEmscriptenã䜿çšããŠãã ããã å¿ èŠãªããšãè¡ããŸã-plusã¢ããªã±ãŒã·ã§ã³ããã©ãŠã¶ã«ã³ã³ãã€ã«ãããã©ãŠã¶ã®ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã«éŠŽæã¿ã®ããç°å¢ãåäœæããŸãã Emscriptenã¯ãã®ãããªBrowser ++ for C ++ã³ãŒãã§ãããšèšããŸãã ãŸãããªããžã§ã¯ããC ++ããJavaScriptã«ããŸãã¯ãã®éã«è»¢éã§ããŸãã æåã«èããã®ã¯ãEmscriptenã䜿çšããŠã³ã³ãã€ã«ããã ãã§ããã¹ãŠãæ©èœããããšã§ãã ãã¡ãããããã§ã¯ãããŸããã§ããã ãããããçæã«æ²¿ã£ãæ ãå§ãŸããŸããã
æåã«åºäŒã£ãã®ã¯äŸåé¢ä¿ã§ããã ã³ãŒãããŒã¹ã«ã¯ããã€ãã®ã©ã€ãã©ãªããããŸããã ãããããªã¹ãããã®ã¯æå³ããããŸããããç解ããŠãã人ã®ããã«ãBoostããããŸãã ããã¯ã¯ãã¹ãã©ãããã©ãŒã ã³ãŒããèšè¿°ã§ãã倧ããªã©ã€ãã©ãªã§ãããããã䜿çšããŠã³ã³ãã€ã«ãæ§æããããšã¯éåžžã«å°é£ã§ãã ã§ããã ãå°ãªãã³ãŒãããã©ãŠã¶ãŒã«ãã©ãã°ãããã£ãã®ã§ãã
Bytefogã®ã¢ãŒããã¯ãã£
ãã®çµæãã³ã¢ãç¹å®ããŸãããããã¯ãã¡ã€ã³ã®ããžãã¹ããžãã¯ãå«ããããã·ãµãŒããŒã§ãããšèšããŸãã ãã®ãããã·ãµãŒããŒã¯ã2ã€ã®ãœãŒã¹ããããŒã¿ãååŸããŸãã æåã®äž»èŠãªãã®ã¯HTTPãã€ãŸãåç»é ä¿¡ãµãŒããŒãžã®ãã£ãã«ã2çªç®ã¯P2Pãããã¯ãŒã¯ãã€ãŸãä»ã®ãŠãŒã¶ãŒããã®å¥ã®åããããã·ãžã®ãã£ãã«ã§ãã ãŠãŒã¶ãŒã«é«å質ã®ã³ã³ãã³ãã衚瀺ããããšãã¿ã¹ã¯ã§ãããããããŒã¿ã¯äž»ã«ãã¬ãŒã€ãŒã«æäŸãããŸãã ãªãœãŒã¹ãæ®ã£ãŠããå Žåãä»ã®ãŠãŒã¶ãŒãããŠã³ããŒãã§ããããã«ãã³ã³ãã³ããP2Pãããã¯ãŒã¯ã«é ä¿¡ããŸãã å éšã«ã¯ããã¹ãŠã®éæ³ãè¡ãã¹ããŒããã£ãã·ã¥ããããŸãã
ããããã¹ãŠã³ã³ãã€ã«ãããšãWebAssemblyããã©ãŠã¶ãµã³ãããã¯ã¹ã§å®è¡ããããšããäºå®ã«çŽé¢ããŸãã ã€ãŸããJavaScriptãæäŸãã以äžã®ããšã¯ã§ããªããšããããšã§ãã ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã¯ããã¡ã€ã«ã·ã¹ãã ããããã¯ãŒã¯ãä¹±æ°ãªã©ããã©ãããã©ãŒã åºæã®å€ãã®ãã®ã䜿çšããŸãã ãããã®æ©èœã¯ãã¹ãŠããã©ãŠã¶ãæäŸãããã®ã䜿çšããŠJavaScriptã§å®è£ ããå¿ èŠããããŸãã ãã®ãã¬ãŒãã«ã¯ãããªãæãããªä»£æ¿åããªã¹ããããŠããŸãã
ãããå¯èœã«ããã«ã¯ããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã®ãã€ãã£ãæ©èœã®å®è£ ãèŠéããããã«ã€ã³ã¿ãŒãã§ã€ã¹ãæ¿å ¥ãããã€ãŸãç¹å®ã®å¢çç·ãåŒãå¿ èŠããããŸãã 次ã«ããããJavaScriptã§å®è£ ãããã€ãã£ãå®è£ ãçµäºããŸãããã§ã«ã¢ã»ã³ããªäžã«å¿ èŠãªå®è£ ãéžæãããŠããŸãã ããã§ãç§ãã¡ã¯å»ºç¯ãèŠãŠããã®å¢çç·ãæãããšãã§ãããã¹ãŠã®å ŽæãèŠã€ããŸããã å¶ç¶ã«ããããã¯ãã©ã³ã¹ããŒããµãã·ã¹ãã ã§ãã
ãã®ãããªå Žæããšã«ãä»æ§ãå®çŸ©ããŸãããã€ãŸããå¥çŽãä¿®æ£ããŸãããã©ã®ã¡ãœãããšãªãããã©ã®ãã©ã¡ãŒã¿ãŒãæã€ããã©ã®ããŒã¿åããªã©ã§ãã ãããè¡ããšãåéçºè ãããããã®åŽã§äžŠè¡ããŠäœæ¥ã§ããŸãã
çµæã¯äœã§ããïŒ ãããã€ããŒããã®ã¡ã€ã³ãããªé ä¿¡ãã£ãã«ãéåžžã®AJAXã«çœ®ãæããŸããã 人æ°ã®ããHLS.jsã©ã€ãã©ãªãéããŠãã¬ãŒã€ãŒã«ããŒã¿ãçºè¡ããŸãããå¿ èŠã«å¿ããŠä»ã®ãã¬ãŒã€ãŒãšçµ±åããåºæ¬çãªå¯èœæ§ããããŸãã P2Pã¬ã€ã€ãŒå šäœãWebRTCã«çœ®ãæããŸããã
ã³ã³ãã€ã«ã®çµæãããã€ãã®ãã¡ã€ã«ãååŸãããŸãã æãéèŠãªã®ã¯ããã€ããª.wasmã§ãã ããã«ã¯ããã©ãŠã¶ãå®è¡ããã³ã³ãã€ã«æžã¿ãã€ãã³ãŒããå«ãŸãããã¹ãŠã®C ++ã¬ã¬ã·ãŒãå«ãŸããŸãã ããããããèªäœã§ã¯æ©èœããããããããã°ã«ãŒã³ãŒãããå¿ èŠã§ãããã³ã³ãã€ã©ã«ãã£ãŠãçæãããŸãã ã°ã«ãŒã³ãŒãã¯ãã€ããªãã¡ã€ã«ãããŠã³ããŒãããŠããããããã®ãã¡ã€ã«ã®äž¡æ¹ãå®çšŒåç°å¢ã«ã¢ããããŒãããŸãã ãããã°ã®ç®çã§ãã¢ã»ã³ãã©ãŒã®ããã¹ãè¡šçŸã.wastãã¡ã€ã«ããã³ãœãŒã¹ããããçæã§ããŸãã ãããã¯éåžžã«å€§ãããªãå¯èœæ§ãããããšãç解ããå¿ èŠããããŸãã ç§ãã¡ã®å Žåããããã¯100ã¡ã¬ãã€ã以äžã«éããŸããã
ãã³ãã«ã®åé
ã°ã«ãŒã³ãŒãã詳ããèŠãŠã¿ãŸãããã ããã¯éåžžã®å€ãè¯ãES5ã§ãããåäžã®ãã¡ã€ã«ã«ã¢ã»ã³ãã«ãããŸãã ãããWebããŒãžã«æ¥ç¶ãããšãã€ã³ã¹ã¿ã³ã¹åããããã¹ãŠã®wasmã¢ãžã¥ãŒã«ãå«ãã°ããŒãã«å€æ°ãäœæãããAPIãžã®ãªã¯ãšã¹ããåãå ¥ããæºåãæŽããŸãã
ãã ãããŠãŒã¶ãŒã䜿çšããã©ã€ãã©ãªã«ãšã£ãŠãå¥ã®ãã¡ã€ã«ãå«ããããšã¯ããªãæ·±å»ãªåé¡ã§ãã ãã¹ãŠã1ã€ã®ãã³ãã«ã«ãŸãšããããšæããŸãã ãã®ããã«ãWebpackãšç¹å¥ãªã³ã³ãã€ã«ãªãã·ã§ã³MODULARIZEã䜿çšããŸãã
æ¥çå€ã³ãŒãããã¢ãžã¥ãŒã«ããã¿ãŒã³ã§ã©ãããããããæŸãããšãã§ããŸããES5ã§èšè¿°ããŠããå ŽåãimportãŸãã¯requireã䜿çšããŸããWebpackã¯ãã®äŸåé¢ä¿ãå·éã«ç解ããŸãã Babelã«åé¡ããããŸãã-圌ã¯å€§éã®ã³ãŒãã奜ãã§ã¯ãããŸããã§ããããããã¯ES5ã³ãŒãã§ããã転眮ããå¿ èŠã¯ãããŸãããç¡èŠããããã«è¿œå ããã ãã§ãã
ãã¡ã€ã«ã®æ°ã远跡ããããã«ãSINGLE_FILEãªãã·ã§ã³ã䜿çšããããšã«ããŸããã ã³ã³ãã€ã«ã®çµæãšããŠçæããããã¹ãŠã®ãã€ããªãBase64圢åŒã«å€æããæååãšããŠæ¥çã³ãŒãã«ããã·ã¥ããŸãã çŽ æŽãããã¢ã€ãã¢ã®ããã«èãããŸããããã®åŸããã³ãã«ã®ãµã€ãºã¯100ã¡ã¬ãã€ãã«ãªããŸããã WebpackãBabelãããã©ãŠã¶ããã®ãããªããªã¥ãŒã ã§ã¯åäœããŸããã ãšã«ããããŠãŒã¶ãŒã«100ã¡ã¬ãã€ãã®èªã¿èŸŒã¿ã匷å¶ããŸãããïŒïŒ
èããŠã¿ãã°ããã®ãªãã·ã§ã³ã¯å¿ èŠãããŸããã æ¥çå€ã³ãŒãã¯ããã€ããªãã¡ã€ã«ãåç¬ã§ããŠã³ããŒãããŸãã 圌ã¯HTTPãä»ããŠãããè¡ããããç®±ããåºããŠãã£ãã·ã¥ãååŸããå¿ èŠãªããããŒãèšå®ã§ããŸããããšãã°ãå§çž®ãæå¹ã«ããWebAssemblyãã¡ã€ã«ã¯å®å šã«å§çž®ãããŸãã
ããããæãã¯ãŒã«ãªãã¯ãããžãŒã¯ã¹ããªãŒãã³ã°ã³ã³ãã€ã«ã§ãã ã€ãŸããWebAssemblyãã¡ã€ã«ã¯ããµãŒããŒããã®ããŠã³ããŒãäžã«ãããŒã¿ãå°çãããšãã©ãŠã¶ãŒã§æ¢ã«ã³ã³ãã€ã«ãããŠããå¯èœæ§ããããããã«ããã¢ããªã±ãŒã·ã§ã³ã®èªã¿èŸŒã¿ãå€§å¹ ã«é«éåãããŸãã äžè¬ã«ããã¹ãŠã®WebAssemblyãã¯ãããžãŒã¯ã倧èŠæš¡ãªã³ãŒãããŒã¹ã®ã¯ã€ãã¯ã¹ã¿ãŒãã«éç¹ã眮ããŠããŸãã
ãããã«
ã¢ãžã¥ãŒã«ã®ãã1ã€ã®åé¡ã¯ãThenableãªããžã§ã¯ãã§ãããã€ãŸã.thenïŒïŒã¡ãœãããããããšã§ãã ãã®é¢æ°ã䜿çšãããšãã¢ãžã¥ãŒã«ã®èµ·åæã«ã³ãŒã«ããã¯ããã³ã°ãããããšãã§ããéåžžã«äŸ¿å©ã§ãã ããããç§ã¯ã€ã³ã¿ãŒãã§ãŒã¹ãPromiseã«äžèŽããããšãæã¿ãŸãã Thenableã¯Promiseã§ã¯ãããŸãããã倧äžå€«ã§ããèªåã§ãŸãšããŸãããã ãã®ãããªåçŽãªã³ãŒããæžããŸãããïŒ
return new Promise((resolve, reject) => { Module(config).then((module) => { resolve(module); }); });
Promiseãäœæããã¢ãžã¥ãŒã«ãèµ·åããã³ãŒã«ããã¯ãšããŠresolveé¢æ°ãåŒã³åºããããã«ã€ã³ã¹ããŒã«ããã¢ãžã¥ãŒã«ãæž¡ããŸãã ãã¹ãŠãæããã§ããããã«èŠãããã¹ãŠãæ£åžžã§ãããèµ·åããŠããŸã-äœããééã£ãŠããããã©ãŠã¶ãããªãŒãºããŠãããDevToolsããã³ã°ããŠãããããã»ããµãã³ã³ãã¥ãŒã¿äžã§ç±ããªã£ãŠããŸãã ç§ãã¡ã¯äœãç解ããŠããŸãã-ããçš®ã®ååž°ãŸãã¯ç¡éã«ãŒãã ãããã°ã¯éåžžã«é£ãããJavaScriptãäžæãããšãEmscriptenã¢ãžã¥ãŒã«ã®Thené¢æ°ã«ãªããŸããã
Module['then'] = function(func) { if (Module['calledRun']) { func(Module); } else { Module['onRuntimeInitialized'] = function() { func(Module); }; }; return Module; };
ãã£ãšè©³ããèŠãŠã¿ãŸãããã ãããã
Module['onRuntimeInitialized'] = function() { func(Module); };
ã³ãŒã«ããã¯ããã³ã°ãããŸãã ããã§ã¯ãã¹ãŠãæ確ã§ããã³ãŒã«ããã¯ãåŒã³åºãéåæé¢æ°ã§ãã ç§ãã¡ãæãããã«ãã¹ãŠã ãã®æ©èœã«ã¯å¥ã®éšåããããŸãã
if (Module['calledRun']) { func(Module);
ã¢ãžã¥ãŒã«ãæ¢ã«èµ·åããŠãããšãã«åŒã³åºãããŸãã ãã®åŸãã³ãŒã«ããã¯ã¯ããã«åæçã«åŒã³åºãããã¢ãžã¥ãŒã«ã¯ãã©ã¡ãŒã¿ãŒã§æž¡ãããŸãã ããã¯Promiseã®æ¯ãèããæš¡å£ããŠãããç§ãã¡ãæåŸ ããŠããããšã®ããã§ãã ããããäœãæªãã®ã§ããããïŒ
ããã¥ã¡ã³ãã泚ææ·±ãèªãã å ŽåãPromiseã«ã¯éåžžã«åŸ®åŠãªç¹ãããããšãããããŸãã Thenableã䜿çšããŠPromiseã解決ãããšããã©ãŠã¶ãŒã¯ãã®Thenableããå€ãå±éãããããè¡ãããã«.thenïŒïŒã¡ãœãããåŒã³åºããŸãã ãã®çµæãPromiseã解決ããããã«ã¢ãžã¥ãŒã«ãæž¡ããŸãã ãã©ãŠã¶ã¯æ¬¡ã®ããã«å°ããŸãïŒããããããã¯ãªããžã§ã¯ãã§ããïŒ ã¯ããããã¯Thenableã§ãã 次ã«ãã¢ãžã¥ãŒã«ã§.thenïŒïŒé¢æ°ãåŒã³åºããã解決é¢æ°èªäœãã³ãŒã«ããã¯ãšããŠæž¡ãããŸãã
ã¢ãžã¥ãŒã«ã¯ãå®è¡äžãã©ããã確èªããŸãã ãã§ã«å®è¡ãããŠãããããã³ãŒã«ããã¯ãããã«åŒã³åºãããåãã¢ãžã¥ãŒã«ãå床枡ãããŸãã ã³ãŒã«ããã¯ãšããŠãresolveé¢æ°ãããããã©ãŠã¶ãŒã¯æ¬¡ã®ããã«å°ããŸãïŒããã¯Thenableãªããžã§ã¯ãã§ããïŒ ã¯ããããã¯Thenableã§ãã ãããŠããã¹ãŠãåã³å§ãŸããŸãã ãã®çµæããã©ãŠã¶ãæ»ããªãç¡éã®ãµã€ã¯ã«ã«é¥ããŸãã
ãã®åé¡ã«å¯Ÿãããšã¬ã¬ã³ããªè§£æ±ºçã¯èŠã€ãããŸããã§ããã ãã®çµæã解決ããåã«.thenïŒïŒã¡ãœãããåé€ããã ãã§ãããã¯æ©èœããŸãã
Emscripten
ãã®ãããã¢ãžã¥ãŒã«ãã³ã³ãã€ã«ããJSãã¢ã»ã³ãã«ããŸããããäœããæ¬ èœããŠããŸãã ãããããããã€ãã®æçšãªäœæ¥ãè¡ãå¿ èŠããããŸãã ãããè¡ãã«ã¯ãããŒã¿ã転éããJSãšC ++ã®2ã€ã®äžçãæ¥ç¶ããŸãã ã©ããã£ãŠããã®ïŒ Emscriptenã«ã¯3ã€ã®ãªãã·ã§ã³ããããŸãã
- 1ã€ç®ã¯ãccallããã³cwrapé¢æ°ã§ãã ã»ãšãã©ã®å ŽåãWebAssemblyã®äžéšã®ãã¥ãŒããªã¢ã«ã§ãããã«äŒããŸãããC ++ã®æ©èœããµããŒãããŠããªããããå®éã®äœæ¥ã«ã¯é©ããŠããŸããã
- 2çªç®ã¯WebIDLãã€ã³ããŒã§ãã ãã§ã«C ++é¢æ°ããµããŒãããŠãããããæ¢ã«äœ¿çšã§ããŸãã ããã¯ãããšãã°W3Cãããã¥ã¡ã³ãã®ããã«äœ¿çšãããæ·±å»ãªã€ã³ã¿ãŒãã§ã€ã¹èšè¿°èšèªã§ãã ããããç§ãã¡ã¯ããããããžã§ã¯ãã«æã¡èŸŒã¿ãããªãã3çªç®ã®ãªãã·ã§ã³ãå©çšããŸãã
- çµã¿ãŸãã ããã¯Emscriptenã®ãªããžã§ã¯ããæ¥ç¶ãããã€ãã£ããªæ¹æ³ã§ãããC ++ãã³ãã¬ãŒãã«åºã¥ããŠãããC ++ããJSãžããŸãã¯ãã®éã«ç°ãªããšã³ãã£ãã£ã転éããããšã§å€ãã®ããšãè¡ãããšãã§ããŸãã
Embindã§ã§ããããšïŒ
- JavaScriptã³ãŒãããC ++é¢æ°ãåŒã³åºã
- C ++ã¯ã©ã¹ããJSãªããžã§ã¯ããäœæãã
- C ++ã³ãŒãããããã©ãŠã¶ãŒAPIã䜿çšããŸãïŒäœããã®çç±ã§å¿ èŠãªå Žåã¯ãããšãã°ãããã³ããšã³ããã¬ãŒã ã¯ãŒã¯å šäœãC ++ã§èšè¿°ã§ããŸãïŒã
- äž»ãªããšã¯ãC ++ã§èª¬æãããŠããJavaScriptã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããããšã§ãã
ããŒã¿äº€æ
æåŸã®ç¹ã¯éèŠã§ããããã¯ãŸãã«ããããã¢ããªã±ãŒã·ã§ã³ã移æ€ãããšãã«åžžã«è¡ãã¢ã¯ã·ã§ã³ã ããã§ãã ãããã£ãŠãç§ã¯ããã«ã€ããŠããã«è©³ãã説æããããšæããŸãã ããã§C ++ã³ãŒããäœæãããŸãããæãããªãã§ãã ãããTypeScriptã«äŒŒãŠããŸã:-D
ã¹ããŒã ã¯æ¬¡ã®ãšããã§ãã
C ++åŽã«ã¯ããããªãã¢ããããŒãããããã«ãããšãã°å€éšãããã¯ãŒã¯ãžã®ã¢ã¯ã»ã¹ãèš±å¯ããã«ãŒãã«ããããŸãã 以åã¯ãã€ãã£ããœã±ããã䜿çšããŠãããè¡ã£ãŠããŸãããããããè¡ãäœããã®çš®é¡ã®HTTPã¯ã©ã€ã¢ã³ãããããŸããããWebAssemblyã«ã¯ãã€ãã£ããœã±ããã¯ãããŸããã ã©ãã«ãããŠåºãŠè¡ãå¿ èŠãããã®ã§ãå€ãHTTPã¯ã©ã€ã¢ã³ããåæãããã®å Žæã«ã€ã³ã¿ãŒãã§ã€ã¹ãæ¿å ¥ããéåžžã®AJAXã䜿çšããŠãã®ã€ã³ã¿ãŒãã§ã€ã¹ãJavaScriptã«å®è£ ããŸãã ãã®åŸãçµæã®ãªããžã§ã¯ããC ++ã«æž¡ããã«ãŒãã«ã¯ããã䜿çšããŸãã
getèŠæ±ã®ã¿ãè¡ãããšãã§ããåçŽãªHTTPã¯ã©ã€ã¢ã³ããäœæããŠã¿ãŸãããã
class HTTPClient { public: virtual std::string get(std::string url) = 0; };
å ¥åã«å¯ŸããŠãããŠã³ããŒãããURLãå«ãæååãåãåããåºåã«å¯ŸããŠ
ã¯ãšãªã®çµæãå«ãæååã C ++ã§ã¯ãæååã«ãã€ããªããŒã¿ãå«ããããšãã§ãããããããã¯ãããªã«é©ããŠããŸãã Emscriptenã䜿çšãããšãããã«èšè¿°ã§ããŸã
ãã®ãããªæãããã©ãããŒïŒ
ãã®äžã§ãäž»ãªãã®ã¯2ã€ã®ãã®ã§ã-C ++åŽã®é¢æ°ã®ååïŒç·è²ã§ããŒã¯ããŸããïŒãããã³JavaScriptåŽã®å¯Ÿå¿ããååïŒéè²ã§ããŒã¯ããŸããïŒã ãã®çµæãã³ãã¥ãã±ãŒã·ã§ã³ã®å®£èšãäœæããŸãã
ã¬ãŽãããã¯ã®ããã«æ©èœããããããåéããŸãã ã¯ã©ã¹ãããããã®ã¯ã©ã¹ã«ã¯ã¡ãœãããããããã®ã¯ã©ã¹ããç¶æ¿ããŠã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããŸãã 以äžã§ãã JavaScriptã«ç§»åããŠç¶æ¿ããŸãã ããã«ã¯2ã€ã®æ¹æ³ããããŸãã æåã¯æ¡åŒµã§ãã ããã¯ãBackboneããã®å€ãè¯ãæ¡åŒµãšéåžžã«äŒŒãŠããŸãã
ã¢ãžã¥ãŒã«ã«ã¯ãEmscriptenãã³ã³ãã€ã«ãããã¹ãŠã®ãã®ãå«ãŸããŠããããšã¯ã¹ããŒããããã€ã³ã¿ãŒãã§ã€ã¹ãæã€ããããã£ããããŸãã extendã¡ãœãããåŒã³åºãããã®ã¡ãœããã®å®è£ ã§ãªããžã§ã¯ããããã«æž¡ããŸããã€ãŸããgetã¡ãœããã§ããã€ãã®ã¡ãœãããå®è£ ãããŸã
AJAXã䜿çšããŠæ å ±ãååŸããŸãã
åºåã§ã¯ãextendã¯éåžžã®JavaScriptã³ã³ã¹ãã©ã¯ã¿ãŒãæäŸããŸãã 奜ããªã ãåŒã³åºããŠãå¿ èŠãªéã®ãªããžã§ã¯ããçæã§ããŸãã ãããã1ã€ã®ãªããžã§ã¯ããããããããC ++åŽã«æž¡ãããå ŽåããããŸãã
ãããè¡ãã«ã¯ãäœããã®æ¹æ³ã§ãã®ãªããžã§ã¯ããC ++ãç解ã§ããåã«ãã€ã³ãããŸãã ããããimplementé¢æ°ã®æ©èœã§ãã åºåã§ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã§ã¯ãªããããã«äœ¿çšã§ãããªããžã§ã¯ãã§ããã¯ã©ã€ã¢ã³ããæäŸããC ++ã«æ»ãããšãã§ããŸãã ããã¯ãããšãã°æ¬¡ã®ããã«å®è¡ã§ããŸãã
var app = Module.makeApp(client, âŠ)
ã¢ããªã±ãŒã·ã§ã³ãäœæãããã¡ã¯ããªãŒãããããã®äŸåé¢ä¿ããã©ã¡ãŒã¿ãŒïŒã¯ã©ã€ã¢ã³ããªã©ïŒã«åã蟌ããšããŸãã ãã®é¢æ°ãæ©èœãããšãã¢ããªã±ãŒã·ã§ã³ã®ãªããžã§ã¯ããååŸããŸãããã®ãªããžã§ã¯ãã«ã¯ãå¿ èŠãªAPIãæ¢ã«å«ãŸããŠããŸãã ããªãã¯å察ãè¡ãããšãã§ããŸãïŒ
val client = val::global(â³clientâ³); client.call<std::string>(â³getâ³, val(...) );
C ++ããçŽæ¥ãã¯ã©ã€ã¢ã³ããã°ããŒãã«ãã©ãŠã¶ã¹ã³ãŒãããåãåºããŸãã ããã«ãã¯ã©ã€ã¢ã³ãã®ä»£ããã«ãã³ã³ãœãŒã«ããå§ãŸããDOM APIãWebRTCã§çµããä»»æã®ãã©ãŠã¶ãŒAPIã䜿çšã§ããŸãã 次ã«ããã®ãªããžã§ã¯ããæã€ã¡ãœãããåŒã³åºããEmscriptenãæäŸããããžãã¯ã¯ã©ã¹valã®ãã¹ãŠã®å€ãã©ããããŸãã
ãã€ã³ããšã©ãŒ
äžè¬ã«ãããã§ãã¹ãŠã§ãããéçºãéå§ãããšããšã©ãŒãçºçããŸãã ãããã¯æ¬¡ã®ããã«ãªããŸãã
Emscriptenã¯ç§ãã¡ãå©ããäœãæªãã®ãã説æããããšããŸãã ããããã¹ãŠãŸãšããããŠããå ŽåãããããäžèŽããããšã確èªããå¿ èŠããããŸãïŒå°å°ããŠãã€ã³ããšã©ãŒãååŸããã®ã¯ç°¡åã§ãïŒã
- åå
- çš®é¡
- ãã©ã¡ãŒã¿æ°
Embindæ§æã¯ãããã³ããšã³ããã³ããŒã ãã§ãªããC ++ãæ±ã人ã ã«ãšã£ãŠãçãããã®ã§ãã ããã¯äžçš®ã®DSLã§ãééããç¯ãããããããããã«åŸãå¿ èŠããããŸãã ã€ã³ã¿ãŒãã§ãŒã¹ã«ã€ããŠèšãã°ãJavaScriptã§äœããã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããå Žåãå¥çŽã§èª¬æãããã®ãšæ£ç¢ºã«äžèŽããå¿ èŠããããŸãã
èå³æ·±ãã±ãŒã¹ããããŸããã C ++åŽã®ãããžã§ã¯ãã«é¢äžããŠããååã®Juraã¯ãExtendã䜿çšããŠã¢ãžã¥ãŒã«ããã¹ãããŸããã 圌ãã¯åœŒã®ããã«å®ç§ã«åããã®ã§ã圌ã¯ããããã³ãããããç§ã«æž¡ããŸããã implementsã䜿çšããŠããããã®ã¢ãžã¥ãŒã«ãJSãããžã§ã¯ãã«çµ±åããŸããã ãããŠã圌ãã¯ç§ã®ããã«åããŠåæ¢ããŸããã ç§ãã¡ããããç解ãããšããé¢æ°ã®ååããã€ã³ããããšãã«ã¿ã€ããã¹ãåŸãããããšãå€æããŸããã
ååã瀺ãããã«ãExtendã¯ã€ã³ã¿ãŒãã§ã€ã¹ã®æ¡åŒµã§ãããããã©ããã«å°å°ããå ŽåãExtendã¯ãšã©ãŒãã¹ããŒãããæ°ããã¡ãœãããè¿œå ãããšå€æããŸãã
ã€ãŸããã¡ãœããèªäœãåŒã³åºããããŸã§ãã€ã³ãã£ã³ã°ãšã©ãŒãé ããŸãã 転éãããã€ã³ã¿ãŒãã§ã€ã¹ã®æ£ç¢ºæ§ãããã«ãã§ãã¯ãããããããªãã«åã£ããã¹ãŠã®å Žåã«å®è£ ã䜿çšããããšããå§ãããŸãã ãã ããExtendãå¿ èŠãªå Žåã¯ãåã¡ãœããã®åŒã³åºãããã¹ãã§ã«ããŒããŠãæ··ä¹±ããªãããã«ããå¿ èŠããããŸãã
æ¡åŒµãšES6
Extendã®ãã1ã€ã®åé¡ã¯ãES6ã¯ã©ã¹ããµããŒãããŠããªãããšã§ãã ES6ã¯ã©ã¹ãã掟çãããªããžã§ã¯ããç¶æ¿ããå ŽåãExtendã¯ãã®äžã®ãã¹ãŠã®ããããã£ãåæå¯èœã§ããããšãæåŸ ããŸãããES6ã§ã¯ããã§ã¯ãããŸããã ã¡ãœããã¯ãããã¿ã€ãã«ãããåæå¯èœïŒfalseã§ãã ãã®ãããªæŸèæã䜿çšããŠããããã¿ã€ãã調ã¹ãenumerableããªã³ã«ããŸãïŒtrueïŒ
function enumerateProto(obj) { Object.getOwnPropertyNames(obj.prototype) .forEach(prop => Object.defineProperty(obj.prototype, prop, {enumerable: true}) ) }
Emscriptenã³ãã¥ããã£ã§ES6ã®ãµããŒããæ¹åããããšã«ã€ããŠã®è¬æŒãããã®ã§ããã€ããããåãé€ãããšãã§ããã°ãšæããŸãã
RAM
C ++ã«ã€ããŠèšãã°ãã¡ã¢ãªã«ã€ããŠèšåãããããããŸããã SDå質ã®ãããªã§ãã¹ãŠã確èªãããšããããã¹ãŠãé 調ã§ãå®ç§ã«æ©èœããŸããïŒ FullHDãã¹ããå®è¡ãããšããã«ãã¡ã¢ãªäžè¶³ãšã©ãŒãçºçããŸããã ã¢ãžã¥ãŒã«ã®éå§ã¡ã¢ãªå€ãèšå®ããTOTAL_MEMORYãªãã·ã§ã³ããããŸãã ç§ãã¡ã¯0.5ã®ã¬ãã€ããäœããŸãããããã¹ãŠã¯åé¡ãããŸããããã¡ã¢ãªããã¹ãŠã®äººã«äºçŽããŠããã®ã«ãã ãããFullHDã³ã³ãã³ãã®ãµãã¹ã¯ãªãã·ã§ã³ãæã£ãŠããããã§ã¯ãªãããããŠãŒã¶ãŒã«ãšã£ãŠã¯é人éçã§ãã
å¥ã®ãªãã·ã§ã³ããããŸã-ALLOW_MEMORY_GROWTHã ã¡ã¢ãªãå¢ããããšãã§ããŸã
å¿ èŠã«å¿ããŠåŸã ã«ã ããã¯æ¬¡ã®ããã«åäœããŸããEmscriptenã¯ããã©ã«ãã§ã¢ãžã¥ãŒã«ã«åäœçšã«16ã¡ã¬ãã€ããäžããŸãã ãã¹ãŠäœ¿çšãããšãæ°ããã¡ã¢ãªãå²ãåœãŠãããŸãã å€ãããŒã¿ã¯ãã¹ãŠããã«ã³ããŒãããŸãããæ°ããããŒã¿çšã«åãéã®ã¹ããŒã¹ãæ®ã£ãŠããŸãã ããã¯ã4 GBã«éãããŸã§çºçããŸãã
256ã¡ã¬ãã€ãã®ã¡ã¢ãªãå²ãåœãŠãããã¢ããªã±ãŒã·ã§ã³ã«ååãª192ããããšæã£ãŠããããšã確å®ã«ããã£ãŠããå Žåãã¡ã¢ãªã®æ®ãã¯éå¹ççã«äœ¿çšãããŸãã ããã匷調衚瀺ãããŠãŒã¶ãŒããååŸããŸããããäœãããŸããã ã©ãããããããããé¿ãããã§ãã å°ããªããªãã¯ããããŸãïŒã¡ã¢ãªã1.5åã«å¢ãããŠäœæ¥ãéå§ããŸãã 次ã«ã3çªç®ã®ã¹ãããã§192ã¡ã¬ãã€ãã«éããŸããããããŸãã«å¿ èŠãªãã®ã§ãã ãã®æ®ãã«ãã£ãŠã¡ã¢ãªæ¶è²»ãåæžããäžå¿ èŠãªã¡ã¢ãªå²ãåœãŠãç¯çŽããŸãããããã«ãæéããããããã«ãªããŸããã ãããã£ãŠããããã®ãªãã·ã§ã³ã®äž¡æ¹ãäžç·ã«äœ¿çšããããšããå§ãããŸãã
äŸåæ§æ³šå ¥
ããããã¹ãŠã ã£ãããã«èŠããŸããããã®åŸãçæã¯ããå°ãè¡ããŸããã äŸåæ§æ³šå ¥ã«åé¡ããããŸãã äŸåé¢ä¿ãå¿ èŠãªæãåçŽãªã¯ã©ã¹ãèšè¿°ããŸãã
class App { constructor(httpClient) { this.httpClient = httpClient } }
ããšãã°ãHTTPã¯ã©ã€ã¢ã³ããã¢ããªã±ãŒã·ã§ã³ã«æž¡ããŸãã ã¯ã©ã¹ããããã£ã«ä¿åããŸãã ãã¹ãŠãããŸãããããã§ãã
Module.App.extend( â³Appâ³, new App(client) )
C ++ã€ã³ã¿ãŒãã§ã€ã¹ããç¶æ¿ããæåã«ãªããžã§ã¯ããäœæããããã«äŸåé¢ä¿ãæž¡ãã次ã«ç¶æ¿ããŸãã ç¶æ¿ã®æç¹ã§ãEmscriptenã¯ãªããžã§ã¯ãã«å¯ŸããŠä¿¡ããããªããããªããšãããŸãã æãç°¡åãªèãæ¹ã¯ãå€ããªããžã§ã¯ããåé€ãããã®ãã³ãã¬ãŒãã«åºã¥ããŠæ°ãããªããžã§ã¯ããäœæããããã«ãã¹ãŠã®ãããªãã¯ã¡ãœããããã©ãã°ããããšã§ãã ãããåæã«ããªããžã§ã¯ãã®ç¶æ ã¯å€±ããããªããžã§ã¯ãã¯åœ¢æããããæ£ããæ©èœããŸããã ãã®åé¡ã®è§£æ±ºã¯éåžžã«ç°¡åã§ãã ç¶æ¿æ®µéã®åŸã«æ©èœããã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããå¿ èŠããããŸãã
class App { _construct(httpClient) { this.httpClient = httpClient this._parent._construct.call(this) } }
ã»ãŒåãããšãè¡ããŸãããªããžã§ã¯ãã®ãã£ãŒã«ãã«äŸåé¢ä¿ãæ ŒçŽããŸãããããã¯ç¶æ¿åŸã«å€æãããªããžã§ã¯ãã§ãã C ++åŽã«ãã芪ãªããžã§ã¯ãã«ã³ã³ã¹ãã©ã¯ã¿ãŒåŒã³åºãã転éããããšãå¿ããªãã§ãã ããã æåŸã®è¡ã¯ãES6ã®superïŒïŒã¡ãœããã«é¡äŒŒããŠããŸãã ãã®å Žåãç¶æ¿ã¯æ¬¡ã®ããã«è¡ãããŸãã
const appConstr = Module.App.extend( â³Appâ³, new App() ) const app = new appConstr(client)
ãŸããç¶æ¿ããŠãããäŸåé¢ä¿ãæ¢ã«æž¡ãããŠããæ°ãããªããžã§ã¯ããäœæããŸããããã¯æ©èœããŸãã
ãã€ã³ã¿ãŒããªãã¯
å¥ã®åé¡ã¯ãC ++ããJavaScriptãžã®ãã€ã³ã¿ãŒã«ãããªããžã§ã¯ãã®åãæž¡ãã§ãã ãã§ã«HTTPã¯ã©ã€ã¢ã³ããäœæããŸããã ç°¡åã«ããããã«ã1ã€ã®éèŠãªè©³çŽ°ãèŠèœãšããŠããŸãã
std::string get(std::string url)
ã¡ãœããã¯ããã«å€ãè¿ããŸããã€ãŸããèŠæ±ã¯åæããå¿ èŠãããããšãããããŸãã ãããçµå±ã®ãšãããAJAXã«å¯ŸããAJAXãªã¯ãšã¹ãã¯éåæã§ãããããå®éã«ã¯ã¡ãœããã¯äœãè¿ããªããããªã¯ãšã¹ãIDãè¿ãããšãã§ããŸãã ãããã誰ãã«çããè¿ããŠãããããã«ãC ++ããã®ã³ãŒã«ããã¯ããã2çªç®ã®ãã©ã¡ãŒã¿ãŒãšããŠãªã¹ããŒãæž¡ããŸãã
void get(std::string url, Listener listener)
JSã§ã¯ã次ã®ããã«ãªããŸãã
function get(url, listener) { fetch(url).then(result) => { listener.onResult(result) }) }
ãã®ãªã¹ããŒãªããžã§ã¯ããååŸããgeté¢æ°ããããŸãã ãã¡ã€ã«ã®ããŠã³ããŒããéå§ããã³ãŒã«ããã¯ãåããŸãã ãã¡ã€ã«ãããŠã³ããŒãããããšããªã¹ããŒããç®çã®é¢æ°ãååŸããçµæãæž¡ããŸãã
èšç»ã¯è¯ãããã«èŠããŸãããgeté¢æ°ãå®äºãããšããã¹ãŠã®ããŒã«ã«å€æ°ãç Žæ£ãããããããšãšãã«é¢æ°ãã©ã¡ãŒã¿ãŒãã€ãŸããã€ã³ã¿ãŒãç Žæ£ãããã©ã³ã¿ã€ã emscriptenã¯C ++åŽã®ãªããžã§ã¯ããç Žæ£ããŸãã
ãã®çµæãè¡listener.onResultïŒresultïŒã®åŒã³åºãã«é¢ããŠã¯ããªã¹ããŒã¯ååšããªããªããããã«ã¢ã¯ã»ã¹ãããšãã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ãã·ã¥ã«ã€ãªããã¡ã¢ãªã¢ã¯ã»ã¹ãšã©ãŒãçºçããŸãã
ãããé¿ãããã®ã§ããã解決çã¯ãããŸããããããèŠã€ããã®ã«æ°é±éããããŸããã
function get(url, listener) { const listenerCopy = listener.clone() fetch(url).then((result) => { listenerCopy.onResult(result) listenerCopy.delete() }) }
ãã€ã³ã¿ãŒãè€è£œããæ¹æ³ãããããšãããããŸããã äœããã®çç±ã§ææžåãããŠããŸããããæ£åžžã«æ©èœããEmscriptenãã€ã³ã¿ãŒã®åç §ã«ãŠã³ããå¢ããããšãã§ããŸãã ããã«ãããã¯ããŒãžã£ãŒã§ãããäžæåæ¢ããããšãã§ããã³ãŒã«ããã¯ãèµ·åãããšããªã¹ããŒã¯ãã®ãã€ã³ã¿ãŒã§ã¢ã¯ã»ã¹ã§ããå¿ èŠã«å¿ããŠäœæ¥ã§ããŸãã
æãéèŠãªããšã¯ããã®ãã€ã³ã¿ãåé€ããããšãå¿ããªãããšã§ãããããªããšãã¡ã¢ãªãªãŒã¯ãšã©ãŒãçºçããŸããããã¯éåžžã«æªãããšã§ãã
ã¡ã¢ãªãžã®é«éæžã蟌ã¿
ãããªãããŠã³ããŒããããšããããã¯æ¯èŒç倧éã®æ å ±ã§ãããã¡ã¢ãªãšæéã®äž¡æ¹ãç¯çŽããããã«ãããŒã¿ãååŸã«ã³ããŒããéãæžãããããšæããŸãã JavaScriptãã倧éã®æ å ±ãWebAssemblyã¡ã¢ãªã«çŽæ¥æžã蟌ãæ¹æ³ã«ã¯ã1ã€ã®ããªãã¯ããããŸãã
var newData = new Uint8Array(âŠ); var size = newData.byteLength; var ptr = Module._malloc(size); var memory = new Uint8Array( Module.buffer, ptr, size ); memory.set(newData);
newDataã¯ãåä»ãé åã®åœ¢åŒã®ããŒã¿ã§ãã ãã®é·ããååŸããWebAssemblyã¢ãžã¥ãŒã«ããå¿ èŠãªãµã€ãºã®ã¡ã¢ãªã®å²ãåœãŠãèŠæ±ã§ããŸãã mallocé¢æ°ã¯ãWebAssemblyå ã®ãã¹ãŠã®ã¡ã¢ãªãå«ãé åã®ã€ã³ããã¯ã¹ã§ãããã€ã³ã¿ãè¿ããŸãã JavaScriptåŽããèŠããšãArrayBufferã®ããã«èŠããŸãã
次ã®ã¹ããããŸã§ã«ãç¹å®ã®å Žæããå¿ èŠãªãµã€ãºã®ãã®ArrayBufferã«ãŠã£ã³ããŠãåãåããããã«ããŒã¿ãã³ããŒããŸãã éåæŒç®ã«ã¯ã³ããŒã»ãã³ãã£ã¯ã¹ããããšããäºå®ã«ããããããããããã¡ã€ã©ãŒã§ãã®ã»ã¯ã·ã§ã³ãèŠããšããé·ãããã»ã¹ã¯èŠãŸããã§ããã ãã©ãŠã¶ãŒã¯ã移åã»ãã³ãã£ã¯ã¹ã®å©ããåããŠãã®æäœãæé©åãããã€ãŸãããããªããžã§ã¯ãããå¥ã®ãªããžã§ã¯ãã«ã¡ã¢ãªã®æææš©ã移ããšæããŸãã
ãŸãããã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¡ã¢ãªã®ã³ããŒãç¯çŽããããã«ã移åã»ãã³ãã£ã¯ã¹ã«ãäŸåããŠããŸãã
Adblock
ããããå€æŽã«é¢ããAdblockã®èå³æ·±ãåé¡ã§ãã ãã·ã¢ã§ã¯ã人æ°ã®ãããã¹ãŠã®ãããã«ãŒãRU Adlistã®ãµãã¹ã¯ãªãã·ã§ã³ãåãåãããµãŒãããŒãã£ã®ãµã€ãããWebAssemblyãããŠã³ããŒãããããšãçŠæ¢ãããããªçŽ æŽãããã«ãŒã«ããããŸãã ããšãã°ãCDNã䜿çšããŸãã
解決çã¯ãCDNã䜿çšããã®ã§ã¯ãªãããã¹ãŠããã¡ã€ã³ã«ä¿åããããšã§ãïŒããã¯ç§ãã¡ã«ã¯é©ããŠããŸããïŒã ãŸãã¯ããã®èŠåã«é©åããªãããã«.wasmãã¡ã€ã«ã®ååãå€æŽããŸãã ããªãã¯ãŸã ãããã®ä»²éã®ãã©ãŒã©ã ã«è¡ãããã®ã«ãŒã«ãåé€ããããã«åœŒãã説åŸããããšããããšãã§ããŸãã ãã®æ¹æ³ã§é±å±±åŽåè ãšæŠãããšã§åœŒãã¯æ£åœåããããšæããŸãããé±å±±åŽåè ããã¡ã€ã«ã®ååãå€æŽããããšãæšæž¬ã§ããªãçç±ã¯ããããŸããã
çç£
ãã®çµæãçç£ã«å ¥ããŸããã ã¯ããããã¯ç°¡åã§ã¯ãããŸããã§ãããããã¯8ã¶æããããŸããããããŠãç§ã¯ããã䟡å€ããããã©ããèªåãããã§ãã ç§ã®æèŠã§ã¯-ããã¯äŸ¡å€ããã£ãïŒ
ã€ã³ã¹ããŒã«ããå¿ èŠã¯ãããŸãã
ããã°ã©ã ãã€ã³ã¹ããŒã«ããããšãªããã³ãŒãããŠãŒã¶ãŒã«é ä¿¡ãããããã«ãªããŸããã ãã©ãŠã¶ãŒãã©ã°ã€ã³ãäœæãããšãããŠãŒã¶ãŒã¯ãããããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããå¿ èŠããããŸãããããã¯ããã¯ãããžãŒã®é åžã®ããã®å·šå€§ãªãã£ã«ã¿ãŒã§ãã çŸåšããŠãŒã¶ãŒã¯ãµã€ãã§ãããªãèŠãã ãã§ãæ©æ¢°å šäœããã³ãããã®äžã§æ©èœãããã¹ãŠãè€éã§ããããšãç解ããŠããŸããã ãã©ãŠã¶ã¯ãç»åã.cssãªã©ã®ã³ãŒããå«ãè¿œå ãã¡ã€ã«ãããŠã³ããŒãããã ãã§ãã
ç°ãªããã©ãããã©ãŒã ã§ã®çµ±äžãããã³ãŒãããŒã¹ãšãããã°
åæã«ãåäžã®ã³ãŒãããŒã¹ãç¶æããããšãã§ããŸããã ç°ãªããã©ãããã©ãŒã äžã§åãã³ãŒãããããããšãã§ããŸãããäžæ¹ã®ãã©ãããã©ãŒã ã§ã¯èŠããªãã£ããã°ãããäžæ¹ã®ãã©ãããã©ãŒã ã§çºçããããšãç¹°ãè¿ãçºçããŸããã ãããã£ãŠãããŸããŸãªãã©ãããã©ãŒã ã®ããŸããŸãªããŒã«ã䜿çšããŠãé ãããã°ãæ€åºã§ããŸãã
ã¯ã€ãã¯ãªãªãŒã¹
ç°¡åãªWebã¢ããªã±ãŒã·ã§ã³ãšããŠãªãªãŒã¹ã§ããæ°ãããªãªãŒã¹ããšã«C ++ã³ãŒããæŽæ°ã§ãããããã¯ã€ãã¯ãªãªãŒã¹ãã§ããŸããã æ°ãããã©ã°ã€ã³ãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãSmartTVã¢ããªã±ãŒã·ã§ã³ããªãªãŒã¹ããæ¹æ³ãšã¯ç°ãªããŸãã ãªãªãŒã¹ã¯ç§ãã¡ã ãã«äŸåããŸããå¿ èŠãªãšãã«ãªãªãŒã¹ãããŸãã
ã¯ã€ãã¯ãã£ãŒãããã¯
ãããŠãããã¯è¿ éãªãã£ãŒãããã¯ãæå³ããŸããäœãåé¡ãçºçããå Žåãæ¥äžã«åé¡ãããããšãçºèŠããããã«å¯Ÿå¿ããããšãã§ããŸãã
ç§ã¯ããããã®åé¡ã¯ãã¹ãŠãããã®å©ç¹ã«å€ãããšä¿¡ããŠããŸãã 誰ããC ++ã¢ããªã±ãŒã·ã§ã³ãæã£ãŠããããã§ã¯ãããŸããããããããªããããããã©ãŠã¶ã«å ¥ããããªããWebAssemblyã¯ããªãã«ãšã£ãŠ100ïŒ ã®ãŠãŒã¹ã±ãŒã¹ã§ãã
é©çšå
誰ããC ++ã§æžããŠããããã§ã¯ãããŸããã ãã ããWebAssemblyã§äœ¿çšã§ããã®ã¯C ++ã ãã§ã¯ãããŸããã ã¯ããããã¯æŽå²çã«ãåæã®Mozillaãã¯ãããžãŒã§ããasm.jsã§ãŸã å©çšå¯èœãªæåã®ãã©ãããã©ãŒã ã§ãã ã¡ãªã¿ã«ããããã£ãŠãããªãè¯ãããŒã«ããããŸãã 圌ãã¯æè¡èªäœãããå€ãã§ãã
ãã³
ãŸããMozillaã«ãã£ãŠéçºãããŠããæ°ããRustèšèªã¯ãããŒã«ã®ç¹ã§C ++ã«è¿œãã€ããŠè¿œãã€ããŠããŸãã ãã¹ãŠãWebAssemblyã®æãã¯ãŒã«ãªéçºããã»ã¹ãäœæãããšããç¹ã«è³ããŸãã
LuaãPerlãPythonãPHPãªã©
ã€ã³ã¿ãŒããªã¿ãŒã¯C ++ã§èšè¿°ãããŠãããããã»ãšãã©ãã¹ãŠã®èšèªãWebAssemblyã§äœ¿çšã§ããŸããã€ã³ã¿ãŒããªã¿ãŒã¯WebAssemblyã«ã³ã³ãã€ã«ãããŠããã ãã§ããã©ãŠã¶ãŒã§PHPããããããšãã§ããŸãã
è¡ã
ããŒãžã§ã³1.11ã§ã¯ãWebAssemblyã§ã³ã³ãã€ã«ã®ããŒã¿ããŒãžã§ã³ãäœæãã2.0ã§ã¯ãªãªãŒã¹ãµããŒããçŽæããŠããŸãã WebAssemblyã¯ã¬ããŒãžã³ã¬ã¯ã¿ãŒããµããŒãããŠããããGoã¯ãããŒãžã¡ã¢ãªèšèªã§ããããããããã®ãµããŒãã¯åŸã§ç»å ŽããŸããã ãã®ãããã¬ããŒãžã³ã¬ã¯ã¿ãŒãWebAssemblyã®äžã«ãã©ãã°ããå¿ èŠããããŸããã
ã³ããªã³/ãã€ãã£ã
ã³ããªã³ãšåã話ã®åšãã ã³ã³ãã€ã©ã¯å®éšçãªãµããŒããæäŸããŠããŸãããã¬ããŒãžã³ã¬ã¯ã¿ãŒã§äœããããå¿ èŠããããŸãã ã©ã®ãããªã¹ããŒã¿ã¹ãããã®ãââããããŸããã
3Dã°ã©ãã£ãã¯ã¹
ä»ã«äœãèããããŸããïŒ , â 3D-. , , asm.js WebAssembly . , WebAssembly.
, : , , . , .
. , , , , . , , ; â .
, Google Chrome, , WebAssembly-. npm- , Wasm, JS. , ++ - â .
HunSpell â Wasm .
â « ». , - , â OpenSSL. WebAssembly. OpenSSL â , , .
use case wotinspector.com. World of Tanks. , , , , , .
â . , , . , , - ++, WebAssembly, ( , ).
. , , . . , , , , . . .
å³æžé€š
, , ++. , FFmpeg, . , ffmpeg. . , , , , .
â . OpenCV â , WebAssembly, . PDF. SQLite, SQL. SQLite WebAssembly Emscripten, .
Node.js
WebAssembly, Node.js. , Sass â css. Ruby, ++ ( libsass). , Webpack', Node.js. node-sass , JS- .
, , . . :
, node-sass 100 . , ( ) . WebAssembly : , WebAssembly .
Node. , WebAssembly libsass-asm . , . WebAssembly âŠ
Figma â web-. - Sketch, , . ++ ( ), asm.js. , .
WebAssembly, , 3 . , .
Visual Studio Code, , Electron, , , Node-sass. , Node, . , , , WebAssembly.
â AutoCAD. 30 , ++, . , , - JavaScript, , . WebAssembly AutoCAD - , 5 .
, , , , , , , , . FFMpeg â , â QEMU. , , KVM, .
2011 QEMU . , . , Linux , Linux-, , - .
, . bash, , Linux. â GUI . . , , âŠ
, , - . Windows 2000 , , 18 , . , Chrome ( FireFox).
, WebAssembly , , , , .
, WebAssembly. , â , . â , .
, C++ web-. , , â . â , , , .
, . , C++, JavaScript, . , C++. , JS C++, .
â .
CI Pipeline
? JS- , Webpack. , , ( ), JS. webpack watch, , .
ãããã°
, . , , .
Chrome DevTools, Sources wasm-. ( - ), , , .
, , : «, , , , , !». , embedded-, , - .
: -g4 wast- , .
, 100 ( FAR). â , Chrome. E:/_work/bfg/bytefrog/⊠â . , ++ . , SourceMap!
SourceMap
, .
- Firefox.
- --sourcemap-base=http://localhost , SourceMap -, .
- HTTP.
- .
- Windows «:» . .
. CMake , URL -. : wast- , . , .
, :
++ . ! , , stack trace, . , wasm- stack trace, , , , , .
, â SourceMap . , , . , .
«var0».
, . , SourceMap, , .
. Chrome, Firefox. Firefox â «» , , .
Chrome ( , , Mangled ), , , , .
æ§èœ
. , :
- . runtime, . ++ Rust Go.
- JS â Wasm. , JS Wasm. -, , . , .
- . , , , .
- Wasm . Wasm , JS. WebAssembly , .
- JS.
: .
- wasp_cpp_bench
- Chrome 65.0.3325.181 (64-bit)
- Core i5-4690
- 24gb ram
- 5 ; max min;
. JS â , .
++, , - . Grayscale. C++ , . ( ), , JS. , , , ++, .
Sentry, â wasm. , traceKit, Sentry â Raven, â , , wasm . , , , pull request, npm install JS-.
. production, , . debug-, , :
åèš
- WebAssembly , .
- â . 8 , C++, , .
- , , WebAssembly â .
- â JS. JS- , «» , , .
, :
- Emscripten Embind. .
- - Emscripten â . , , 3000 Emscripten.
- Sentry.
- Firefox.
ãæž èŽããããšãããããŸããïŒ .
HolyJS, : 24-25 HolyJS . (, Node.js Ryan Dahl!), â 1 .