
WebAssemblyã®ã³ã³ãã€ã« ã jsã©ã€ãã©ãªã®é«éå ãããã³ããã³ã³ãã¯ããªãã€ããªã®çæã®éãã¯ãã§ã«ç¢ºèªããŸããã RustãšJavaScriptã®ã³ãã¥ããã£éã ãã§ãªããä»ã®èšèªã®ã³ãã¥ããã£ãšã®çžäºäœçšã確ç«ããæ¹æ³ã«ã€ããŠã®äžè¬çãªèããããããŸãã ååã®èšäºã§ ãç¹å¥ãªããŒã«wasm-bindgenã«ã€ããŠèšåããŸããããããã§ããã«è©³ãã説æããããšæããŸãã
çŸåšã WebAssemblyä»æ§ã§ã¯ã2ã€ã®æŽæ°åãš2ã€ã®æµ®åå°æ°ç¹åã®4ã€ã®ããŒã¿åã®ã¿ã説æãããŠããŸãã ãã ããã»ãšãã©ã®å ŽåãJSããã³Rustã®éçºè ã¯ãããè±å¯ãªåã·ã¹ãã ã䜿çšããŸãã ããšãã°ãJSéçºè ã¯ããã¥ã¡ã³ããªããžã§ã¯ããšå¯Ÿè©±ããŠHTMLããŒããè¿œå ãŸãã¯å€æŽããŸãããRustéçºè ã¯Resultãªã©ã®ã¿ã€ãã§ãšã©ãŒåŠçãè¡ããã»ãšãã©ãã¹ãŠã®éçºè ã¯æååã䜿çšããŸãã
WebAssemblyãå®çŸ©ããã¿ã€ãã®ã¿ã«éå®ãããã®ã¯äžäŸ¿ã§ãããwasm-bindgenã¯ç§ãã¡ã®å©ãã«ãªããŸãã wasm-bindgenã®äž»ãªã¿ã¹ã¯ã¯ãRustãšJSã¿ã€ãã®ã·ã¹ãã éã®ããªããžãæäŸããããšã§ããã JSé¢æ°ã¯ãéåžžã®æååãæž¡ãããšã§Rust APIãåŒã³åºããããJSããäŸå€ããã£ããããããã«Rusté¢æ°ãåŒã³åºãããã§ããŸãã wasm-bindgenã¯ãåã®äžäžèŽãè£æ£ããJavaScriptããWebAssemblyé¢æ°ãå¹ççãã€ç°¡åã«äœ¿çšã§ããããã«ããŸãã
README㧠wasm-bindgenãããžã§ã¯ãã®è©³çŽ°ãªèª¬æãèŠã€ããããšãã§ããŸãã æåã«ãwasm-bindgenã®ç°¡åãªäœ¿çšäŸãèŠãŠããããããã©ã®ããã«äœ¿çšã§ããããèŠãŠã¿ãŸãããã
ããã«ã¡ã¯äžçïŒ
æ代ãè¶ è¶ããã¯ã©ã·ãã¯ã æ°ããããŒã«ãè©Šãæè¯ã®æ¹æ³ã®1ã€ã¯ãã¡ãã»ãŒãžãHello Worldãã®åºåã®ããªãšãŒã·ã§ã³ã調ã¹ãããšã§ãã ãã®å Žåããããè¡ãäŸãèŠãŠã¿ãŸããã-ãHello Worldããšãããã€ã¢ãã°ããã¯ã¹ã衚瀺ãããŸãã
ããã§ã®ç®æšã¯ç°¡åã§ããååãååŸãã Hello, ${name}!
ãšãããã€ã¢ãã°ããã¯ã¹ã衚瀺ããRusté¢æ°ãäœæããŸãHello, ${name}!
ã JavaScriptã§ã¯ã次ã®ããã«èšè¿°ããŸãã
export function greet(name) { alert(`Hello, ${name}!`); }
ãã ãããã®é¢æ°ãRustã§èšè¿°ããŸãã ãããæ©èœããããã«ã¯ã次ã®æé ãå¿ èŠã§ãã
- JavaScriptã¯WebAssemblyã¢ãžã¥ãŒã«ãåŒã³åºããŠãgreeté¢æ°ããšã¯ã¹ããŒãããå¿ èŠããããŸãã
- Rusté¢æ°ã¯ãåŒæ°ãšããŠååãå«ãæååãåãåããŸãã
- Rusté¢æ°å ã§ãæ°ããè¡ãäœæããæž¡ãããååãããã«æ¿å ¥ããŸãã
- æåŸã«ãRustã¯çæãããæååãåŒæ°ãšããŠäœ¿çšããŠJavaScriptã¢ã©ãŒãé¢æ°ãåŒã³åºããŸãã
ãŸããæ°ããRustãããžã§ã¯ããäœæããŸãã
cargo new wasm-greet --lib
ãã®ã³ãã³ãã¯ãäœæ¥ããwasm-greetãã©ã«ããŒãäœæããŸãã 次ã®ã¹ãããã§ã¯ã Cargo.toml
ïŒRustã®package.json
ã¢ããã°ïŒã«æ¬¡ã®æ
å ±ãè¿œå ããŸãã
[lib] crate-type = ["cdylib"] [dependencies] wasm-bindgen = "0.2"
ãšãããã ãlibã»ã¯ã·ã§ã³ã®å
容ã¯ã¹ããããã dependencies
ã»ã¯ã·ã§ã³ã§ã¯ã wasm-bindgenããã±ãŒãžãžã®ãããžã§ã¯ãã®äŸåé¢ä¿ã瀺ããŸã ã ãã®ããã±ãŒãžã«ã¯ããããžã§ã¯ãã§wasm-bindgenã䜿çšããããã«å¿
èŠãªãã¹ãŠãå«ãŸããŠããŸãã
ããã§ã¯ãã³ãŒããè¿œå ããŸãããïŒ src/lib.rs
å
容ã次ã®ã³ãŒãã«çœ®ãæããŸãã
#![feature(proc_macro, wasm_custom_section, wasm_import_module)] extern crate wasm_bindgen; use wasm_bindgen::prelude::*; #[wasm_bindgen] extern { fn alert(s: &str); } #[wasm_bindgen] pub fn greet(name: &str) { alert(&format!("Hello, {}!", name)); }
RustãåããŠäœ¿çšããå Žåãäžèšã®äŸã¯å°ãåé·ã«èŠãããããããŸããããå¿é
ããªãã§ãã ããã wasm-bindgenãããžã§ã¯ãã¯çµ¶ããæ¹åãããŠãããå°æ¥ããã®ãããªè©³çŽ°ãªèª¬æã®å¿
èŠæ§ã¯ãªããªããšç¢ºä¿¡ããŠããŸãã ããã§æãéèŠãªéšåã¯ãå±æ§#[wasm_bindgen]
ã§ãã ããã¯Rustã®æ³šéã§ãããå¿
èŠã«å¿ããŠãã®é¢æ°ãå¥ã®é¢æ°ã«ã©ããããå¿
èŠãããããšã瀺ããŠããŸãã äž¡æ¹ã®é¢æ°ïŒ alert
é¢æ°ã®ã€ã³ããŒããšgreet
é¢æ°ã®ãšã¯ã¹ããŒãã®äž¡æ¹ïŒã«ãã®å±æ§ããããŸãã å°ãåŸããã³ãããã®äžãèŠãŠãããã§äœãèµ·ãããã確èªããŸãã
ããããæåã«ãwasmã³ãŒããã³ã³ãã€ã«ããŠãã©ãŠã¶ãŒã§éããŸãããã
$ rustup target add wasm32-unknown-unknown --toolchain nightly # $ cargo +nightly build --target wasm32-unknown-unknown
å®äºãããšã target/wasm32-unknown-unknown/debug/wasm_greet.wasm
é
眮ãããwasmãã¡ã€ã«ãååŸããŸãã wasm2watã®ãããªãã®ã䜿çšããŠãã®ãã¡ã€ã«ã®äžãèŠããšããã®å
容ã¯å°ãåšå§çã«èŠãããããããŸããã wasmãã¡ã€ã«ã¯ãŸã JSãã䜿çšããæºåãã§ããŠããªãããšãããããŸãã ãããè¡ãã«ã¯ããã1ã€ã®æé ãå¿
èŠã§ãã
$ cargo install wasm-bindgen-cli # $ wasm-bindgen target/wasm32-unknown-unknown/debug/wasm_greet.wasm --out-dir .
ãã®ã¹ãããã§ããã¹ãŠã®éæ³ãèµ·ãããŸãã wasm-bindgenã³ãã³ãã¯wasmãã¡ã€ã«ãåŠçãã䜿çšã§ããç¶æ
ã«ããŸãã å°ãåŸã§ãããã«äœ¿çšã§ããããšããæå³ãèŠãŠãä»äœæããwasm_greet.js
ã¢ãžã¥ãŒã«ãã€ã³ããŒããããšãRustã§å®£èšãããŠããgreet
é¢æ°ãå«ãŸããããšã«ãªããŸãã
ããã§ãããã«ãŒã䜿çšããŠãã³ãŒããå®è¡ããHTMLããŒãžãäœæã§ããŸãã ãã®èšäºã®å·çæç¹ã§ã¯ã Webpack 4.0ã®ã¿ãã ããã«äœ¿çšã§ããååãªWebAssemblyãµããŒããåããŠããŸãïŒãã ããçŸæç¹ã§ã¯Chromeãã©ãŠã¶ãŒã«åé¡ããããŸãïŒã 確ãã«ãæéã®çµéãšãšãã«ããŸããŸãå€ãã®ããã«ãŒãWebAssemblyã®ãµããŒããè¿œå ããŠããã§ãããã 詳现ã¯èª¬æããŸããã ãªããžããªã§WebPackã®ãµã³ãã«èšå®ã確èªã§ããŸã ã JSãã¡ã€ã«ã®å 容ãèŠããšã次ã®ããšãããããŸãã
const rust = import("./wasm_greet"); rust.then(m => m.greet("World!"));
...ãããŠããã ãã§ãã ãã©ãŠã¶ã§ããŒãžãéããšãã Hello, World!
ãšããç¢æã衚瀺ããããã€ã¢ãã°ããã¯ã¹ã衚瀺ãããŸãHello, World!
Rustã§äœæãããŸããã
wasm-bindgenã®ä»çµã¿
ã¡ãã£ãšå€§ããã Hello, World!
ã ããŒãã®äžã§äœãèµ·ãããããã®ããŒã«ãã©ã®ããã«æ©èœããããèŠãŠã¿ãŸãããã
wasm-bindgenã®æãéèŠãªåŽé¢ã®1ã€ã¯ãwasmã¢ãžã¥ãŒã«ãåãªãESã¢ãžã¥ãŒã«ã®äžçš®ã§ãããšããåºæ¬æŠå¿µã«åºã¥ããŠçµ±åãè¡ãããããšã§ãã äžèšã®äŸã§ã¯ã次ã®çœ²åïŒTypeScriptïŒã䜿çšããŠESã¢ãžã¥ãŒã«ãäœæãããã£ãã ãã§ãã
export function greet(s: string);
WebAssemblyã«ã¯ãããå®è¡ããæ©èœããªãããïŒçŸæç¹ã§ã¯wasmãæ°åã®ã¿ããµããŒãããŠããããšã«æ³šæããŠãã ããïŒãwasm-bindgenã䜿çšããŠç©ºçœãåããŸãã æåŸã®äŸã®æåŸã®ã¹ãããã§ã wasm-bindgen
ãèµ·åãããšã wasm_greet.js
ãã¡ã€ã«ã ãã§ãªãã wasm_greet.js
ãäœæããwasm_greet_bg.wasm
ã 1ã€ç®ã¯JSã€ã³ã¿ãŒãã§ãŒã¹ã§ãããã«ããRustã³ãŒããåŒã³åºãããšãã§ããŸãã ãŸãã *_bg.wasm
ãã¡ã€ã«ã«ã¯ãå®è£
ãšã³ã³ãã€ã«ããããã¹ãŠã®ã³ãŒããå«ãŸããŠããŸãã
./wasm_greet
ã¢ãžã¥ãŒã«ãã€ã³ããŒããããšãJSããåŒã³åºãããRustã³ãŒããååŸããŸããããã®æ®µéã§ã¯ãã€ãã£ãã«å®è¡ããæ¹æ³ã¯ãããŸããã çµ±åããã»ã¹ã«ã€ããŠèª¬æããã®ã§ããã®ã³ãŒãã®å®è¡ãèŠãŠã¿ãŸãããã
const rust = import("./wasm_greet"); rust.then(m => m.greet("World!"));
ããã§ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ãéåæçã«ã€ã³ããŒãããæºåãæŽããŸã§åŸ
æ©ãïŒwasmã¢ãžã¥ãŒã«ãããŠã³ããŒãããŠã³ã³ãã€ã«ãïŒã greet
é¢æ°ãåŒã³åºããŸãã
éåæèªã¿èŸŒã¿ã¯Webpackã®èŠä»¶ã§ãããåžžã«å¯èœã§ãããšã¯éãããä»ã®ããã«ãŒã§ã¯ç°ãªãæ¹æ³ã§å®è£ ã§ããããšã«æ³šæããŠãã ããã
wasm-bindgen
ããwasm_greet.js
ãã¡ã€ã«ã®å
容ãèŠããšã次ã®ãããªãã®ã衚瀺ãããŸãã
import * as wasm from './wasm_greet_bg'; // ... export function greet(arg0) { const [ptr0, len0] = passStringToWasm(arg0); try { const ret = wasm.greet(ptr0, len0); return ret; } finally { wasm.__wbindgen_free(ptr0, len0); } } export function __wbg_f_alert_alert_n(ptr0, len0) { // ... }
泚æããŠãã ããã ããã¯æé©åãããã³ãŒãã§ã¯ãªããèªåçã«çæãããã³ãŒãã§ãããå¿ ãããçŸãããå°ããããããŸããã ãªã³ã¯äžã®æé©åã®ããã»ã¹ã§ã¯ãRustã§ã¢ã»ã³ããªã解æŸãããããã¡ã€ã€ãééããåŸãã¯ããã«å°ãããªããŸãã
ããã§ãwasm-bindgenãã©ã®ããã«greet
é¢æ°ãçæãããã確èªããŸãã å
éšã§ã¯ãã¢ãžã¥ãŒã«ã®greet
ããã³wasmé¢æ°ãåŒã³åºããŸãããçŸåšã¯æååã§ã¯ãªããåŒæ°ãšããŠæž¡ããããã€ã³ã¿ãšé·ãã§åŒã³åºãããŸãã passStringToWasm
é¢æ°ã®è©³çŽ°ã«ã€ããŠã¯ã Lin Clarkã®èšäºãåç
§ããŠãã ããã wasm-bindgenã䜿çšããŠããªãã£ãå Žåããã®ã³ãŒãããã¹ãŠèªåã§äœæããå¿
èŠããããŸãã å°ãåŸã§__wbg_f_alert_alert_n
é¢æ°ã«æ»ããŸãã
ã¬ãã«ãäžãããšã次ã®èå³æ·±ããã€ã³ããWebAssemblyã®greet
é¢æ°ãèŠã€ãããŸãã Rustã³ã³ãã€ã©ãèŠãã³ãŒããèŠãŠã¿ãŸãããã äžèšã§çæãããJSã³ãŒãã®ããã«ããšã¯ã¹ããŒããããgreet
æåãææžãããªãã£ãããšã«æ³šæããŠãã ããã wasm-bindgenã¯ãåå¥ã«å¿
èŠãªãã¹ãŠãçæããŸãããã€ãŸãã
pub fn greet(name: &str) { alert(&format!("Hello, {}!", name)); } #[export_name = "greet"] pub extern fn __wasm_bindgen_generated_greet(arg0_ptr: *mut u8, arg0_len: usize) { let arg0 = unsafe { ::std::slice::from_raw_parts(arg0_ptr as *const u8, arg0_len) } let arg0 = unsafe { ::std::str::from_utf8_unchecked(arg0) }; greet(arg0); }
ããã§ã¯ã greet
é¢æ°ãããã³#[wasm_bingen]
__wasm_bindgen_generated_greet
ã䜿çšããŠè¿œå ã§çæããã__wasm_bindgen_generated_greet
é¢æ°ã__wasm_bindgen_generated_greet
ã ããã¯ãšã¯ã¹ããŒããããé¢æ°ã§ããïŒ #[export_name]
å±æ§ãšextern
ããŒã¯ãŒãã¯ããã瀺ããŸãïŒããã€ã³ã¿ãŒãšæååã®é·ããåããŸãã 次ã«ããã®ãã¢ãïŒstr ïŒRustã®æååïŒã«å€æãã greet
é¢æ°ã«æž¡ããŸãã
èšãæãããšãwasm-bindgenã¯2ã€ã®ã©ãããŒãçæããŸãã1ã€ã¯JavaScriptã§JSããwasmã«å€æãããã1ã€ã¯Rustã§wasmã¿ã€ããååŸããŠRustã«å€æããŸãã
ããŠã alert
æ©èœã®ã©ãããŒã®æåŸã®ã»ãããèŠãŠã¿ãŸãããã Rustã®greet
é¢æ°ã¯ãæšæºã®ãã¯ã圢åŒã䜿çšããŸãïŒ æ°ããè¡ãäœæãããããalert
æ©èœã«æž¡ããŸãã alert
é¢æ°ã宣èšãããšãã #[wasm_bindgen]
å±æ§ã䜿çšããããšãæãåºããŠãã ãããä»åºŠã¯ãRustã³ã³ãã€ã©ãèŠããã®ãèŠãŠã¿ãŸãããã
fn alert(s: &str) { #[wasm_import_module = "__wbindgen_placeholder__"] extern { fn __wbg_f_alert_alert_n(s_ptr: *const u8, s_len: usize); } unsafe { let s_ptr = s.as_ptr(); let s_len = s.len(); __wbg_f_alert_alert_n(s_ptr, s_len); } }
ããã¯æ£ç¢ºã«ç§ãã¡ãæžãããã®ã§ã¯ãããŸããããããã§äœãèµ·ãã£ãŠããããæ確ã«èŠãããšãã§ããŸãã alert
é¢æ°ã¯ãå®éã«ã¯æååãšstrãåãããããwasmã«åªããæ°åã«å€æããèãã©ãããŒã§ãã ãã®åŸã __wbg_f_alert_alert_n
é¢æ°ã__wbg_f_alert_alert_n
ãå¥åŠãªéšåããããŸã-ããã¯å±æ§#[wasm_import_module]
ã§ãã
é¢æ°ãWebAssemblyã«ã€ã³ããŒãããã«ã¯ããããå«ãã¢ãžã¥ãŒã«ãå¿
èŠã§ãã ãŸããwasm-bindgenã¯ESã¢ãžã¥ãŒã«äžã«æ§ç¯ãããŠãããããwasmããã®ãã®ãããªé¢æ°ã®ã€ã³ããŒãã¯ãESã¢ãžã¥ãŒã«ããã®ã€ã³ããŒããšããŠè§£éãããŸãã __wbindgen_placeholder__
ã¢ãžã¥ãŒã«__wbindgen_placeholder__
å®éã«ã¯ååš__wbindgen_placeholder__
ãããã®æéã¯ããã®ã€ã³ããŒããwasm-bindgenãšJSã®ã©ãããŒãçæããããšã«ãã£ãŠåŠçãããã¹ãã§ããããšã瀺ããŠããŸãã
ãããŠæåŸã«ãããºã«ã®æåŸã®ããŒã¹ïŒçæãããJSãã¡ã€ã«ïŒãååŸããŸãã
export function __wbg_f_alert_alert_n(ptr0, len0) { let arg0 = getStringFromWasm(ptr0, len0); alert(arg0) }
å€æããããã«ãéåžžã«å€ãã®ããšãå
éšã§çºçããŠããããã©ãŠã¶ãŒã§JSé¢æ°ãåŒã³åºãã«ã¯ããªãé·ãéã®ãããããŸããã ããããå¿é
ããªãã§ãã ãããwasm-bindgenã®éèŠãªåŽé¢ã¯ãããããã¹ãŠãé ãããŠããããšã§ãã ãã¡ãã¡ã§#[wasm_bindgen]
å±æ§ãæã€Rustã³ãŒããæžãããšãã§ããŸãã ãããŠãJSã³ãŒãã¯ãããããå¥ã®JavaScriptã¢ãžã¥ãŒã«ã§ãããã®ããã«ããã䜿çšã§ããããã«ãªããŸãã
wasm-bindgenã§ä»ã«ã§ããããšã¯äœã§ããïŒ
wasm-bindgenãããžã§ã¯ãã¯éåžžã«éå¿çã§ãåºãç¯å²ãã«ããŒããŠãããçŸæç¹ã§ã¯ãã¹ãŠã説æããã®ã«ååãªæéããããŸããã åäœã確èªããè¯ãæ¹æ³ã¯ãåçŽãªHello WorldïŒããRust ã®ããªãŒã®DOMããŒãã®æäœãŸã§ã ãµã³ãã«ãããç解ããããšã§ãã
äžè¬çã«ãwasm-bindgenã®äž»ãªæ©èœã¯æ¬¡ã®ãšããã§ãã
- JSæ§é ãé¢æ°ããªããžã§ã¯ããªã©ãã€ã³ããŒãããŸãã wasmã§äœ¿çšããããã éåžžã«èªç¶ã«æ§é ã®JSã¡ãœãããåŒã³åºãããã¹ãŠã®å±æ§ãå
¬éãããåŸã«Rustããããããã£ã«ã¢ã¯ã»ã¹ã§ããŸã
#[wasm_bindgen]
- JSã§äœ¿çšããRustæ§é ãšé¢æ°ããšã¯ã¹ããŒãããŸãã æ°å€ã®ã¿ã䜿çšãã代ããã«ãæ§é ãRustãããšã¯ã¹ããŒãããŠãJSã¯ã©ã¹ã«å€æã§ããŸãã æ°åã ãã§ãªããæ§é äœãååŸã«è»¢éã§ããŸãã 次ã®äŸã¯ãå¯èœãªçžäºéçšæ§ã®ã¢ã€ãã¢ãæäŸããŸãã
- ãŸããã°ããŒãã«é¢æ°ïŒ
alert
ãªã©ïŒã䜿çšããŠãRustã®ResultããŒã¿åã䜿çšããŠJSããäŸå€ããã£ãããããªã©ãRustããã°ã©ã ã§JSããã®å€ã®ä¿åãã·ãã¥ã¬ãŒãããäžè¬çãªæ¹æ³ãªã©ã®æ©èœããããŸãã
è¿œå æ©èœã«ã€ããŠç¥ãããå Žåã¯ããã©ãã«ãŒããã©ããŒããŠãã ãã ã
wasm-bindgenã®æ¬¡ã¯äœã§ããïŒ
ãããæããšããµã€ãã£ã³ã°ãªãããã¯ã®1ã€ã§ãããããå®äºããåã«ãwasm-bindgenãããžã§ã¯ãã®å°æ¥ã«ã€ããŠå°ãã話ãããããšæããŸãã
Rust以å€ã®èšèªã®ãµããŒã
wasm-bindgenã¯ãæåã®æ¥ãããå€ãã®èšèªã§äœ¿çšã§ããããã«èšèšãããŸããã çŸåšãµããŒããããŠããèšèªã¯Rustã®ã¿ã§ããããã®ããŒã«ã䜿çšãããšå°æ¥çã«C / C ++ãè¿œå ã§ããŸãã å±æ§#[wasm_bindgen]
ã¯.wasm
ãã¡ã€ã«ã«è¿œå ã®ã»ã¯ã·ã§ã³ãäœæããŸãããã®ã»ã¯ã·ã§ã³ã¯è§£æãwasm-bindgen
ãŸãã ãã®ã»ã¯ã·ã§ã³ã§ã¯ãJSã§çæããããã€ã³ãã£ã³ã°ãšãã®ã€ã³ã¿ãŒãã§ãŒã¹ã«ã€ããŠèª¬æããŸãã ãã®ã»ã¯ã·ã§ã³ã«ã¯Ruståºæã®ãã®ã¯ãªããããC / C ++ã³ã³ãã€ã©ãåãããã©ã°ã€ã³ã§ãäœæã§ãããããåŸã§wasm-bindgen
ã䜿çšã§ããããã«ãªããŸãã
ç§ã«ãšã£ãŠãããã¯æãåºæ¿çãªç¬éã§ãããªããªãããããwasm-bindgen
ãããªããŒã«ãWebAssemblyãšJSãæå¹ã«ããããã®æšæºã«ããããšãã§ãããšä¿¡ããŠããããã§ãã äžèŠãªæ§æã³ãŒããªãã§å®è¡ã§ããæ©èœããWebAssemblyã«ã³ã³ãã€ã«ã§ãããã¹ãŠã®èšèªã®å©ç¹ã«ãªãããšãé¡ã£ãŠããŸãã
JSã®ãã€ã³ããŒã®èªåçæ
çŸæç¹ã§ã¯ã #[wasm_bindgen]
ã䜿çšããŠJSé¢æ°ãã€ã³ããŒãããå Žåã®æ¬ ç¹ã®1ã€ã¯ããã¹ãŠã®é¢æ°ãèªåã§èšè¿°ãããšã©ãŒããªãããšã確èªããå¿
èŠãããããšã§ãã æã«ã¯ããã®ããã»ã¹ã¯éåžžã«éå±ã§ïŒãããŠãšã©ãŒã®åå ã«ããªããŸãïŒãèªååãå¿
èŠã§ãã
ãã¹ãŠã®Web APIã¯WebIDLã§æå®ããã³èšè¿°ãããŠããã WebIDLãããã¹ãŠã®ãã€ã³ããŒãèªåçã«çæããããšãå®å
šã«å¯èœã§ãªããã°ãªããŸããã ã€ãŸããäžèšã®äŸã§è¡ã£ãããã«alert
é¢æ°ãå®çŸ©ããå¿
èŠã¯ãªãã代ããã«æ¬¡ã®ããã«èšè¿°ã§ããŸãã
#[wasm_bindgen] pub fn greet(s: &str) { webapi::alert(&format!("Hello, {}!", s)); }
ãã®å Žåã webapi
ããã±ãŒãžã¯WebIDL APIã®èª¬æããèªåçã«çæããããšã©ãŒãçºçããªãããšãä¿èšŒãããŸãã
ãã®ã¢ã€ãã¢ãããã«çºå±ãããTypeScriptã³ãã¥ããã£ã®å°è±¡çãªææã掻çšããTypeScript ãããã€ã³ããŒãçæããããšãã§ããŸãã ããã«ãããTypeScriptããµããŒãããnpmã®ããã±ãŒãžãèªåçã«äœ¿çšãããŸãã
JSãããé«éãªDOMæäœ
æåŸã«ãªããŸããããå°å¹³ç·wasm-bindgenã§ã¯ãè¶ é«éDOMæäœã¯å€ãã®JavaScriptãã¬ãŒã ã¯ãŒã¯ã®èæ¯ã§ãã çŸåšãJavaScriptããC ++ãšã³ãžã³ã«ç§»è¡ããå ŽåãDOMãæäœããããã®ãã¹ãŠã®é¢æ°åŒã³åºãã¯ãã³ã¹ãã®ãããå€æãçµãŠããŸãã WebAssemblyã䜿çšãããšããããã®å€æã¯ãªãã·ã§ã³ã«ãªããŸãã WebAssemblyåã·ã¹ãã ã¯...ã§ããããšãç¥ã£ãŠããŸãïŒ
æåã®æ¥ããã wasm-bindgen
ã³ãŒãçæã¯ããã¹ããžã®å
¥æããµããŒãããããšãç®çãšããŠèšèšãããŸããã ãã®é¢æ°ãWebAssemblyã«è¡šç€ºããããšããã«ãwasm-bindgenãçæããã©ãããŒãªãã§ã€ã³ããŒããããé¢æ°ãçŽæ¥äœ¿çšããæ©äŒããããŸãã ããã«ãããã«ããJSãšã³ãžã³ã¯WebAssemblyããã®DOMæäœãç©æ¥µçã«æé©åã§ããŸããããã¯ããã¹ãŠã®ã€ã³ã¿ãŒãã§ã€ã¹ãå³å¯ã«åæå®ãããããããæ€èšŒããå¿
èŠããªããªãããã§ãã ãã®å Žåãwasm-bindgenã¯ãããŸããŸãªããŒã¿åã§ã®äœæ¥ã容æã«ããã ãã§ãªããDOMã§ã®äœæ¥æã«ãã®çš®ã®æé«ã®ããã©ãŒãã³ã¹ãæäŸããŸãã
ãŸãšãããš
WebAssemblyã§ã®äœæ¥ã¯ãã³ãã¥ããã£ã®ãããã ãã§ãªããéçºã®éããããéåžžã«èå³æ·±ããšæããŠããŸãã wasm-bindgenãããžã§ã¯ãã«ã¯æããæªæ¥ããããŸãã JSãšRustã®éã®ç°¡åãªçžäºéçšæ§ãæäŸããã ãã§ãªããWebAssemblyãé²åããã«ã€ããŠé·æçã«ã¯æ°ããå¯èœæ§ãéããŸãã
wasm-bindgenãè©ŠããŠãæ°ããé¢æ°ã®ãªã¯ãšã¹ããäœæããRustãšWebAssembly ã«é£çµ¡ããŠãã ããã