ãã«ã¯ã¡ã¢ãªãŒæäœãšæé©åãšã³ãžã³ã§é²åããWebAssemblyã®ã¡ã¢ãªãŒç®¡çãæ¢ããŸããããã©ãŒãã³ã¹ã匷åããWebã¢ããªã®æ°ããªå¯èœæ§ãè§£ãæŸã¡ãŸãããã
WebAssemblyãã«ã¯ã¡ã¢ãªãŒæé©åãšã³ãžã³ïŒã¡ã¢ãªãŒæäœã®åŒ·å
WebAssembly (Wasm)ã¯ãJavaScriptã«ä»£ãããã€ãã£ãã«è¿ãããã©ãŒãã³ã¹ãæäŸããWebéçºã®æ§çžãæ¥éã«å€ããŸãããããã¯ãCãC++ãRustãªã©ã®æ§ã ãªèšèªããã³ã³ãã€ã«ãããã³ãŒãããã©ãŠã¶ã§çŽæ¥å®è¡ããèœåã«ãã£ãŠå®çŸãããŠããŸããWasmã®å¹çæ§ã«ãããéèŠãªåŽé¢ã¯ã¡ã¢ãªãŒç®¡çã«ããããã®ããã°èšäºã§ã¯ãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããããã«ã¯ã¡ã¢ãªãŒæäœãšæé©åãšã³ãžã³ã®é²æ©ã«ã€ããŠè©³ãã解説ããŸãã
WebAssemblyã«ãããã¡ã¢ãªãŒã®éèŠæ§
WebAssemblyã®é¢æ°ã¯ããã®æ žå¿ã«ãããŠç·åœ¢ã¡ã¢ãªãŒç©ºéäžã§åäœããŸãããã®ã¡ã¢ãªãŒã¯æ¬è³ªçã«é£ç¶ãããã€ãã®ãããã¯ã§ãããWasmã¢ãžã¥ãŒã«ã¯ããã«ããŒã¿ãæ ŒçŽããŸãããã®ã¡ã¢ãªãŒã®å¹æçãªæäœã¯ãã¢ããªã±ãŒã·ã§ã³å šäœã®ããã©ãŒãã³ã¹ã«ãšã£ãŠäžå¯æ¬ ã§ããåŸæ¥ãWasmã«ãããã¡ã¢ãªãŒæäœãç¹ã«å€§èŠæš¡ãªããŒã¿è»¢éã䌎ããã®ã¯ãæ¯èŒçã«äœéã«ãªãå¯èœæ§ããããŸãããããã§ç»å Žããã®ããã«ã¯ã¡ã¢ãªãŒæäœã§ãã
ãã«ã¯ã¡ã¢ãªãŒæäœã®çè§£
ãã«ã¯ã¡ã¢ãªãŒæäœã¯ãããå¹ççãªã¡ã¢ãªãŒæäœãä¿é²ããããã«WebAssembly仿§ã§å°å ¥ãããäžé£ã®åœä»€ã§ãããããã®æäœã¯ããã€ãåäœãã¯ãŒãåäœã§ã¯ãªããäžåºŠã«ã¡ã¢ãªãŒãããã¯ã«å¯ŸããŠæäœãå®è¡ããããšã«çŠç¹ãåœãŠãŠããŸããããã«ããã倧ããªã¡ã¢ãªãŒé åã®ã³ããŒãåã蟌ã¿ãã¯ãªã¢ãšãã£ãäžè¬çãªã¿ã¹ã¯ã®é床ãåçã«åäžããŸããäž»èŠãªãã«ã¯ã¡ã¢ãªãŒåœä»€ã«ã¯ä»¥äžã®ãããªãã®ããããŸãïŒ
- memory.copy: åãã¡ã¢ãªãŒç©ºéå ã®ããå Žæããå¥ã®å Žæãžã¡ã¢ãªãŒãããã¯ãã³ããŒããŸãã
- memory.fill: ã¡ã¢ãªãŒãããã¯ãç¹å®ã®ãã€ãå€ã§åããŸãã
- memory.init (ããŒã¿ã»ã°ã¡ã³ããšå ±ã«): äºåå®çŸ©ãããããŒã¿ã»ã°ã¡ã³ãããã¡ã¢ãªãŒã«ããŒã¿ãã³ããŒããŸãã
- memory.size: ç·åœ¢ã¡ã¢ãªãŒã®çŸåšã®ãµã€ãºïŒããŒãžåäœïŒãåãåãããŸãã
- memory.grow: ç·åœ¢ã¡ã¢ãªãŒã®ãµã€ãºãå¢å ãããŸãã
ãããã®æäœã¯ããŒããŠã§ã¢ã¬ãã«ã®æé©åã®æ©äŒã掻çšãããããåå¥ã®ããŒãåœä»€ãã¹ãã¢åœä»€ã䜿çšããŠå®è£ ãããåçã®æäœãããã¯ããã«é«æ§èœã§ãã
ãã«ã¯ã¡ã¢ãªãŒæäœã®å©ç¹
ãã«ã¯ã¡ã¢ãªãŒæäœã®å®è£ ã¯ã倧ããªå©ç¹ããããããŸãïŒ
- ããã©ãŒãã³ã¹ã®åäžïŒ äž»ãªå©ç¹ã¯ãç¹ã«å€§èŠæš¡ãªããŒã¿ã»ãããé »ç¹ãªã¡ã¢ãªãŒæäœãæ±ãéã®é床ã®å€§å¹ ãªåäžã§ããããã¯ãç»ååŠçããããªãã³ãŒããç§åŠæè¡èšç®ãªã©ã®ã¿ã¹ã¯ã§ç¹ã«é¡èã§ãã
- ã³ãŒããµã€ãºã®åæžïŒ ãã«ã¯æäœã¯ãããã³ã³ãã¯ããªWasmã³ãŒãã«ã€ãªããããšãå€ããã¢ãžã¥ãŒã«å šäœã®ãµã€ãºãåæžããŸãã
- éçºã®ç°¡çŽ åïŒ éçºè ã¯ãæåã®ã«ãŒããå埩æäœã«é Œãã®ã§ã¯ãªãããããã®ç¹æ®ãªåœä»€ã䜿çšã§ãããããããç°¡æœã§èªã¿ãããã³ãŒããæžãããšãã§ããŸãã
- çžäºéçšæ§ã®åäžïŒ 倧éã®ããŒã¿ãã£ã³ã¯ã®è»¢éãªã©ããã¹ãç°å¢ïŒäŸïŒJavaScriptïŒãšã®ããè¯ãçžäºäœçšãä¿é²ããŸãã
æé©åãšã³ãžã³ã®åœ¹å²
ãã«ã¯ã¡ã¢ãªãŒæäœãããã©ãŒãã³ã¹åäžã®åºç€ãæäŸããäžæ¹ã§ããã®å¹æãæå€§éã«åŒãåºãäžã§éèŠãªåœ¹å²ãæããã®ãæé©åãšã³ãžã³ã§ãããããã®ãšã³ãžã³ã¯WasmããŒã«ãã§ãŒã³ã®äžéšã§ãããWasmã³ãŒããåæã»å€æããŠãåºç€ãšãªãããŒããŠã§ã¢ããæé«ã®ããã©ãŒãã³ã¹ãåŒãåºããŸãããã®æé©åã«ã¯ãããã€ãã®ããŒã«ãæè¡ãè²¢ç®ããŠããŸãïŒ
- Binaryen: WebAssemblyã®ããã®åŒ·åãªããŒã«ãã§ãŒã³ã€ã³ãã©ã§ããããããã³ãŒãé€å»ã宿°äŒæãåœä»€éžæã®æé©åãªã©ãWasmã³ãŒãã«å¯ŸããŠæ§ã ãªå€æãè¡ããªããã£ãã€ã¶ãæäŸããŸããBinaryenã¯ãã«ã¯ã¡ã¢ãªãŒæäœãæé©åããããããå¯èœãªéãå¹ççã«å®è¡ãããããšãä¿èšŒããŸãã
- Emscripten: Cããã³C++ã³ãŒããWebAssemblyã«ã³ã³ãã€ã«ããã³ã³ãã€ã©ããŒã«ãã§ãŒã³ã§ããEmscriptenã¯Binaryenãšçµ±åãããŠãããã³ã³ãã€ã«ãããWasmã³ãŒããèªåçã«æé©åããŸããç¹ã«æ¢åã®C/C++ã³ãŒãããŒã¹ãWebã«ç§»æ€ããå Žåãªã©ãå€ãã®ã·ããªãªã§äžå¯æ¬ ã§ãã
- wasm-pack: äž»ã«RustããWasmãžã®ã³ã³ãã€ã«ã«äœ¿çšãããŸããç¬èªã®æé©åãšã³ãžã³ã¯æã£ãŠããŸããããã³ã³ãã€ã«ãã€ãã©ã€ã³ã®äžéšãšããŠBinaryenãä»ã®ããŒã«ã掻çšããå¹ççãªWasmã¢ãžã¥ãŒã«ãçæããŸãã
- Wasmtime/Wasmer: ãã«ã¯ã¡ã¢ãªãŒæäœã®æé©åãããå®è¡ãå«ãWasm仿§ãå®è£ ããWebAssemblyã©ã³ã¿ã€ã ã§ãããããã®ã©ã³ã¿ã€ã ã®å¹çã¯ãå®äžçã§ã®ããã©ãŒãã³ã¹ã«ãšã£ãŠæ¥µããŠéèŠã§ãã
æé©åãšã³ãžã³ã¯ããã€ãã®æ¹æ³ã§æ©èœããŸãïŒ
- åœä»€éžæïŒ ã¿ãŒã²ããã®ããŒããŠã§ã¢ãšWasmã©ã³ã¿ã€ã ã«åºã¥ããŠãç¹å®ã®æäœãå®è¡ããããã®æãå¹ççãªWasmåœä»€ãéžæããŸãã
- ãããã³ãŒãé€å»ïŒ æçµçµæã«åœ±é¿ãäžããªãã³ãŒããåé€ããã¢ãžã¥ãŒã«ãããå°ãããããéãããŸãã
- ã«ãŒãå±éïŒ ã«ãŒãå¶åŸ¡ã®ãªãŒããŒããããåæžããããã«ãã«ãŒãã®æ¬äœãè€æ°åè€è£œããŸãã
- ã€ã³ã©ã€ã³å±éïŒ é¢æ°åŒã³åºãã颿°ã®ã³ãŒãã§çŽæ¥çœ®ãæããåŒã³åºãã®ãªãŒããŒããããåæžããŸãã
å®è·µçãªäŸãšãŠãŒã¹ã±ãŒã¹
ãã«ã¯ã¡ã¢ãªãŒæäœãšæé©åãšã³ãžã³ã®åœ±é¿ã¯ãèšç®éçŽåã®ã¢ããªã±ãŒã·ã§ã³ã§æãé¡èã§ãã以äžã«ããã€ãã®äŸãæããŸãïŒ
- ç»åã»ãããªåŠçïŒ FFmpegã®ãããªã©ã€ãã©ãªïŒEmscriptenã䜿çšããŠWasmã«ç§»æ€ïŒã¯ããããªãã¬ãŒã ã®ãã³ãŒãããã£ã«ã¿ãŒã®é©çšããšã³ã³ãŒããªã©ã®ã¿ã¹ã¯ãé«éåããããã«ãã«ã¯ã¡ã¢ãªãŒæäœãå©çšã§ããŸããããã©ãŒãã³ã¹ãã¹ã ãŒãºãªãŠãŒã¶ãŒäœéšã®éµãšãªããWebããŒã¹ã®ãããªç·šéããŒã«ã§ã®ãããã®ã©ã€ãã©ãªã®äœ¿çšãèããŠã¿ãŠãã ããã
- ã²ãŒã ãšã³ãžã³ïŒ UnityãUnreal Engineã®ãããªã²ãŒã ãšã³ãžã³ã¯ãWasmã«ã³ã³ãã€ã«å¯èœã§ããããã«ã¯ã¡ã¢ãªãŒæäœãå©çšããŠå€§èŠæš¡ãªããŒã¿æ§é ã®åŠçãã·ãŒã³ããŒã¿ã®æŽæ°ãç©çèšç®ãå®è¡ã§ããŸããããã«ãããããè€éã§é«æ§èœãªã²ãŒã ããã©ãŠã¶ã§çŽæ¥å®è¡ã§ããããã«ãªããŸãã
- ç§åŠæè¡èšç®ïŒ æµäœååŠãååã¢ããªã³ã°ã®ãããªåéã§ã®èšç®ã¿ã¹ã¯ã¯ãæé©åãããã¡ã¢ãªãŒæäœãã倧ããªæ©æµãåããããšãã§ããŸããå€ãã®å ŽåC/C++ã§éçºãããããŒã¿åæã©ã€ãã©ãªãç§åŠçèŠèŠåããŒã«ã¯é床ãåäžããWebããŒã¹ã®ç§åŠã¢ããªã±ãŒã·ã§ã³ã«é©ãããã®ã«ãªããŸããäŸãšããŠãæ°åå€åããŒã¿ã®ãã©ãŠã¶ããŒã¹ã®å¯Ÿè©±åã·ãã¥ã¬ãŒã·ã§ã³ããããäžçäžã®ãŠãŒã¶ãŒãããŸããŸãªã·ããªãªãæ¢çŽ¢ã§ããŸãã
- ããŒã¿å¯èŠåïŒ å€§èŠæš¡ãªããŒã¿ã»ããïŒäŸïŒå°ç空éããŒã¿ãéèããŒã¿ïŒã®ã¬ã³ããªã³ã°ã«ã¯ãå¹ççãªã¡ã¢ãªãŒæäœããã°ãã°å¿ èŠã§ãããã«ã¯ã¡ã¢ãªãŒæäœã«ãããããŒã¿ã®é«éåŠçãå¯èœã«ãªããããã¹ã ãŒãºã§å¿çæ§ã®é«ãã€ã³ã¿ã©ã¯ãã£ããªå¯èŠåãå®çŸããŸããé«éã§ã©ã€ãããŒã¿ãæŽæ°ããWasmã§æ§ç¯ãããæ ªåŒåžå ŽåæããŒã«ãæ³åããŠã¿ãŠãã ããã
- ãªãŒãã£ãªåŠçïŒ ã·ã³ã»ãµã€ã¶ãŒãããžã¿ã«ã»ãªãŒãã£ãªã»ã¯ãŒã¯ã¹ããŒã·ã§ã³ïŒDAWïŒã®ãããªWasmããŒã¹ã®ãªãŒãã£ãªåŠçã¢ããªã±ãŒã·ã§ã³ã¯ããªãŒãã£ãªãµã³ãã«ãé¢é£ããããŒã¿æ§é ã®é«éãªããŒã¿åŠçããæ©æµãåããŸããããã¯ããŠãŒã¶ãŒäœéšã«ãããããè¯ãå¿çæ§ãšäœé å»¶ã«ã€ãªãããŸãã
æ¥æ¬ã®äŒæ¥ããŠãŒã¶ãŒåãã«é«æ§èœãªç»åç·šéããŒã«ãéçºããŠããã·ããªãªãèããŠã¿ãŸããããWasmãšãã«ã¯ã¡ã¢ãªãŒæäœã掻çšããããšã§ãåŸæ¥ã®JavaScriptããŒã¹ã®å®è£ ãšæ¯èŒããŠãåªãããŠãŒã¶ãŒäœéšãæäŸã§ããŸãã
å®è£ ã«é¢ããèæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
ãã«ã¯ã¡ã¢ãªãŒæäœã¯ããã©ãŒãã³ã¹åäžããããããŸããããããã广çã«å®è£ ããã«ã¯ãåºç€ãšãªãååãšãã¹ããã©ã¯ãã£ã¹ãååã«çè§£ããå¿ èŠããããŸãïŒ
- é©åãªã³ã³ãã€ã©ãéžæããïŒ ãã«ã¯ã¡ã¢ãªãŒæäœããµããŒãããæé©åããã³ã³ãã€ã©ïŒäŸïŒEmscripten, wasm-packïŒãéžæããŸããææ°ã®æé©åã®ããã«ããããã®ããŒã«ãææ°ããŒãžã§ã³ã§ããããšã確èªããŠãã ããã
- ã³ãŒãããããã¡ã€ãªã³ã°ããïŒ ïŒWebãã©ãŠã¶ã®éçºè ããŒã«ã§å©çšå¯èœãªãã®ãªã©ïŒãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãããã©ãŒãã³ã¹ã®ããã«ããã¯ããã«ã¯ã¡ã¢ãªãŒæäœãæã广ãçºæ®ããé åãç¹å®ããŸãã
- ããŒã¿ã¬ã€ã¢ãŠããæé©åããïŒ å¹ççãªã¡ã¢ãªãŒã¢ã¯ã»ã¹ã容æã«ããããã«ããŒã¿æ§é ãèšèšããŸããã¡ã¢ãªãŒæäœãé ãããå¯èœæ§ã®ããæçåãããã¡ã¢ãªãŒã¬ã€ã¢ãŠãã¯é¿ããŠãã ãããæäœãé£ç¶ãããããã¯ã§å®è¡ãããããã«ããŒã¿ãæ§æããŸãã
- æ¢åã®ã©ã€ãã©ãªã掻çšããïŒ ç¹å®ã®ã¿ã¹ã¯ã®ããã«æ¢ã«æé©åãããŠããEmscriptenã§ç§»æ€ãããFFmpegã®ãããªç¢ºç«ãããã©ã€ãã©ãªãå©çšããŸãã
- 培åºçã«ãã¹ãããïŒ å€æ§ãªãŠãŒã¶ãŒããŒã¹ã§æé©ãªããã©ãŒãã³ã¹ã確ä¿ããããã«ãç°ãªããã©ãŠã¶ãããŒããŠã§ã¢æ§æã§Wasmã¢ãžã¥ãŒã«ãå³å¯ã«ãã¹ãããŸããããã©ãŒãã³ã¹ã®éããåæããããã«ãç±³åœãEUãªã©ãç°ãªã倧éžã§ã®ããã©ãŒãã³ã¹ãã¹ããæ€èšããŠãã ããã
- ã¡ã¢ãªãŒã¢ã©ã€ã¡ã³ããçè§£ããïŒ ããŒã¿åã®ã¡ã¢ãªãŒã¢ã©ã€ã¡ã³ãèŠä»¶ã«æ³šæããŠãã ãããäžé©åãªã¢ã©ã€ã¡ã³ãã¯ãããã©ãŒãã³ã¹ã®äœäžã«ã€ãªããå¯èœæ§ããããŸãã
- äŸåé¢ä¿ã宿çã«æŽæ°ããïŒ ææ°ã®æé©åããã°ä¿®æ£ã®æ©æµãåããããã«ãããŒã«ãã§ãŒã³ãäŸåé¢ä¿ïŒBinaryenãªã©ïŒãææ°ã®ç¶æ ã«ä¿ã¡ãŸãã
WebAssemblyã¡ã¢ãªãŒæäœã®æªæ¥
WebAssemblyã®é²åã¯é²è¡äžã§ãããã¡ã¢ãªãŒç®¡çã«ããããããªã鲿©ãæåŸ ãããŠããŸããå°æ¥ã®éçºã®äž»èŠãªé åã«ã¯ã以äžã®ãããªãã®ããããŸãïŒ
- ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒ Wasmãžã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®å°å ¥ã¯ãç¹ã«C#ã®ãããªèªåã¡ã¢ãªãŒç®¡çãæã€èšèªã«ãããŠãã¡ã¢ãªãŒç®¡çãç°¡çŽ åããŸãã
- å ±æã¡ã¢ãªãŒãšã¹ã¬ããïŒ å ±æã¡ã¢ãªãŒãšã¹ã¬ããæ©èœã®åŒ·åã«ãããWasmã¢ãžã¥ãŒã«å ã§ã®ããè€éã§äžŠåãªåŠçãå¯èœã«ãªããŸãã
- ã¹ããªãŒãã³ã°ã¡ã¢ãªãŒã¢ã¯ã»ã¹ïŒ ã¹ããªãŒãã³ã°ã¡ã¢ãªãŒæäœã®ãµããŒããåäžããããšã§ãå€§èŠæš¡ãªããŒã¿ã»ããããªã¢ã«ã¿ã€ã ã®ããŒã¿åŠçãããå¹ççã«è¡ããããã«ãªããŸãã
ãããã®é²æ©ã¯ãæé©åãšã³ãžã³ã®ç¶ç¶çãªæ¹åãšçžãŸã£ãŠãWebAssemblyã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšèœåãããã«åäžãããã§ãããã
çµè«
ãã«ã¯ã¡ã¢ãªãŒæäœãšé«åºŠãªæé©åãšã³ãžã³ã¯ãWebAssemblyã®é«æ§èœã«å€§ããè²¢ç®ããäžå¯æ¬ ãªèŠçŽ ã§ãããããã®é²æ©ã掻çšããããšã§ãéçºè ã¯ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã®é床ãšå¿çæ§ã«å¹æµããWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããWebAssemblyãé²åãç¶ããã«ã€ããŠããããã®ã¡ã¢ãªãŒç®¡çæè¡ã¯ãŸããŸãéèŠã«ãªãããã©ãŠã¶ç°å¢å ã§å¯èœãªããšã®éçãæŒãåºããæ°äžä»£ã®Webã¢ããªã±ãŒã·ã§ã³ãå¯èœã«ããŸããæœåšçãªã¢ããªã±ãŒã·ã§ã³ã¯åºç¯ã§ãæ§ã ãªæ¥çã«ããããäžçäžã®ãŠãŒã¶ãŒã«åœ±é¿ãäžããŸããWasmã®é²åã¯ãåªããããã©ãŒãã³ã¹ãæã€ã¢ããªã±ãŒã·ã§ã³ã®æ°ããªå¯èœæ§ãå¯èœã«ããããšã§ãããè¯ããŠãŒã¶ãŒäœéšããããããŸããã