WebAssemblyã®å€å€æ©èœãæãäžããããã©ãŒãã³ã¹ãšã³ãŒãã®æçæ§ã«å¯Ÿããå©ç¹ãçè§£ãããããžã§ã¯ãã§å¹æçã«æŽ»çšããæ¹æ³ãåŠã³ãŸãã
WebAssemblyã®å€å€ïŒããã©ãŒãã³ã¹ãšæè»æ§ãè§£ãæŸã€
WebAssembly (Wasm)ã¯ãããŒã¿ãã«ã§å¹ççãã€å®å šãªã³ãŒãå®è¡ç°å¢ãæäŸããããšã§ãWebéçºã«é©åœããããããŸããã ãã®äž»èŠãªæ©èœã®äžã€ããããã©ãŒãã³ã¹ãšã³ãŒãæ§é ã«å€§ããªåœ±é¿ãäžããå€å€ã§ãããããã«ãã颿°ã¯è€æ°ã®å€ãçŽæ¥è¿ãããšãã§ããŸãã ãã®èšäºã§ã¯ãWebAssemblyã«ãããå€å€ã®æŠå¿µãæãäžãããã®å©ç¹ãå®è£ ã®è©³çްããããŠå šäœçãªããã©ãŒãã³ã¹ãžã®åœ±é¿ãæ¢ããŸãã åŸæ¥ã®åäžæ»ãå€ã®ã¢ãããŒããšã©ã®ããã«ç°ãªãã®ãããããŠå¹ççãªã³ãŒãçæãä»èšèªãšã®çžäºéçšæ§ã®ããã®æ°ããªå¯èœæ§ãã©ã®ããã«åãéãã®ããæ€èšŒããŸãã
WebAssemblyã®å€å€ãšã¯äœãïŒ
å€ãã®ããã°ã©ãã³ã°èšèªã§ã¯ã颿°ã¯åäžã®å€ããè¿ãããšãã§ããŸãããè€æ°ã®æ å ±ãè¿ãããã«ãéçºè ã¯æ§é äœãã¿ãã«ãè¿ããããåç §æž¡ãã®åŒæ°ã倿Žããããšãã£ãåé¿çã«é ŒãããšããããããŸããWebAssemblyã®å€å€ã¯ã颿°ãè€æ°ã®å€ãçŽæ¥å®£èšããŠè¿ãããšãå¯èœã«ããããšã§ããã®ãã©ãã€ã ãå€ããŸãã ããã«ãããäžéããŒã¿æ§é ã®å¿ èŠããªããªããããŒã¿åŠçãç°¡çŽ åãããããå¹ççãªã³ãŒãã«è²¢ç®ããŸããããã¯ã颿°ãåäžã®ã³ã³ããããè€æ°ã®çµæãã¢ã³ããã¯ãããã匷å¶ããã®ã§ã¯ãªããè€æ°ã®åå¥ã®çµæãäžåºŠã«èªç¶ã«æž¡ããŠããããããªãã®ã ãšèããŠãã ããã
äŸãã°ãé€ç®ã®åãšäœãã®äž¡æ¹ãèšç®ãã颿°ãèããŠã¿ãŸãããã å€å€ããªããã°ãäž¡æ¹ã®çµæãå«ãåäžã®æ§é äœãè¿ããããããŸããã å€å€ã䜿ãã°ã颿°ã¯åãšäœãã2ã€ã®å¥ã ã®å€ãšããŠçŽæ¥è¿ãããšãã§ããŸãã
å€å€ã®å©ç¹
ããã©ãŒãã³ã¹ã®åäž
å€å€é¢æ°ã¯ãããã€ãã®èŠå ã«ããWebAssemblyã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãã
- ã¡ã¢ãªç¢ºä¿ã®åæžïŒ æ§é äœãã¿ãã«ã䜿çšããŠè€æ°ã®å€ãè¿ãå ŽåãçµåãããããŒã¿ãä¿æããããã«ã¡ã¢ãªã確ä¿ããå¿ èŠããããŸããå€å€ã¯ãã®ãªãŒããŒãããããªãããã¡ã¢ãªãã¬ãã·ã£ãŒã軜æžããå®è¡é床ãåäžãããŸãããã®ç¯çŽã¯ãé »ç¹ã«åŒã³åºããã颿°ã§ç¹ã«é¡èã§ãã
- ããŒã¿åŠçã®ç°¡çŽ åïŒ ããŒã¿æ§é ã®åãæž¡ããã¢ã³ããã¯ã¯ã远å ã®åœä»€ãè€éããçãå¯èœæ§ããããŸããå€å€ã¯ããŒã¿ãããŒãç°¡çŽ åããã³ã³ãã€ã©ããã广çã«ã³ãŒããæé©åã§ããããã«ããŸãã
- ããè¯ãã³ãŒãçæïŒ ã³ã³ãã€ã©ã¯ãå€å€é¢æ°ãæ±ãéã«ããå¹ççãªWebAssemblyã³ãŒããçæã§ããŸãã æ»ãå€ãçŽæ¥ã¬ãžã¹ã¿ã«ãããã³ã°ã§ãããããã¡ã¢ãªã¢ã¯ã»ã¹ã®å¿ èŠæ§ãæžå°ããŸãã
äžè¬çã«ãäžæçãªããŒã¿æ§é ã®äœæãšæäœãé¿ããããšã§ãå€å€é¢æ°ã¯ããã¹ãªã ã§é«éãªå®è¡ç°å¢ã«è²¢ç®ããŸãã
ã³ãŒãã®æçæ§ã®åäž
å€å€é¢æ°ã¯ãã³ãŒããèªã¿ããããçè§£ããããããããšãã§ããŸãã è€æ°ã®å€ãçŽæ¥è¿ãããšã§ã颿°ã®æå³ãããæç¢ºã«ãªããŸããããã«ãããããä¿å®ããããããšã©ãŒã®å°ãªãã³ãŒãã«ã€ãªãããŸãã
- å¯èªæ§ã®åäžïŒ æå³ããçµæãçŽæ¥è¡šçŸããã³ãŒãã¯ãäžè¬çã«èªã¿ãããçè§£ãããããã®ã§ããå€å€ã¯ãè€æ°ã®å€ãåäžã®æ»ãå€ã«ã©ã®ããã«ããã¯ãããã¢ã³ããã¯ãããããè§£èªããå¿ èŠããªãããŸãã
- å®åã³ãŒãã®åæžïŒ äžæçãªããŒã¿æ§é ãäœæãã¢ã¯ã»ã¹ã管çããããã«å¿ èŠãªã³ãŒãã¯ããªãã®éã«ãªãããšããããŸããå€å€ã¯ãã®å®åã³ãŒããåæžããã³ãŒããããç°¡æœã«ããŸãã
- ãããã°ã®ç°¡çŽ åïŒ å€å€é¢æ°ã䜿çšããã³ãŒãããããã°ããéãè€éãªããŒã¿æ§é ããã©ãããšãªããå€ãããã«å©çšã§ããŸãã
çžäºéçšæ§ã®åäž
å€å€é¢æ°ã¯ãWebAssemblyãšä»ã®èšèªãšã®éã®çžäºéçšæ§ãåäžãããããšãã§ããŸããRustã®ãããªå€ãã®èšèªã¯ãè€æ°ã®å€ãè¿ãããã®ãã€ãã£ããµããŒããæã£ãŠããŸããWebAssemblyã§å€å€ã䜿çšããããšã§ãäžèŠãªå€æã¹ããããå°å ¥ããããšãªãããããã®èšèªãšã®ã€ã³ã¿ãŒãã§ãŒã¹ã容æã«ãªããŸãã
- ã·ãŒã ã¬ã¹ãªçµ±åïŒ è€æ°ã®æ»ãå€ãèªç¶ã«ãµããŒãããèšèªã¯ãWebAssemblyã®å€å€æ©èœã«çŽæ¥ãããã³ã°ã§ããããã·ãŒã ã¬ã¹ãªçµ±åäœéšãçã¿åºããŸãã
- ããŒã·ã£ãªã³ã°ãªãŒããŒãããã®åæžïŒ èšèªã®å¢çãè¶ããéãããŒã¿ã¯ç°ãªãããŒã¿è¡šçŸéã§ããŒã·ã£ãªã³ã°ïŒå€æïŒãããå¿ èŠããããŸããå€å€ã¯å¿ èŠãªããŒã·ã£ãªã³ã°ã®éãæžãããããã©ãŒãã³ã¹ãåäžãããçµ±åããã»ã¹ãç°¡çŽ åããŸãã
- ããã¯ãªãŒã³ãªAPIïŒ å€å€ã¯ãä»ã®èšèªãšçžäºéçšããéã«ãããã¯ãªãŒã³ã§è¡šçŸåè±ããªAPIãå¯èœã«ããŸãã 颿°ã·ã°ããã£ã¯ãè¿ãããè€æ°ã®å€ãçŽæ¥åæ ã§ããŸãã
WebAssemblyã«ãããå€å€ã®ä»çµã¿
WebAssemblyã®åã·ã¹ãã ã¯ãå€å€é¢æ°ããµããŒãããããã«èšèšãããŠããŸãã 颿°ã·ã°ããã£ã¯ããã®ãã©ã¡ãŒã¿ã®åãšæ»ãå€ã®åãæå®ããŸãã å€å€ã§ã¯ãã·ã°ããã£ã®æ»ãå€éšåã«è€æ°ã®åãå«ããããšãã§ããŸãã
äŸãã°ãæŽæ°ãšæµ®åå°æ°ç¹æ°ãè¿ã颿°ã¯ã次ã®ãããªã·ã°ããã£ãæã¡ãŸãïŒç°¡ç¥åããã衚çŸã§ïŒïŒ
(param i32) (result i32 f32)
ããã¯ããã®é¢æ°ãåäžã®32ãããæŽæ°ãå ¥åãšããŠåãåãã32ãããæŽæ°ãš32ãããæµ®åå°æ°ç¹æ°ãåºåãšããŠè¿ãããšã瀺ããŸãã
WebAssemblyã®åœä»€ã»ããã«ã¯ãå€å€é¢æ°ãæ±ãããã®åœä»€ãçšæãããŠããŸãã äŸãã°ãreturnåœä»€ã¯è€æ°ã®å€ãè¿ãããã«äœ¿çšã§ããlocal.getããã³local.setåœä»€ã¯è€æ°ã®å€ãä¿æããããŒã«ã«å€æ°ã«ã¢ã¯ã»ã¹ããã倿Žãããããããã«äœ¿çšã§ããŸãã
å€å€ã®äœ¿çšäŸ
äŸ1ïŒäœãã®ããé€ç®
åè¿°ã®éããé€ç®ã®åãšäœãã®äž¡æ¹ãèšç®ãã颿°ã¯ãå€å€ãæçãšãªãå žåçãªäŸã§ãã å€å€ããªããã°ãæ§é äœãã¿ãã«ãè¿ãå¿ èŠããããããããŸããã å€å€ã䜿ãã°ãåãšäœãã2ã€ã®å¥ã ã®å€ãšããŠçŽæ¥è¿ãããšãã§ããŸãã
以äžã«ç°¡ç¥åãããäŸã瀺ããŸãïŒå®éã®Wasmã³ãŒãã§ã¯ãªããèãæ¹ãäŒãããã®ã§ãïŒïŒ
function divide(numerator: i32, denominator: i32) -> (quotient: i32, remainder: i32) {
quotient = numerator / denominator;
remainder = numerator % denominator;
return quotient, remainder;
}
äŸ2ïŒãšã©ãŒãã³ããªã³ã°
å€å€ã¯ããšã©ãŒããã广çã«åŠçããããã«ã䜿çšã§ããŸãã äŸå€ãã¹ããŒããããç¹å¥ãªãšã©ãŒã³ãŒããè¿ããããã代ããã«ã颿°ã¯å®éã®æ»ãå€ãšå ±ã«æåãã©ã°ãè¿ãããšãã§ããŸããããã«ãããåŒã³åºãåŽã¯ç°¡åã«ãšã©ãŒããã§ãã¯ããé©åã«åŠçããããšãã§ããŸãã
ç°¡ç¥åãããäŸïŒ
function readFile(filename: string) -> (success: bool, content: string) {
try {
content = read_file_from_disk(filename);
return true, content;
} catch (error) {
return false, ""; // Or a default value
}
}
ãã®äŸã§ã¯ãreadFile颿°ã¯ãã¡ã€ã«ãæ£åžžã«èªã¿åããããã©ããã瀺ãããŒã«å€ãšããã¡ã€ã«ã®å
容ãè¿ããŸããåŒã³åºãåŽã¯ããã®ããŒã«å€ããã§ãã¯ããŠæäœãæåãããã©ããã倿ã§ããŸãã
äŸ3ïŒè€çŽ æ°æŒç®
è€çŽ æ°ã®æŒç®ã§ã¯ãå®éšãšèéšã®äž¡æ¹ãè¿ãããšããããããŸãã å€å€ã䜿ãã°ãããããçŽæ¥è¿ãããšãã§ããŸãã
ç°¡ç¥åãããäŸïŒ
function complexMultiply(a_real: f64, a_imag: f64, b_real: f64, b_imag: f64) -> (real: f64, imag: f64) {
real = a_real * b_real - a_imag * b_imag;
imag = a_real * b_imag + a_imag * b_real;
return real, imag;
}
å€å€ã«å¯Ÿããã³ã³ãã€ã©ã®ãµããŒã
WebAssemblyã§å€å€ãå©çšããã«ã¯ãããããµããŒãããã³ã³ãã€ã©ãå¿ èŠã§ãã幞ããªããšã«ãRustãC++ãAssemblyScriptãªã©ã®å€ãã®äžè¬çãªã³ã³ãã€ã©ã¯ãå€å€ã®ãµããŒãã远å ããŠããŸããããã¯ããããã®èšèªã§ã³ãŒããæžããå€å€é¢æ°ãæã€WebAssemblyã«ã³ã³ãã€ã«ã§ããããšãæå³ããŸãã
Rust
Rustã¯ããã€ãã£ãã®ã¿ãã«æ»ãå€åãéããŠå€å€ã«å¯ŸããŠåªãããµããŒããæäŸããŠããŸãã Rustã®é¢æ°ã¯ç°¡åã«ã¿ãã«ãè¿ãããšãã§ããããã¯WebAssemblyã®å€å€é¢æ°ã«ã³ã³ãã€ã«ã§ããŸãã ããã«ãããå€å€ãå©çšããå¹ççã§è¡šçŸåè±ããªã³ãŒããç°¡åã«æžãããšãã§ããŸãã
äŸïŒ
fn divide(numerator: i32, denominator: i32) -> (i32, i32) {
(numerator / denominator, numerator % denominator)
}
C++
C++ã¯ãæ§é äœãã¿ãã«ã®äœ¿çšãéããŠå€å€ããµããŒãã§ããŸãããã ããWebAssemblyã®å€å€æ©èœãçŽæ¥å©çšããã«ã¯ãé©åãªWebAssemblyåœä»€ãçæããããã«ã³ã³ãã€ã©ãèšå®ããå¿ èŠããããŸãã çŸä»£ã®C++ã³ã³ãã€ã©ãç¹ã«WebAssemblyãã¿ãŒã²ãããšããå Žåãã¿ãã«ã®æ»ãå€ãã³ã³ãã€ã«ãããWasmã§çã®å€å€æ»ãå€ã«æé©åããèœåãåäžããŠããŸãã
AssemblyScript
AssemblyScriptã¯ãTypeScriptã«äŒŒãèšèªã§ãçŽæ¥WebAssemblyã«ã³ã³ãã€ã«ãããŸããããããå€å€é¢æ°ããµããŒãããŠããŸãã ããã«ãããå¹ççã§èªã¿ãããWebAssemblyã³ãŒããæžãããã®è¯ãéžæè¢ãšãªããŸãã
ããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé
å€å€ã¯å€§å¹ ãªããã©ãŒãã³ã¹åäžãããããå¯èœæ§ããããŸãããæœåšçãªããã©ãŒãã³ã¹ã®èœãšãç©Žã«æ³šæããããšãéèŠã§ãã å Žåã«ãã£ãŠã¯ãã³ã³ãã€ã©ãå€å€é¢æ°ãåäžå€é¢æ°ã»ã©å¹æçã«æé©åã§ããªãããšããããŸããæåŸ ãããããã©ãŒãã³ã¹äžã®å©ç¹ãåŸãããŠãããã確èªããããã«ãåžžã«ã³ãŒãã®ãã³ãããŒã¯ãåãããšããå§ãããŸãã
- ã³ã³ãã€ã©ã®æé©åïŒ å€å€ã®æå¹æ§ã¯ãçæãããã³ãŒããæé©åããã³ã³ãã€ã©ã®èœåã«å€§ããäŸåããŸããå ç¢ãªWebAssemblyãµããŒããšæé©åæŠç¥ãæã€ã³ã³ãã€ã©ã䜿çšããŠããããšã確èªããŠãã ããã
- 颿°åŒã³åºãã®ãªãŒããŒãããïŒ å€å€ã¯ã¡ã¢ãªç¢ºä¿ãåæžããŸããã颿°åŒã³åºãã®ãªãŒããŒãããã¯äŸç¶ãšããŠèŠå ãšãªãåŸãŸããé »ç¹ã«åŒã³åºãããå€å€é¢æ°ãã€ã³ã©ã€ã³åããŠããã®ãªãŒããŒããããåæžããããšãæ€èšããŠãã ããã
- ããŒã¿ã®å±ææ§ïŒ è¿ãããå€ãäžç·ã«äœ¿çšãããªãå Žåãå€å€ã®ããã©ãŒãã³ã¹äžã®å©ç¹ãæžå°ããå¯èœæ§ããããŸããè¿ãããå€ãããŒã¿ã®å±ææ§ãä¿é²ããæ¹æ³ã§äœ¿çšãããŠããããšã確èªããŠãã ããã
å€å€ã®æªæ¥
å€å€ã¯WebAssemblyã§ã¯æ¯èŒçæ°ããæ©èœã§ãããWebAssemblyã³ãŒãã®ããã©ãŒãã³ã¹ãšè¡šçŸåãå€§å¹ ã«åäžãããå¯èœæ§ãç§ããŠããŸãã ã³ã³ãã€ã©ãããŒã«ãæ¹åãç¶ããã«ã€ããŠãå€å€ã®æ¡çšãããã«åºããããšãæåŸ ãããŸãã
ææãªæ¹åæ§ã®äžã€ã¯ãå€å€ãšWebAssembly System Interface (WASI)ãªã©ã®ä»ã®WebAssemblyæ©èœãšã®çµ±åã§ããããã«ãããWebAssemblyããã°ã©ã ã¯å€éšã®äžçãšããå¹ççãã€å®å šã«å¯Ÿè©±ã§ããããã«ãªããŸãã
çµè«
WebAssemblyã®å€å€ã¯ãWebAssemblyã³ãŒãã®ããã©ãŒãã³ã¹ãæçæ§ãçžäºéçšæ§ãåäžãããããšãã§ãã匷åãªæ©èœã§ãã 颿°ãè€æ°ã®å€ãçŽæ¥è¿ãããšãå¯èœã«ããããšã§ãäžéããŒã¿æ§é ã®å¿ èŠæ§ããªãããããŒã¿åŠçãç°¡çŽ åããŸãã WebAssemblyã³ãŒããæžããŠãããªããã³ãŒãã®å¹çæ§ãšä¿å®æ§ãåäžãããããã«ããã²å€å€ã®å©çšãæ€èšãã¹ãã§ãã
WebAssemblyãšã³ã·ã¹ãã ãæçããã«ã€ããŠãå€å€ã®ããã«é©æ°çãªäœ¿çšæ³ãèŠãããããšãæåŸ ãããŸãã å€å€ã®å©ç¹ãšéçãçè§£ããããšã§ãäžçäžã®å¹ åºããã©ãããã©ãŒã ãç°å¢åãã«ã髿§èœã§ä¿å®å¯èœãªWebAssemblyã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«å¹æçã«æŽ»çšããããšãã§ããŸãã