![ç»å](https://habrastorage.org/getpro/habr/post_images/d8a/461/a90/d8a461a9052739e0a937c6fe7cf19de8.jpg)
èªè ãžã®èŠå
ãã®èšäºã¯2016幎6æ24æ¥ã«å·çãããŸããã WebAssemblyã¯éåžžã«è¥ããŠåçãªæè¡ã§ãããããæéã®çµéãšãšãã«ããã®èšäºã§èª¬æãããã®ã®å€ãã¯æ代é ãã«ãªãããå®å šã«å€æŽãããŸãããã®ç¹ã«çæããŠãã ããã
ããè¡ããŸãããã
WebAssemblyãšã¯äœã§ããïŒ
å ¬åŒããã¥ã¡ã³ãã«ã¯æ¬¡ã®ããã«èšèŒãããŠããŸãããWebAssemblyãŸãã¯wasmã¯ãæ°ããããŒã¿ãã«ã§å¹ççãªãµã€ãºã§ãWebçšã®ããŠã³ããŒãé床ã®ã³ã³ãã€ã«åœ¢åŒã§ããã ããŒã...äœïŒ äœã®ãã©ãŒãããïŒ ããã¹ããŸãã¯ãã€ããªïŒ ã¯ããããã¯ççŽã«èšã£ãŠæªã説æã§ãã ã ããããªãã®æµè¡èªãã³ãŽã«ãŒããæ¢ã«åé€ããç§ã®çµéšã«åºã¥ããŠãç§ã¯ç§ã®å®çŸ©ãäžããŸãïŒ
ãWebAssemblyãŸãã¯wasmã¯ãçç£æ§ã®é«ãããã©ãŠã¶ã«äŸåããªãWebçšã³ã³ããŒãã³ããèšè¿°ããããã®ãã€ãã³ãŒãä»æ§ã§ããã ãã¡ããããã®å®çŸ©ã¯ãå€é£ã®ãžã£ã³ã«ã®é ç¹ã§ã¯ãããŸããããç§ã¯ãããè£è¶³ããããšããŸãã WebAssemblyã¯ãéçã«åæå®ãããå€æ°ã䜿çšããããšã§ããã©ãŒãã³ã¹ãæ¹åã§ããŸããããã¯ãåçå€æ°ãããåçå®è¡æã®ã³ã¹ããã¯ããã«äœããªããŸãã WebAssemblyã¯W3Cã³ãã¥ããã£ã°ã«ãŒãã«ãã£ãŠéçºãããŠããããã¹ãŠã®äž»èŠãªãã©ãŠã¶ãŒã«å®è£ ãããäºå®ã§ãã ãããŠããã®ç¬éããããã©ãŒæ©èœãããŒãã«ã«é 眮ãããŸããWebã³ã³ããŒãã³ãã®ã³ãŒããä»»æã®ããã°ã©ãã³ã°èšèªã§èšè¿°ã§ããŸãã
é³ãè¯ããªããŸãããã
ããå§ããŸããã
æ°ããããšãåŠã¶ãšããç§ã¯éåžžããã¹ãŠãã©ã®ããã«æ©èœããããèŠãã®ã«ååãªãå¯èœãªéãå°ããäŸãæ¢ããŸãã æ®å¿µãªããããã®ã¢ãããŒãã¯WebAssemblyã§ã¯ããŸãäžå¯èœã§ãã ä»æ§ã®çŸåšã®ç¶æ ã§ã¯ãwasmã¯åãªããã€ãã³ãŒã圢åŒã§ãã 1996幎é ãSun Microsystemsã®ãšã³ãžãã¢ãJVMãæ³åããŠããŸããããJavaããªããšæ³åããŠã¿ãŠãã ããã äŒè©±ã¯æ¬¡ã®ããã«ãªããŸãã
ã-ã¿ãªãããç§ãã¡ãäœæãããã€ãã³ãŒããå®è¡ããããã®ã¯ãŒã«ãªãã·ã³ããã§ãã¯ããŠãã ããïŒ
-ãã£ãããïŒ ãããŠããã®ããã®ã³ãŒããæžãæ¹æ³ã¯ïŒ
-ãªã©ïŒ
![ç»å](https://habrastorage.org/getpro/habr/post_images/983/c8a/ab0/983c8aab0357bfec10559ac092d3fab1.png)
ãããŒã...ãã£ããã...æãªãšãã«ãã£ãŠã¿ãŸããã
ãæåŸã«ãåé¡ãã¢ã€ãã¢ãããã°æããŠãã ããïŒã
-ã¯ããã¯ãã ããããç§ã¯ããã§å°ãå¿ããã§ããç§ã¯ããã€ãã®ä»ã®ãã®ãèŠãå¿ èŠããããŸã...ããããããã«-ããããã«ïŒã
JVMãå°ãªããšãJavaèšèªã«åºã¥ããŠãããããããã§ãæªãäŸã§ãããWebAssemblyã§ã¯ããããããŸããã ããªããèããã€ããããšãé¡ã£ãŠããŸãã ããããã°ã©ãã³ã°èšèªã®ã³ãŒãããã®ãã€ãã³ãŒãã«ã³ã³ãã€ã«ããããŒã«ã®ãªããã€ãã³ãŒããæ³åãããšãææ Œããã®ã¯é£ããã§ãããã ããã§ã¯ãã©ã®ããã«WebAssemblyãå§ããŸããïŒ
WebAssemblyã®åã«äœãæ¥ãŸãããïŒ
ç¹ã«èšç»ãããç®æšãæ£åŒãªä»æ§ãååŸããããšã§ããå Žåãã»ãšãã©ã®æè¡ã¯ä»¥åã®ããã€ãã®æè¡ã®éçºã®çµæã§ãã WebAssemblyãäŸå€ã§ã¯ãããŸãããããã¯ãasm.jsã§äžåºŠå®çŸ©ãããã¢ã€ãã¢ã®éçºã®ç¶ç¶ã§ãããéçåä»ãã§ã³ã³ãã€ã«ã§ããããã«JavaScriptã³ãŒããèšè¿°ããããã«èšèšãããä»æ§ã§ãã Wasmã¯ãããããããã°ã©ãã³ã°èšèªã®ã³ã³ãã€ã©ã§äœæå¯èœãªãã€ãã³ãŒãä»æ§ãäœæããããšã§ãããã®ã¢ã€ãã¢ãéçºããææ°ã®ãã©ãŠã¶ã§ã®å®è¡ã«é©ãããã€ããªãã¡ã€ã«ãšããŠã€ã³ã¿ãŒãããçµç±ã§éä¿¡ããŸããã
asm.jsã¯ãJavascriptèšèªã®æ©èœã®ãµãã»ããã䜿çšããŠjavascriptã³ãŒããèšè¿°ããããã®åãªãä»æ§ã§ãã asm.jsã§ã³ãŒããæåã§äœæã§ããŸããäœããååŸããŠäœæãããå Žåã¯ãå§ããŸãããã
function MyMathModule(global) { "use asm"; var exp = global.Math.exp; function doubleExp(value) { value = +value; return +(+exp(+value) * 2.0); } return { doubleExp: doubleExp }; }
ããã¯ããŸã䟿å©ãªæ©èœã§ã¯ãããŸããããasm.jsä»æ§ã«åŸã£ãŠèšè¿°ãããŠããŸãã ãããããªãã«ãšã£ãŠå°ãã°ãããŠããããã«èŠããå Žå-ããªããããèããã®ã¯ããªãã ãã§ã¯ãªãããšãç¥ã£ãŠãã ããã ãã ããããããã¹ãŠã®ãå¥åŠãªãæåïŒããããã¹ãŠã®åé æŒç®åïŒãå¿ èŠã§ãã ãããã¯ãæäœã®ã³ã³ãã€ã©ããŒã¿åã瀺ããŸãã ã³ãŒãã¯éåžžã«åçŽã§ãããã©ããã§ãã¹ããããšããããã°ã³ã³ãœãŒã«ã«ããªãèªã¿ããããšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸãã
ãã®é¢æ°ã䜿çšããå Žåã¯ã次ã®ããã«äœããã®æ¹æ³ã§å®è¡ã§ããŸãã
var myMath = new MyMathModule(window); for(var i = 0; i < 5; i++) { console.log(myMath.doubleExp(i)); }
ãããŠããã¹ãŠãæ£ããè¡ã£ãå Žåãåºåã«åæ§ã®ãã®ã衚瀺ãããã¯ãã§ãã
![ç»å](https://habrastorage.org/getpro/habr/post_images/1a0/60d/433/1a060d4330136354dacac2e79e27e04e.png)
ãããŠæåŸã«ãWebAssemblyã«ç§»åããŸã
çŸæç¹ã§ã¯ãasm.jsã«æ©èœããã³ãŒãããããŸãã GitHubã®å ¬åŒWebAssemblyããŒãžã«ã¢ã¯ã»ã¹ããŠããã®ã³ãŒããwasmã§ã³ã³ãã€ã«ããããã®ããŒã«ãèŠã€ããããšãã§ããŸãã å¯äžã®åé¡ã¯ããããã®ããŒã«ãèªåã§çµã¿ç«ãŠãªããã°ãªããªãããšã§ãã ççŽã«èšã£ãŠãããã¯å šã¯ãšã¹ãã®ææªã®éšåã§ãã ãããã®ããŒã«ã¯çµ¶ããå€åããŠãããç¹ã«Windowsã§ã®äœ¿çšã«é¢ããŠã¯ãæã å£ããç¶æ ã«ãªã£ãŠããŸãã
ãã«ãããã«ã¯makeãšcmakeãå¿ èŠã§ãã Windowsã§äœæ¥ããŠããå Žåã¯ãVisual Studio 2015ãå¿ èŠã«ãªããŸã ãMacçšã®ã¢ã»ã³ããªæé ãšWindowsçšã®ã¢ã»ã³ããªæé ã以äžã«ç€ºããŸãã
![ç»å](https://habrastorage.org/getpro/habr/post_images/d2d/04d/0b6/d2d04d0b6f40c44d625cfcc2c1354e57.png)
ãããã®ãŠãŒãã£ãªãã£ã®åéããããã€ããªã®é åžã¯ãWebAssemblyãã¯ãããžã®æšé²ã«ãããŠå€§ããªåé²ãšãªãããšã«æ³šæããå¿ èŠããããŸãã
äžèšã®ãã¹ãŠãåé¡ãªãå®è¡ããå Žåãbinenãã©ã«ããŒã«binãã©ã«ããŒããããããã«asm.jsã³ãŒããwasmã«å€æããããã®ããŒã«ããããŸãã æåã®ããŒã«ã¯asm2wasm.exeãšåŒã°ããŸãã asm.jsã³ãŒãã.sã³ãŒã圢åŒã«å€æããŸããããã¯ãwasm圢åŒã®æœè±¡æ§æããªãŒïŒASTïŒã®ããã¹ãè¡šçŸã§ãã asm.jsã³ãŒãã§asm2wasmãå®è¡ãããšã次ã®ãããªçµæãåŸãããŸãã
(module
(memory 256 256)
(export "memory" memory)
(type $FUNCSIG$dd (func (param f64) (result f64)))
(import $exp "global.Math" "exp" (param f64) (result f64))
(export "doubleExp" $doubleExp)
(func $doubleExp (param $0 f64) (result f64)
(f64.mul
(call_import $exp
(get_local $0)
)
(f64.const 2)
)
)
)
ãã®ã³ãŒããè¡ããšã«è§£æã§ããŸãããããã§åŒ·èª¿ãããã®ã¯ãwasmã¯ãã€ããªåœ¢åŒã§ããããããã©ãŠã¶ã§äœããã¯ãªãã¯ããŠãJavascriptã§äœ¿çšããŠããã³ãŒããèŠãã ãã§ã¯å€±æããããšã§ãïŒå°ãªããšããã®å Žåã¯ç¬éïŒã 衚瀺ãããå 容ã¯ãäžèšã®ã³ãŒããšéåžžã«ãã䌌ãŠããŸãã
次ã®ã¹ãããã¯ããã®.s圢åŒãwasm-binaryã«å€æããããšã§ãããã®ãããwasm-as.exeãŠãŒãã£ãªãã£ã䜿çšããŸãã ããã.sãã¡ã€ã«ã«é©çšãããšãåºåã§ãã€ãã³ãŒããååŸãããŸãããã®ããã«ããã®ã¹ããŒãªãŒå šäœãéå§ããŸããã
![ç»å](https://habrastorage.org/getpro/habr/post_images/280/008/4ef/2800084ef9d7ede5e11c2829c30486ff.png)
![ç»å](https://habrastorage.org/getpro/habr/post_images/45f/18b/589/45f18b589ba5e263f668c10faf547f2b.png)
FirefoxãŸãã¯Chrome Canaryã®ææ°ããŒãžã§ã³ãå ¥æããWebAssemblyããããã«å«ããŸãã
Firefoxã®å ŽåãconfigïŒãéããæ€çŽ¢ããŒã«ãwasmããšå ¥åããå¿ èŠããããŸãã ãã®åŸãjavascript.options.wasmãªãã·ã§ã³ã®å€ãtrueã«å€æŽãããã©ãŠã¶ãŒãåèµ·åããŸãã Chrome Canaryã®å Žåã¯ãchromeïŒ//ãã©ã°ãéããExperimental WebAssemblyãªãã·ã§ã³ãèŠã€ããŠæå¹ã«ããŠããããã©ãŠã¶ãåèµ·åããå¿ èŠããããŸãã
次ã«ããã©ãŠã¶ã§ã¢ãžã¥ãŒã«ãå®è¡ããå¿ èŠããããŸãã ãããè¡ãæ¹æ³ã¯å®å šã«ã¯æããã§ã¯ãªããããæåã¯ãããåé¡ã§ããããšãå€æããŸããã Chrome Canaryã§ã³ã³ãœãŒã«ãéãããWebAsseããšå ¥åããŠã¿ãŸããããäœããã³ãã¯ãããŸããã§ããã ãã®åŸããWasããšå ¥åããŠãã³ããåŸãŸããïŒ ã€ã³ã¹ãã¯ã¿ã®ãã®ãªããžã§ã¯ãã¯ãããã¥ã¡ã³ãã®ç¹ã§éåžžã«è²§åŒ±ã«èŠããŸããã äœæ¥äŸãæ¢ããŠã©ã®ããã«ãããã£ããã«ã€ããŠã®è©±å šäœãçç¥ããŸãããæçµçã«ã¯WebAssemblyãªããžããªã®JS.mdãã¡ã€ã«ã§èŠã€ãããšã ãèšããŸãã ããã¥ã¡ã³ããšäŸã®ãããªãã®ããããŸãããããã«ãããŸãïŒ
fetch("my-math-module.wasm") .then(function(response) { return response.arrayBuffer(); }) .then(function(buffer) { var dependencies = { "global": {}, "env": {} }; dependencies["global.Math"] = window.Math; var moduleBufferView = new Uint8Array(buffer); var myMathModule = Wasm.instantiateModule(moduleBufferView, dependencies); console.log(myMathModule.exports.doubleExp); for(var i = 0; i < 5; i++) { console.log(myMathModule.exports.doubleExp(i)); } });
ãããhtmlãã¡ã€ã«ã«ããããããããŒã«ã«WebãµãŒããŒãéžæããŠããã®ãã¡ã€ã«ããã©ãŠã¶ãŒã§éããŸãã ãããã©ã®ããã«èŠãããã§ãïŒ
![ç»å](https://habrastorage.org/getpro/habr/post_images/3c7/730/b40/3c7730b404c6c12e90a8a06a564751ac.png)
ãã°ã¬ããŒããéä¿¡ããæéã§ãã ããã¯ãŸã éåžžã«ç²éã§å®éšçãªæè¡ã§ãããããéäžã§çºçãããã°ã«é©ããªãã§ãã ããã
![ç»å](https://habrastorage.org/getpro/habr/post_images/eb8/e10/e72/eb8e10e720b34ba2c55ca0cd1a6c9060.png)
ããã§ãšãããããŸãïŒ
æåã®WebAssemblyã³ã³ããŒãã³ããäœæããŸããã 次ã¯ïŒ ãŸããç§ãã¡ã¯ã»ãã®å°ãã ãç§å¯ã®ããŒã«ãæšãŠãŸããã asm.jsã³ãŒããæžãããšããã®äŸã®éµã§ãããããçš®ã®éèªæãªæ©èœãæžãã«ã¯æéãããããå¿èãå¿ èŠã§ããã emscriptenã䜿çšãããšãasm.jsã§éèŠãªã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã€ã«ããã®ãã¯ããã«ç°¡åã«ãªããŸãã å€ãã®æŠå¿µãWebAssemblyã®asm.jsã«çŽæ¥ç§»åãããããasm.jsã®ä»æ§ãç¹ã«ã¡ã¢ãªã¢ãã«ã®ã»ã¯ã·ã§ã³ãèªãããšããå§ãããŸãã å¥ã®éèŠãªãã€ã³ãïŒçŸæç¹ã§ã¯ãé¢æ°ã«åŒæ°ãšããŠé åãæž¡ãããšã¯ã§ããŸããã ããã¯å€æŽãããã¹ãã§ãããšããåæããããŸããããããŸã§ã®ãšããããã¯ä»æ§ã«åæ ãããŠããŸããã ãã€ã³ã¿ãæäœããããžãã¯ãæŽæ°ããŸãã
å¥ã®æ³šæç¹ïŒwasmã§éèŠãªããšãæžãå§ãããšãå€ãè¯ãJavascriptãããããã©ãŒãã³ã¹ãäœäžããå Žåãããããšã«æ°ä»ããããããŸããã ãã¹ãŠã®ãã©ãŠã¶ã®ææ°ã®Javascriptãšã³ãžã³ã¯éåžžã«é«åºŠã«æé©åãããŠãããWasmãå¹æãçºæ®ãããŸã§ã«æéããããããšã«æ³šæããŠãã ããã WebAssemblyã®çè«äžã®ããã©ãŒãã³ã¹å¶éã¯ãããã¹ã圢åŒã®Javascriptã³ãŒãã®ãããããé«ããªã£ãŠããŸãããWebAssemblyã¯ãŸã ç£æ¥ã§äœ¿çšããæºåãã§ããŠããŸããã