ãã®èšäºã¯ã2017幎10æ14æ¥ã«ãªã£ã¶ã³ã§éå¬ãããITSubbotnikã§ã®ã¹ããŒãã«åºã¥ããŠããŸãã ãã·ã¢èªã§ã¯ããã®ãããã¯ã«é¢ããè³æããŸã ããªããããŸãããã®èšäºãã圹ã«ç«ãŠã°å¹žãã§ãã
å 責äºé ïŒèè ã¯WebAssemblyãŸãã¯JavaScriptã®å°é家ã§ã¯ãããŸããã ãã®èšäºã¯ããã®ãããã¯ã«é¢ããä»ã®äººã ã®ã¹ããŒãããå°ãåºãããèããšã¢ã€ãã¢ããŸãšãããã®ã§ãããæ°ãæéWebAssemblyãåŠç¿ããçµéšããããŸãã
WebAssemblyãšã¯äœã§ããïŒ
WebAssembly ïŒ WASM ïŒ-ãã©ãŠã¶ã§ã³ãŒããå®è¡ã§ããæ°ãããã€ããªåœ¢åŒã
ãã®ãããªå®çŸ©ã§ååã§ããã°ãããå®å
šãªå®çŸ©ã¯Wikipediaã§èŠã€ããããšãã§ããŸãã
åé¡
ãŸããWebAssemblyãäœæããŠã解決ããããšããåé¡ãã¿ã¹ã¯ãç解ããŸãããã åé¡ã¯æ±ºããŠæ°ãããã®ã§ã¯ãªããå®éã«ã¯ãã©ãŠã¶ãŒã§ã³ãŒãããã°ããå®è¡ããããšã§ã ã ããããããã¯ããã»ã©åçŽã§ã¯ãªããåé¡èªäœã«å ããŠãããã€ãã®é¢é£ããèŠä»¶ããŸã ããããšãåŸã ã«å€æããŸããã
- JavaScriptããé«é-çæ³çã«ã¯é床ãéã
å ã®ããã»ããµã®ãã€ãã£ãã³ãŒãã - ãŒãæ§æ-ãœãªã¥ãŒã·ã§ã³ã¯ã€ã³ã¹ããŒã«ãªãã§ããã«äœ¿çšã§ãããã©ãŠã¶ã®ã¿ãå¿ èŠã§ãã
- å®å š-æ°ããæè¡ã¯æ°ããè åšãçã¿åºãã¹ãã§ã¯ãããŸããã
- ã¯ãã¹ãã©ãããã©ãŒã -ã¢ãã€ã«ãè€æ°ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãªã©ãè€æ°ã®ãã©ãããã©ãŒã ããããŸãã
- éçºè ã«ãšã£ãŠäŸ¿å©-䟿å©ãªéçºããã³ãããã°ããŒã«ãå¿ èŠã§ãã
ç¶æ³
ãã®åé¡ã解決ããããã«ãåè ã1人ããŸãããããJavaScriptã§ãã
æè ïŒå®å šãªãªã¹ãããã¯ã»ã©é ãïŒïŒ
- ActiveX-ãµã³ãããã¯ã¹ã䜿çšããã«ãã¹ãŠããã¹ãŠå®è¡ã§ãããã¯ãããžãŒã¯ãããããæ¬åœã®ã»ãã¥ãªãã£äžã®è åšããããããŸããã
- Flash-2017幎ãã¢ããã¯Flashã®ãµããŒããçµäºããèšç»ãçºè¡šããŸããã
- Silverlight
ããã³ãã®ä»ã®ãã©ã°ã€ã³
ãã®ä»ã®è§£æ±ºçïŒ
- NaCl-Native Client-Googleã®ã€ãã·ã¢ããã¯2011幎ã«ç»å ŽããŸããã Chrome以å€ã®ãã©ãŠã¶ã®ãµããŒãã¯èŠã€ãããŸããã§ããã
- PNaCl-ããŒã¿ãã«ãã€ãã£ãã¯ã©ã€ã¢ã³ã-LLVM IRãµãã»ããã
- asm.js-Mozillaã2013幎ã«ç»å Ž-以äžã§è©³çŽ°ãæ€èšããŸãã
äžè¬ã«ã解決ã®è©Šã¿ã¯ãã¹ãŠ2ã€ã®ã°ã«ãŒãã«åããããšãã§ããŸãã
解決ç1ïŒãã€ãã£ãã³ãŒãããã©ãŠã¶ãŒã«çŽæ¥
äŸïŒActiveXãNaCl
æªãç¹ïŒç§»æ€æ§ããªããæœåšçãªããŸãã¯æ¬åœã®ã»ãã¥ãªãã£åé¡ã
解決ç2ïŒä»®æ³ãã·ã³ã®ã³ãŒã
äŸïŒJavaã¢ãã¬ãããSilverlightãªã©ã
æªãç¹ïŒãã©ã°ã€ã³ãã©ã³ã¿ã€ã ãå¿
èŠâãŒãèšå®ãªã
äžè¬ã«ãã³ãŒãã®ã¯ãã¹ãã©ãããã©ãŒã å®è¡ãä¿èšŒãããå Žåãä»®æ³ãã·ã³ãé©åãªã¢ãããŒãã§ãã
JavaScriptã®äœãåé¡ã«ãªã£ãŠããŸããïŒ
JavaScriptã¯åé¡ãããŸããã ããããé·å¹Žã«ãããçç£æ§ã®æé·ãèŠããšãSåæ²ç·ã®2çªç®ã®ããã©ããŒãã«ããããšãããããŸãã æåã¯ãããã©ãŒãã³ã¹ã¯å°ãããåŸã
ã«æé·ããŸãããV8ã®ç»å Žã«ãããããªãåã«ã¹ã ãŒãºãªæé·ã«è»¢ããŠããæ¥æ¿ãªãžã£ã³ããèŠãããŸããã
ïŒç»åã¯ããªã³ã¯ã©ãŒã¯ã«ããWebAssemblyãžã®èŠçŽæŒ«ç»ã®çŽ¹ä»ããïŒã
ææ°ã®JavaScriptãšã³ãžã³ã®ä»çµã¿ãèŠãŠã¿ãŸãããã
ãŸãããœãŒã¹ã³ãŒãïŒJSã®ããã¹ãïŒã¯ããŒãµãŒãééããŸãããã®çµæãã³ãŒãã®å éšè¡šçŸãã€ãŸãæœè±¡æ§æããªãŒãçæãããŸãã ãã®åŸãã€ã³ã¿ãŒããªã¿ãŒãåäœããŸãã ç¹å®ã®é¢æ°ã¯ãå®è¡äžã«ãã€ãã³ãŒãã«å€æãããŸã-å®éã«ã¯ãã€ã³ã¿ãŒããªã¿ãŒã®å éšé¢æ°ãžã®äžé£ã®åŒã³åºãã åæã«ãJSé¢æ°ã®äœ¿çšã«é¢ããçµ±èšãèç©ãããŸãã ç¹å®ã®é¢æ°ã§åŒã³åºãã®ãããå€ãè¶ ããå Žåãæé©åãå¿ èŠã§ãããšå€æãããã³ã³ãã€ã©ã«æž¡ãããŸãã ã³ã³ãã€ã©ãŒã¯ãã·ã³ã³ãŒããçæããŸããããã¯å ¥åå€ã®ã¿ã€ãã«åŒ·ãçµã³ä»ããããŠããŸãã
fooïŒaãbïŒãšãã2ã€ã®åŒæ°ãæã€é¢æ°ãããããã©ã¡ãŒã¿ãŒã®æ°å€ã§äœåºŠãåŒã³åºããšä»®å®ããŸãã ããæç¹ã§ãé¢æ°ã¯ã³ã³ãã€ã©ãŒã«æž¡ãããããé«éã«å®è¡ãããŸãã æåååŒæ°ã§åŒã³åºããšä»®å®ããŸãã ãã®çµæããšã³ãžã³ã¯ãéæé©åããå®è¡ããŸããã³ã³ãã€ã©ããé¢æ°ãã€ã³ã¿ãŒããªã¿ãŒã«æ»ããå®æãããã·ã³ã³ãŒããç Žæ£ãããŸãã
ããã¯ã©ãããæå³ã§ããïŒ JavaScriptãšã³ãžã³ã®éçºè ã¯çŽ æŽãããä»äºãããŠããã圌ãã«æè¬ããŠããŸãã JavaScriptã¯æ±ºããŠæªããããŸããããå éšçãªå¶éããããæ ¹æ¬çã«é«éåããããšã¯ãããŸããã
asm.js
ãã1ã€ã®èå³æ·±ãã€ãã·ã¢ããã¯ããã§ã«Mozilla Foundationããã®ãã®ã§ãWebAssemblyã®ãããã¯ã«è¿ã¥ããŠããŸãã 2010幎ã«ç»å Žãã2013幎ã«å ¬éãããŸããã
ãã®ã¢ã€ãã¢ã¯ãç¹å¥ãªEmscriptenã³ã³ãã€ã©ã䜿çšããŠCããã³C ++ããã³ãŒããã³ã³ãã€ã«ã§ããJavaScriptã®ãµãã»ãããäœæããããšã§ãã
ããã¯JavaScriptã®ãµãã»ããã§ããããããã®ã³ãŒãã¯ã©ã®ãã©ãŠã¶ãŒã§ãå®è¡ãããŸãã ããã«ãæè¿ã®äž»èŠãªãã©ãŠã¶ã¯ãasm.jsããã°ããèªèãããããããã»ããµã®ãã€ãã£ãã³ãŒãã«å¹ççã«ã³ã³ãã€ã«ããããšãã§ããŸããã C / C ++ããçŽæ¥ååŸãããã€ãã£ãã³ãŒããšæ¯èŒããŠãasm.jsã³ãŒãããååŸããã³ãŒãã¯1.5ã2åïŒ50ã67ïŒ ïŒã ãé ããªããŸãã
åçŽãªC / C ++é¢æ°ã®å Žåãasm.jsã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
ããã§ã 'use asm'
ã¯ã以äžã®ã³ãŒããasm.jsã§ããããšãJSãšã³ãžã³ã«ç€ºããã£ã¬ã¯ãã£ãã§ããã |0
ã®åœ¢åŒã®æ§é ã¯ãæŽæ°ã§äœæ¥ãè¡ãããããšã瀺ããŸãïŒãŒãå€ã®ãããåäœã®ORã¯ãNumberã®å°æ°éšããªã»ããããŸãïŒ
WebAssemblyéçºã®ç®æš
- é床ã¯ã»ãšãã©ãã€ãã£ãã³ãŒãã«äŒŒãŠããŸãã
- å¹ç-ãã€ããªåœ¢åŒãé«é解æããã³ã³ã³ãã€ã«ã
- 移æ€æ§-ãã¹ãŠã®ãã©ãŠã¶ãŒãšãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã
- ã»ãã¥ãªãã£-ãµã³ãããã¯ã¹ã§èµ·åããŸãã
- ãããã°ã®å©äŸ¿æ§-ãã©ãŠã¶ã§ã®ãããã°ãµããŒãããããã¬ãŒããããŸãã
- ãªãŒãã³ã¹ã¿ã³ããŒã-ã€ãŸããããã¯ãã¯ãããã©ã³ã±ãããããèªäœã®äžã«åŒã£åŒµããããšããå¥ã®äŒç€Ÿã®ã€ãã·ã¢ããã§ã¯ãããŸããã ãã®èŠæ Œã¯2017幎ã«ãã§ã«æ¡çšãããŠããŸãã
ããã§ã¯ãWebAssemblyãšã¯äœã§ããïŒ
- ãã€ããªåœ¢åŒ
- ããã°ã©ãã³ã°èšèªã§ã¯ãªãããã€ãã³ãŒã
Javaãã€ãã³ãŒããããã°ã©ãã³ã°èšèªãšã¯åŒã³ãŸããã - ãã©ãŠã¶ã«ããŒãããããã©ãŠã¶ã§å®è¡ãããŸãã
æ£åŒã«ã¯ãWebAssemblyã¯ãã©ãŠã¶èªäœã§ã¯ãªãJavaScriptãšã³ãžã³ã«ãã£ãŠå®è¡ããããããããšãã°NodeJSã®äžãªã©ãä»ã®å®è¡ãªãã·ã§ã³ããããŸãã - ä»®æ³ãã·ã³ã«ãã£ãŠå®è¡ãããŸã
ããã¯ã¡ã¢ãªãåããã·ã³ãã«ãªã¹ã¿ãã¯ããã·ã³ã§ãããã·ã³ãã«ãªãããææ°ã®ããã»ããµã«ç°¡åã«å®è£ ã§ããŸãã - JavaScriptãä»ããŠå€éšãšéä¿¡ããããšãé€ããŠãWebãšã¯é¢ä¿ãããŸããã
å®éãWebAssemblyã¯ã¡ã¢ãªãæã¡ãåœä»€ãå®è¡ããåãªãä»®æ³ãã·ã³ã§ãã
ã©ãããå§ããŸããïŒ ãããŒã¯ãŒã«ã
WebAssemblyããã¹ã¿ãŒãããªã³ã©ã€ã³ã®WasmFiddleããŒã«ããå§ããããšã匷ããå§ãããŸãã
ïŒç§èªèº«ã¯Emscriptenããå§ããŠããã°ããããŠããèªåã®ééãã«æ°ã¥ããŸãããïŒ
WasmFiddleã€ã³ã¿ãŒãã§ãŒã¹ïŒ
ãœãŒã¹ã³ãŒãã¯å·Šäžããã«ããã¿ã³ïŒããã¹ããã¥ãŒã衚瀺ãããïŒã®ã³ã³ãã€ã«çµæã¯å·Šäžã«ãããèµ·åçšã®ã³ãŒãã¯å³äžã«ãããå®è¡ãã¿ã³ã®å®è¡çµæã¯å³äžã«ãããŸãã
äŸãšããŠããã£ããããæ°ãèšç®ããããã«åçŽãªã³ãŒãã䜿çšããŸããïŒã¯ããããã:)ãè¯ãã³ãŒãã¯åºäŒã£ãæåã®googleããŒãžã§ã³ã§ãããšèšãã®ã§ã¯ãããŸããã
int fib(int n) { if (n == 0) { return 0; } else { if ((n == -1) || (n == 1)) { return 1; } else { if (n > 0) { return fib(n - 1) + fib(n - 2); } else { return fib(n + 2) - fib(n + 1); } } } }
ããã¹ããã¬ãŒã³ããŒã·ã§ã³ïŒWASTïŒã«ã€ããŠå°ãã æ¢ã«è¿°ã¹ãããã«ãWebAssemblyã¯ãã€ããªåœ¢åŒã§ãããã³ã³ãã€ã«ã®åºåã§WASMãã¡ã€ã«ãååŸããŸãã ããã¹ãè¡šçŸã¯ãåžžã«WASMãã¡ã€ã«ããååŸã§ããŸããããã«ãããã¢ã»ã³ããªã«å«ãŸããå 容ãããŒãã«ããã³ã³ãŒããæ£ç¢ºã«ææ¡ã§ããŸãã ãŸãããã®ãã¥ãŒã¯ãããã°ã«äœ¿çšãããŸãã
ãã®å Žåãããã¹ãè¡šçŸã«ããã°ã1ããŒãžã®ã¡ã¢ãªãå²ãåœãŠããïŒåããŒãž= 64 KBïŒãã¡ã¢ãªãšfibé¢æ°ã衚瀺ïŒãšã¯ã¹ããŒãïŒããããã®é¢æ°ã®å®çŸ©ãã€ãŸãå®éã®å®è£ ã衚瀺ãããŸãã
ãã®ã¢ã»ã³ããªã®ããã¹ãè¡šçŸã®å§ãŸãã¯æ¬¡ã®ããã«ãªããŸãã
(module (table 0 anyfunc) (memory $0 1) (data (i32.const 12) "\01\00\00\00\00\00\00\00\01\00\00\00") (export "memory" (memory $0)) (export "fib" (func $fib)) (func $fib (param $0 i32) (result i32) (local $1 i32) (block $label$0 (br_if $label$0 (i32.ge_u (tee_local $1 (i32.add (get_local $0) (i32.const 1) ) ) (i32.const 3) ) ) (return (i32.load (i32.add (i32.shl (get_local $1) (i32.const 2) ) (i32.const 12) ) ) ...
ãŸãšãããšãäŸãå®è¡ããããã®æå°éã®JavaScriptã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
var wasmCode = new Uint8Array( [0,97,115,109,1,0,0,0,1,134,128,128,128,0,1,96,1,127,1,127,3,130,128,128,128,0,1,0,4,132,128,128,128,0,1,112,0,0,5,131,128,128,128,0,1,0,1,6,129,128,128,128,0,0,7,144,128,128,128,0,2,6,109,101,109,111,114,121,2,0,3,102,105,98,0,0,10,203,128,128,128,0,1,197,128,128,128,0,1,1,127,2,64,32,0,65,1,106,34,1,65,3,79,13,0,32,1,65,2,116,65,12,106,40,2,0,15,11,2,64,32,0,65,1,72,13,0,32,0,65,127,106,16,0,32,0,65,126,106,16,0,106,15,11,32,0,65,2,106,16,0,32,1,16,0,107,11,11,146,128,128,128,0,1,0,65,12,11,12,1,0,0,0,0,0,0,0,1,0,0,0]); var wasmModule = new WebAssembly.Module(wasmCode); var wasmInstance = new WebAssembly.Instance(wasmModule, []); console.log(wasmInstance.exports.fib(10));
ããã§ã¯ãå®æããWASMã¯æ°åã®é åãšããŠã³ãŒãã«èšè¿°ãããŠããŸãããå®éã«ã¯ãWASMãã¡ã€ã«ã¯ããªã倧ãããªãããµãŒããŒããããŒãããŸãã
ãã©ãŠã¶ã§ã®WebAssemblyã®å®è¡ã¯æ¬¡ã®ããã«ãªããŸãã ãã©ãŠã¶ãŒã¯ãéåžžã©ãããJavaScriptãå®è¡ãããŠããHTMLããŒãžãããŒãããŸããããã¯ãã§ã«WebAssemblyãããŒãããŠããŸã-ãã¢ãžã¥ãŒã«ãïŒWebAssemblyã¢ãžã¥ãŒã«ïŒãå€æããã¢ãžã¥ãŒã«ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãããã®åŸããã®ã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠãšã¯ã¹ããŒãããé¢æ°ãåŒã³åºãããšãã§ããŸãã
ããã§ç°è²ã®ç¢å°ã«æ³šæããŠãã ãããWebAssemblyå ããJavaScripté¢æ°ãåŒã³åºãããšãã§ããŸãã ã·ãŒã±ã³ã¹å³ã§ããããã詳现ã«æ€èšããŠãã ããã
ããã§ã¯ãæåã«WebAssemblyããJavaScriptãåŒã³åºãã次ã«WebAssemblyããJavaScriptãåŒã³åºããŸãã
ããã§ã®2çªç®ã®åŒã³åºãã§ã¯ãWebAssemblyãã©ã®ããã«APIïŒDOM / WebGLãªã©ïŒã䜿çšãããã瀺ããŸããã çŽæ¥ã§ã¯ãªããå¯èœã§ããããã®ãããªåŒã³åºãã¯JavaScriptãä»ããŠã®ã¿çºçããŸãã æããã«ãããã«ãããã«ããã¯ãããããŸããWASMã®APIãéäžçã«äœ¿çšãããšãJavaScriptãä»ããŠãããã®åŒã³åºãããã¹ããŒãããæéãå€§å¹ ã«æžããŸãã
WebAssemblyã¡ã¢ãªã¢ãã«ã¯éåžžã«åçŽã§ãã ããã¯ãããã°ã©ã ã³ãŒããã°ããŒãã«å€æ°ãã¹ã¿ãã¯ãããã³ããŒããé 眮ããããã©ãããªã¡ã¢ãªã®äžéšã§ãã 次ã®ã¡ã¢ãªå²ãåœãŠã§ååãªã¹ããŒã¹ããªãå Žåãã¡ã¢ãªã®äžéãèªåçã«å¢å ããå Žåãã¡ã¢ãªãæ¡åŒµå¯èœã«ããããšãã§ããŸãã
ã¡ã¢ãªãããã¯å
šäœã¯ããã€ãé
åãšããŠïŒããã³16ãããããã³32ãããã¯ãŒãã®é
åãšããŠã16ãããããã³32ãããã®æµ®åå°æ°ç¹å€ã®é
åãšããŠïŒJavaScriptããã¢ã¯ã»ã¹ã§ããŸãã ããã«ãJavaScriptã®ã¡ã¢ãªã¯èªã¿åããšæžã蟌ã¿ã®äž¡æ¹ã«äœ¿çšã§ããŸãã
Emscripten
Emscriptenã¯ãC / C ++ããasm.jsãšWebAssemblyãååŸããããã®ã¡ã€ã³ã³ã³ãã€ã©ã§ãã ïŒWASMã«ã¯ãRustãTypeScriptãªã©ã®ä»ã®èšèªã®ã³ã³ãã€ã©ããããŸããïŒããã§ã¯ãWindowsã§ã®Emscriptenã®äœ¿çšãæ€èšããŸãããä»ã®ã·ã¹ãã ã«å€§ããªéãã¯ãªããšæããŸãã
LLVM
Emscriptenã«ã€ããŠèšãã°ãäœã¬ãã«ä»®æ³ãã·ã³ïŒLLVMïŒã«ã€ããŠå°ã話ã䟡å€ããããŸãã
LLVMã¯ã³ã³ãã€ã©ãŒã®ãã¡ããªãŒã§ãã LLVMã®äž»ãªã¢ã€ãã¢ã¯ãã³ã³ãã€ã«ãããã³ããšã³ããšããã¯ãšã³ãã«åé¢ããããšã§ãã ããã³ããšã³ãã³ã³ãã€ã©ã¯ããœãŒã¹ã³ãŒãããå éšè¡šçŸïŒIntermediate RepresentationãIRïŒã«ã³ã³ãã€ã«ããŸãã IRã¯ãäžéšã®ä»®æ³ãã·ã³ã®ã³ãŒãã§ãã ããã¯ãšã³ãã³ã³ãã€ã©ã¯æ¢ã«IRãç¹å®ã®ãã©ãããã©ãŒã çšã®ã³ãŒãã«å€æããŠããŸããããšãã°ãx86ããã³x86-64ã®ããã¯ãšã³ãããã䜿çšãããŸãã å¥ã®ããã°ã©ãã³ã°èšèªã®ã³ã³ãã€ã©ãå¿ èŠãªå Žåã¯ãæ°ããããã³ããšã³ãã®ã¿ãèšè¿°ãããŸãã æ°ãããã©ãããã©ãŒã çšã®ã³ã³ãã€ã«ãå¿ èŠãªå Žåã¯ãæ°ããããã¯ãšã³ããäœæãããŸãã
Emscriptenã¯LLVMã䜿çšããŠC / C ++ããã³ã³ãã€ã«ããasm.jsããã³WebAssemblyã§ã®ã¢ã»ã³ããªçšã®ããã¯ãšã³ãã³ã³ãã€ã©ãæäŸããŸãã
Emscriptenãã€ã³ã¹ããŒã«ãã
Emscriptenã®ã€ã³ã¹ããŒã«ã¯éåžžã«ç°¡åã§ããç§ã®å Žåã¯Windowsã§è¡ããããœãŒã¹ããäœãã³ã³ãã€ã«ããå¿ èŠãããããŸããã§ããã
- ããããããŠã³ããŒãïŒ http : //emscripten.org/
- ç§ã®å Žåã¯
C:\bin\emsdk
å¥ã®ãã©ã«ãã«è§£åããŸã - ã³ãã³ãã©ã€ã³ãéããemsdkãã©ã«ããŒã«ç§»åããŠã3ã€ã®ã³ãã³ããå®è¡ããŸãã
emsdk update emsdk install latest emsdk activate latest
ãã¹ãŠãã€ã³ã¹ããŒã«ããã³æ§æãããã³ã³ãã€ã«ã§ããŸãã emsdk list
ã³ãã³ããemsdk list
ã€ã³ã¹ããŒã«ã«äœ¿çšã§ãããã¹ãŠã®ããŒã«ã®ãã¹ãŠã®ããŒãžã§ã³ã®ãªã¹ãããçŸåšéžæãããŠãããã®ã®ããŒã¯ãšãšãã«ååŸãããŸãã
asm.jsã§ã®ã³ã³ãã€ã«
Emscriptenã䜿çšããŠã³ãŒããã³ã³ãã€ã«ããæ¹æ³ãèŠãŠã¿ãŸããããasm.jsããå§ããŸãããã
äŸã¯äžèšãšåãã§ãããEmscriptenïŒfib.cïŒçšã«ãããã«å€æŽãããŠããŸãã
# include <emscripten/emscripten.h> int EMSCRIPTEN_KEEPALIVE fib(int n) { if (n == 0) { return 0; } else { if ((n == -1) || (n == 1)) { return 1; } else { if (n > 0) { return fib(n - 1) + fib(n - 2); } else { return fib(n + 2) - fib(n + 1); } } } } int main() { printf("fib(10) = %d\n", fib(10)); return 0; }
EMSCRIPTEN_KEEPALIVE
ãã¯ãã次ã«EMSCRIPTEN_KEEPALIVE
ãŸãããã®ãã¯ãã¯2ã€ã®ããšãè¡ããŸãã 第äžã«ãã³ãŒãã®ã©ãã§ã䜿çšãããŠããªããŠããã³ã³ãã€ã©ãŒã«ãã£ãŠé¢æ°ãã¹ããŒãããã®ãé²ããŸãã 第äºã«ãå€éšåŒã³åºãã®ããã«é¢æ°ããšã¯ã¹ããŒãããå¿
èŠãããããšã瀺ããŠããŸãã
ã³ã³ãã€ã«ã«ã¯ã次ã®ããããã¡ã€ã«ã䜿çšããŸãã
SET EMSDKPATH=C:\bin\emsdk CALL %EMSDKPATH%\emsdk_env.bat emcc -O1 fib.c -o fib.html -fno-exceptions -fno-rtti
ããã§ã emcc
ã¯Emscriptenèªäœã -O1
æé©åãªãã·ã§ã³ã fib.c
ã³ã³ãã€ã«ãããã®ã -o fib.html
ã³ã³ãã€ã«ããå ŽæããããŠ-f
ãªãã·ã§ã³ã§äžèŠãªãã®ãç¡å¹ã«ããŸãã
ã³ã³ãã€ã«ã®åºåã§ãã³ã³ãã€ã«ãããã³ãŒããå®è¡ããJavaScriptãå«ãHTMLãã¡ã€ã«ïŒfib.htmlïŒãååŸããŸãã
ãŸããfibïŒïŒé¢æ°ãšãã®åŒã³åºããmainïŒïŒã§èŠã€ããããšãã§ããfib.jsãã¡ã€ã«ãååŸããŸããïŒ
ããã«ããã€ããªãã¡ã€ã«fib.html.memãçæãããŸã-ããã¯ãã¡ã¢ãªã€ã¡ãŒãžãã§ããããã°ã©ã ãéå§ããåã®ã¡ã¢ãªã¯æ¬¡ã®ãšããã§ããããã«ãã¹ãŠã®å®æ°ãšã°ããŒãã«å€æ°ããããŸãã
fib.htmlãéããšã次ã®ç»åã衚瀺ãããŸãã
ããã¯Emscriptenã®æšæºã®çµæãã¥ãŒã§ãã äžå€®ã®é»ãé·æ¹åœ¢ã¯ãã³ã³ãœãŒã«ãïŒstdoutïŒã®åºåã§ãããç¹ã«printf()
ãããã«è¡šç€ºãããŸãã äžéšã®é»ãé·æ¹åœ¢ã¯ãã£ã³ãã¹ã§ãã Emscriptenã¯ãããªãããããå¿
èŠãšãããã©ãããç¥ããŸãããã念ã®ããã«ããã«äœæããŸãã
WebAssemblyã§ã®ã³ã³ãã€ã«
WebAssemblyã§ã³ã³ãã€ã«ããããã«ããœãŒã¹ã³ãŒããC / C ++ã«å€æŽããå¿ èŠã¯ãããŸããïŒããã¯çŽ æŽãããããšã§ãïŒïŒã
ã³ã³ãã€ã©ãŒåŒã³åºãã®ã³ãã³ãã©ã€ã³ãå°ãå€æŽããã ãã§ãã
SET EMSDKPATH=C:\bin\emsdk CALL %EMSDKPATH%\emsdk_env.bat emcc -O1 fib.c -g -o fib.html -s WASM=1 -s NO_EXIT_RUNTIME=1 -s NO_FILESYSTEM=1 -fno-exceptions -fno-rtti --llvm-lto 1
ããã§ã®äž»ãªéãã¯ã -s WASM=1
ãªãã·ã§ã³ã®è¿œå ã§ãã æ®ãã®-s
ãš-f
ãEmscriptenã«äžèŠãªãã®ã説æããããã«è¿œå ãããŸãã Emscriptenã¯éåžžã«å€ãã®åŠçãå®è¡ã§ããããããäžãäžã«åããŠãããçªç¶å¿
èŠã«ãªã£ãããªã©ãçµæãã¡ã€ã«ã«å€ãã®ããšãè¿œå ããŸãã
ã³ã³ãã€ã«ã®çµæãšããŠãfib.htmlãããã«fib.jsïŒEmscriptenãµãŒãã¹é¢æ°ã®ã»ããïŒããããŠæåŸã«fib.wasmãååŸããŸãã
WASMãã¡ã€ã«ã®å é ã«ãã€ã00ãããã次ã«æåãasmãããããŸãããããã®æåã®4ãã€ãã«ããããšã©ãŒã³ãŒãã®ããã¹ã¿ãããŒãžã§ã¯ãªããwasmãèªã¿èŸŒãã§ããããšãããããŸãã 次ã®4ãã€ãã¯ããŒãžã§ã³çªå·ã§ããã®å Žåã¯1.0ã§ãã ã¡ã¢ãªã€ã¡ãŒãžçšã®åå¥ã®ãã¡ã€ã«ã¯çæããããå®æ°ãšã°ããŒãã«å€æ°ã¯åãWASMãã¡ã€ã«ã«å«ãŸããŸãã
ããã§ã¯çµæã®ã¹ã¯ãªãŒã³ã·ã§ãããæäŸããŸãããasm.jsã®äŸã®ããã«äžå¯Ÿäžã«èŠããŸãã
ãããã°ã®èŠ³ç¹ããèŠãŠã¿ãŸãããã Chromeéçºè
ããŒã«ïŒF12ïŒãéããåŸãSourcesã«ç§»åãããšãæ°ããã»ã¯ã·ã§ã³ãwasmãã衚瀺ãããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ããããã¯ã®ã»ããã®äžã«é¢æ°ãèŠã€ããããã«ãã¬ãŒã¯ãã€ã³ãã眮ããŠåæ¢ãããããã¬ãŒã«å
¥ããŸã
ã芧ã®ãšãããåè¿°ã®ããã¹ããã¥ãŒïŒWASTïŒã¯ãããã°ã«äœ¿çšãããŸãã
次ã«ããããã°æ
å ±ã䜿çšããŠåãã³ãŒããã³ã³ãã€ã«ããŸãããã®ãããemccã³ãã³ãã©ã€ã³ã«-g
ãªãã·ã§ã³ãè¿œå ããŸãã ãã®çµæãã³ã³ãã€ã©ãŒã¯fib.wastãšfib.html.mapã®2ã€ã®ãã¡ã€ã«ãçæããŸãã
ããã¹ãè¡šçŸãã¡ã€ã«fib.wastã«ã¯ãã³ãŒãã ãã§ãªããC / C ++ã®ãœãŒã¹ãžã®åç
§ããããŸãã
(func $_fib (param $0 i32) (result i32) (local $1 i32) ;; fib.c:11 (block $switch-default
ãããã°ã®èŠ³ç¹ãããããäœãããããããèŠãŠã¿ãŸãããã [ãœãŒã¹]ã»ã¯ã·ã§ã³ã®ããŒãžãæŽæ°ãããšããœãŒã¹ã³ãŒãfib.cã衚瀺ããããã¬ãŒã¯ãã€ã³ããèšå®ãåæ¢ãããŒã«ã«å€æ°ã確èªããŠããããã¬ãŒãšããŠã³ãŒããã¹ãããå®è¡ã§ããŸãã
Emscriptenã®æ©èœ
Emscriptenã¯2010幎ããéçºãç¶ããŠããããã§ã«å€ãã®ããšãç¥ã£ãŠããŸãã ãã®å Žåãç§ãã¡ã¯ãã¯ãã³ã³ãã€ã©ãŒã«ã€ããŠã§ã¯ãªããC / C ++ã³ãŒããã䜿çšãããäžè¬çãªã©ã€ãã©ãªãŒã®ãµããŒãã«ã€ããŠè©±ããŸãã 以äžããµããŒããããŠããŸãã
- æšæºC / C ++ã©ã€ãã©ãª
- SDL 2-å ¥åïŒããŒããŒã/ããŠã¹/ãžã§ã€ã¹ãã£ãã¯ïŒããããªããµãŠã³ã
- OpenGLãEGL-WebGLã«ããå®è£ ããã2D / 3Dã°ã©ãã£ãã¯ã¹
- OpenAL-ãµãŠã³ã
ãã®ä»ã®æ©èœïŒ
- ãã¡ã€ã«ã·ã¹ãã ãšãã¥ã¬ãŒã·ã§ã³-å€ãã®C / C ++ããã°ã©ã ã¯ãã¡ã€ã«ãéäžçã«åŠçããŸãããã®ã³ãŒãã¯ãã®ãŸãŸã«ããŠããããšãã§ããŸãã Emscripten-ãã¡ã€ã«ã·ã¹ãã ã®æŠèŠãåç §ããŠãã ãã
-
EM_ASM("JS code")
-æååãšããŠçæãããä»»æã®JavaScriptã³ãŒãã®å®è¡ - åŽåè
ããè€éãªäŸ
ç§ã¯ãC ++ã§æžãããå€ããœããšãã®ã³ã³ãã¥ãŒã¿ãŒã®ãšãã¥ã¬ãŒã¿ãŒã®ç§èªèº«ã®è¶£å³ãããžã§ã¯ããæã£ãŠããŸãã ãã®èšäºã§èª¬æããŸãã ã ãã以æ¥ããªããšããããè¿œå ããŠãQtïŒWindows / MacOS / LinuxïŒã«ç§»æ€ããããšãã§ããŸããã ãã®ãããããŸããŸãªã³ã³ãã€ã©ãŒã§ãã«ãããããšãã¥ã¬ãŒã·ã§ã³ã«ãŒãã«ïŒã280 KBã®ã³ãŒããã7ããã¹ããªã³ã°ïŒãæ¢ã«å²ãåœãŠãããŠããŸãã å®éãEmscriptenã䜿çšããŠãã®ãšãã¥ã¬ãŒã¿ãŒãã³ã³ãã€ã«ããããšã«ãããWebAssemblyã®åŠç¿ãéå§ããŸããã æåã®æã¡äžããæåãããŸã§ãä»äºãã2æ©ããããŸããããããã¯è¯ãçµæã§ããããããã¯ãå ¥åããããã®ãããå€ãæ¯èŒçäœãããšã瀺ããŠããŸãã ã»ãšãã©ã®äœæ¥ã¯JavaScriptã«é¢é£ããŠããŸãããJSããWASMã¡ãœãããåŒã³åºãæ¹æ³ããã©ã¡ãŒã¿ãŒãæž¡ãæ¹æ³ããã£ã³ãã¹ãæç»ããæ¹æ³ãªã©ã§ãã
ã¡ãªã¿ã«ããšãã¥ã¬ãŒãããããã·ã³ã®ç»é¢ã¯ããã£ã³ãã¹ã«é©ããããã¯ã»ã«ã圢åŒã§ãã¡ã¢ãªã®åºäœãããã¯ã®åœ¢ã§ãå®å šã«WASMå ã«åœ¢æãããŸãã JavaScriptã®å€éšã§ã¯ãå®æãããã¹ã¯ãªãŒã³ãã®ã¢ãã¬ã¹ã®ã¿ãéä¿¡ãããŸãã JavaScriptã§ã¯ããã®ã¡ã¢ãªãããã¯ããã£ã³ãã¹ã«ã³ããŒããã ãã§ãã
åäœãããšãã¥ã¬ãŒã¿ãããã§èŠãããšã ã§ããŸã ããŸãã ãœãŒã¹ã³ãŒããå©çšå¯èœã§ã ã
ãŸããããæç¹ã§ãasm.jsã®äžã§ããã®ãšãã¥ã¬ãŒã¿ãåéããããã«ããå³ãå®æããããããšã«ããŸããã ç§ã¯èªåã§ã³ãŒããŒãäœãããã®ããã«2ã3æéã®ç©ºãæéãåã£ãŠããã15åãçµããªããã¡ã«ãšãã¥ã¬ãŒã¿ãŒããã§ã«åäœãå§ããŸããã äºæ³å€ã®ããã§ããã å®éãçæãããHTMLãã¡ã€ã«ã®éãã確èªããè¿œå ãããJavaScriptãããã¯ãå¿ èŠãªå Žæã«ç§»åããã ãã§æžã¿ãŸããã å¯äžã®éãã¯ãasm.jsã®å Žåã.memãã¡ã€ã«ãå®æ°ããã³ã°ããŒãã«å€æ°ãå«ãã¡ã¢ãªã€ã¡ãŒãžãããŒãããå¿ èŠãããããšã§ãã ãã以å€ã®å Žåããã¹ãŠã®åŒã³åºãã¯ãŸã£ããåãæ¹æ³ã§è¡ãããå®æããããŒãžã¯èŠãç®ãšåäœããŸã£ããåãã§ããããå°ãé ããããããŸããã
ããã§ãEmscriptenãèŠçŽããŸãã åãã³ãŒããããasm.jsã®åœ¢åŒãšWebAssemblyã®åœ¢åŒã®çµæãçæããããšã確èªããŸãããåŸãããçµæã¯ãŸã£ããåãããã«èŠããåäœããŸãïŒãã¡ããé床ã¯äŸå€ã§ãïŒã å®éã®çµæãåŸãããã®ãšã³ããªã®ãããå€ã¯æ¯èŒçäœãã£ãã
äžæ¹ãEmscriptenã¯ããªãæŽç·ŽãããããŒã«ã§ãã ã³ã³ãã€ã«çµæã«ã¯ãäºæããªãå€ãã®æ å ±ãå«ãŸããŠããŸããããããã¯åœ¹ã«ç«ã€ãããããŸããã ãããã£ãŠãå°ããªãœãŒã¹ã§ãã£ãŠãã倧éã®çµæã³ãŒããçæãããŸãã ãããã®äžéšã¯ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ã§ç¡å¹ã«ã§ããŸãã ãäžéšã¯ç¡å¹ã«ã§ããŸããã
EmscriptenãæäŸãããã®ãšWASMãããã«äœ¿ãããã®ãšãåºå¥ããããšã¯éåžžã«é£ãããããEmscriptenã§WebAssemblyã®éçºãããã«éå§ãã䟡å€ã¯ãªããšæããŸãã ããããå®éã®ãããžã§ã¯ãã§ã¯ãEmscriptenã¯ããŸãã«éçºè ã«æäŸããæ©èœã«ãããéåžžã«äŸ¿å©ã§ãã
WebAssemblyã®çŸåšã®ç¶æ
2017幎ã®WebAssemblyãã¥ãŒã¹ïŒ
- 2017幎3æ-WebAssemblyã¯ãã¹ãã©ãŠã¶ãŒã³ã³ã»ã³ãµã¹ãšãã©ãŠã¶ãŒãã¬ãã¥ãŒã®çµäº
- 2017幎5æ-ChromiumããŒã ã¯WebAssemblyãæ¯æããŠPNaClãæŸæ£ããŸããhttps://blog.chromium.org/2017/05/goodbye-pnacl-hello-webassembly.html
- 9æ-WebAssemblyããµããŒãããSafari 11ãhttps://webkit.org/blog/7956/new-webkit-features-in-safari-11/ããµããŒã
ãã©ãŠã¶ã®ãµããŒã
2017幎10æã®åãã«ãç¶æ³ã¯æ¬¡ã®ããã«ãªããŸããã
EdgeããŒãžã§ã³ã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ããŒãžã§ã³ã«é¢é£ä»ããããŠããŸãã Windows 10 Fall Creators Updateãšäžç·ã«ãWebAssemblyãããã«åäœããEdge 16ãååŸããŸããèšå®ã«äœãå«ããå¿ èŠã¯ãããŸããã
WebAssemblyããµããŒãããªããã©ãŠã¶ã®å Žåãããããã䜿çšããããšã«ãªã£ãŠããŸãã ãPolyfillããã€ãŸãããã®ãã©ãŠã¶ãŒã§å®è¡ã§ããã³ãŒããžã®WASMã®èªåå€æã ç¹ã«ãWebAssemblyãå¹æçã«asm.jsã«å€æãããããã¿ã€ããäœæãããŸããã ãããããããŸã§ã®ãšããããã®ã¢ãããŒãã®å®éã®å¿çšäŸã¯èŠãŠããŸããã
WebAssemblyã®æªæ¥
WebAssemblyããŒã ãçŸåšåãçµãã§ããå€ãã®ããšïŒ
- ã¹ã¬ãã
çŸåšã®WASMå®è£ ã¯å®å šã«ã·ã³ã°ã«ã¹ã¬ããã§ãã - SIMD
SIMDã®ãµããŒãã«ããã倧éã®ããŒã¿ïŒç»åããããªãé³å£°ïŒã§ã®åãã¿ã€ãã®åŠçãå€§å¹ ã«å éãããŸãã - äŸå€
- ã¬ããŒãžã³ã¬ã¯ã·ã§ã³
GCã®å®è£ ã«ãããèªåã¡ã¢ãªç®¡çãåããèšèªããWASMçšã«ã³ã³ãã€ã«ã§ããŸãã ããã¯çŸåšå¯èœã§ãããGCãWASMå ã®C / C ++ã§å®è£ ãããŠããå Žåã®ã¿ã§ãã
æ§èœ
ããã©ãŒãã³ã¹ã®åé¡ã¯å®éã«ã¯éåžžã«è€éã§ãã WebAssemblyã¯ãåãJavaScriptãŸãã¯asm.jsãããåžžã«é«éã§ãããšã¯éããªãããã§ãã ããšãã°ã JavaScriptãšWebAssemblyã®ç°¡åãªãã³ãããŒã¯ã®æ¯èŒãã芧ãã ããã æåã®ãã¹ããcollisionDetectionã§ã¯ãWASMãJSã®88ïŒ ãäžããããšãããããŸããã ãããŠã次ã®ãã¹ãã§ãã£ããããWASMã¯JSã®3åã®ãã¯ããã«è¯ãçµæãçã¿åºãããšããŸãããã
ããã§ã¯ãé床ã«åœ±é¿ãäžããããã€ãã®ãã€ã³ãã®ã¿ã«æ³šæããŸãããå®éã«ã¯ããã¡ãããã£ãšå€ãã®ãã€ã³ãããããŸãã
WebAssemblyã¯ãJSé¢æ°ãžã®éäžçãªåŒã³åºãã§ããã©ãŒãã³ã¹ãå€§å¹ ã«å€±ãå¯èœæ§ãããããšãæ¢ã«è¿°ã¹ãŸããã
WebAssemblyã¯ãã¡ã¢ãªã¢ã¯ã»ã¹ã®ããã©ãŒãã³ã¹ãäœäžããŸãããã®ãããªã¢ããŒã«ã®ãã³ã«ã䜿çšå¯èœãªã¡ã¢ãªãããã¯ã®å¢çãè¶ ããŠãããã©ããããã§ãã¯ããŸãã
WebAssemblyã¯ãæŽæ°å€æ°ã®ã¿ã€ããã倧ããªå©çãåŸãããšãã§ããŸãã JSã«ã¯ãå®éã«ã¯åžžã«64ãããæµ®åå°æ°ç¹ã§ããNumberåã®ã¿ããããæŽæ°ã¯å°æ°éšã®ãªãæµ®åå°æ°ç¹æ°ã§ãã JSãšã³ãžã³ã§ã³ã³ãã€ã«ããå ŽåãæŽæ°ã«ã¯64ãããæŽæ°åã䜿çšãããŸãã WASMã§ã¯ãåã®ããã深床ãéžæããŸãã32ãããæŽæ°åã䜿çšããå Žåã64ãããæŽæ°ãããå°ãéãæŒç®ãè¡ããšãèšç®é床ããäžå ¬å¹³ãã«ãªããŸãã
äžè¬ã«ããå¹³åã§WebAssemblyã¯10ã15ïŒ ã®é床åäžãæäŸããããšãããããªãã®ã¯ãªãããå¹³åãã¯ãªããšããæèŠããããŸããã ããããäžè¬çã«ãéäžçãªã³ã³ãã¥ãŒãã£ã³ã°ã®å ŽåãWebAssemblyãå€å°ãªããšãç®ã«èŠããããã©ãŒãã³ã¹ã®åäžãããããå¯èœæ§ãæãé«ããšäºæž¬ã§ããŸãã ããã«ãéå»6ãæéã§ããããã©ãŠã¶ãŒã®æ°ããããŒãžã§ã³ã®ãªãªãŒã¹ã«ãã£ãŠWASMã®é床ããããã«åäžããããšã¯æããã§ãã
ãããã«
WebAssemblyã䜿çšãã
- èµ·åæéãççž®
- èšç®é床ãäžãã
- æ¢è£œã®C / C ++ã³ãŒãã䜿çšãã
ãŠãŒã¹ã±ãŒã¹
- æºåãã§ããããä»ããWASMã䜿çšããŠãã ãã
- ä»ããasm.jsã䜿çšããå°æ¥WASMã«ã¢ããã°ã¬ãŒãããŸã
- ãã©ãŠã¶ã«å¿ããŠãasm.jsãŸãã¯WASMãæå®ããŸã
åç §è³æ
ãã®ãããã¯ã«é¢ããè³æã¯ãããããããŸãããã»ãšãã©ãã¹ãŠãè±èªã§ãã ããã§ãç§ãæã圹ç«ã€ãšæãããã€ãã®ãªã³ã¯ãéããŸããã
- WebAssembly.org
- WebAssemblyã«ããçŽ æŽããããªã¹ã
- Real World WebAssemblyãChrome Dev Summit 2017-ãããªã2017幎10æ24æ¥
- GOTO 2015ããã¯ãã¬ã€ã«ããWebã¢ã»ã³ã㪠-ãããªã2015幎10æ21æ¥