ä½¿ç¨ WebAssembly JavaScript API
å¦æä½ å·²ç»ä½¿ç¨ Emscripten çå·¥å ·ç¼è¯äºå¦ä¸ç§è¯è¨ç模åï¼æè èªè¡å 载并è¿è¡ä»£ç ï¼é£ä¹ä¸ä¸æ¥æ¯äºè§£å¦ä½ä½¿ç¨ WebAssembly JavaScript API çå ¶ä»ç¹æ§ãè¿ç¯æç« åè¯ä½ ä½ éè¦ç¥éä»ä¹ã
夿³¨ï¼å¦æä½ ä¸çææ¬æä¸æå°å°åºç¡æ¦å¿µå¹¶ä¸éè¦æ´å¤çè§£éï¼è¯·å é 读 WebAssembly æ¦å¿µã
ç®å示ä¾
让æä»¬éè¿ä¸æ¥ä¸æ¥çä¾åæ¥äºè§£å¦ä½å¨ WebAssembly ä¸ä½¿ç¨ Javascript APIï¼åå¦ä½å¨ç½é¡µä¸å è½½ä¸ä¸ª wasm 模åã
夿³¨ï¼ä½ å¯ä»¥å¨ webassembly-examples GitHub ä»åºæ¾å°ç¸åç代ç ã
åå¤å·¥ä½
-
é¦å éè¦ä¸ä¸ª wasm 模åï¼ä¸è½½
simple.wasmæä»¶å°æ¬æºçä¸ä¸ªæ°çç®å½ä¸ã -
ç¶åï¼å¨ä½ çæ¬æºç wasm æä»¶å¤äºåä¸ç®å½ä¸ï¼å建ä¸ä¸ªå为
index.htmlçç®åç HTML æä»¶ï¼å¦æä½ æ²¡ææ¨¡æ¿ï¼å¯ä»¥ä½¿ç¨æä»¬æä¾çç®å模æ¿ï¼ã -
ç°å¨ï¼ä¸ºäºå¸®å©æä»¬çè§£åçäºä»ä¹ï¼è®©æä»¬æ¥ççè¿ä¸ª wasm 模åçææ¬è¡¨ç¤ºï¼æä»¬ä¹å¨å° WebAssembly ææ¬æ ¼å¼è½¬æ¢ä¸º wasm 䏿ä¸è®¨è®ºäºè¿ä¸ç¹ï¼ï¼
wasm(module (func $i (import "my_namespace" "imported_func") (param i32)) (func (export "exported_func") i32.const 42 call $i)) -
å¨ç¬¬äºè¡ï¼ä½ å°çå°å¯¼å ¥æä¸ä¸ªä¸¤çº§å½å空é´ââå é¨å½æ°
$iæ¯ä»my_namespace.imported_funcå¯¼å ¥çãç¼åè¦å¯¼å ¥å° wasm 模åç对象æ¶ï¼æä»¬éè¦å¨ JavaScript ä¸åæ è¿ä¸ªä¸¤çº§å½å空é´ãå¨ä½ ç HTML æä»¶ä¸å建ä¸ä¸ª<script></script>èç¹ï¼å¹¶æ·»å ä¸é¢ç代ç ï¼jsconst importObject = { my_namespace: { imported_func: (arg) => console.log(arg) }, };
ä¸²æµ WebAssembly 模å
Firefox 58 æ°å¢äºç´æ¥ä»åºå±æºç¼è¯åå®ä¾å WebAssembly 模åçåè½ãè¿æ¯éè¿ WebAssembly.compileStreaming() å WebAssembly.instantiateStreaming() æ¹æ³å®ç°çãè¿äºæ¹æ³æ¯é串æµçæ¹æ³æ´ç®åï¼å 为å®ä»¬å¯ä»¥å°åèç ç´æ¥è½¬åä¸ºâæ¨¡åâ/âå®ä¾âï¼èæ éå° Response åç¬æ¾å
¥ ArrayBuffer ä¸ã
æ¬ç¤ºä¾ï¼åè§ GitHub ä¸ç instantiate-streaming.html æ¼ç¤ºï¼æè
å¨çº¿æ¥çï¼å±ç¤ºäºå¦ä½ä½¿ç¨ instantiateStreaming() è·å Wasm 模åãåå
¶ä¸å¯¼å
¥ JavaScript 彿°ãç¼è¯åå®ä¾å该模å以å访é®å
¶å¯¼åºå½æ°ï¼ææè¿äºé½åªé䏿¥å³å¯å®æã
å¨èæ¬ç第ä¸ä¸ªä»£ç åä¸é¢æ·»å 以ä¸å 容ï¼
WebAssembly.instantiateStreaming(fetch("simple.wasm"), importObject).then(
(obj) => obj.instance.exports.exported_func(),
);
è¿æ ·åçæç»ç»ææ¯ï¼æä»¬è°ç¨äºå¯¼åºç WebAssembly 彿° exported_funcï¼è¯¥å½æ°åè°ç¨äºå¯¼å
¥ç JavaScript 彿° imported_funcï¼è¯¥å½æ°ä¼å° WebAssembly å®ä¾å
鍿ä¾çå¼ï¼42ï¼è®°å½å°æ§å¶å°ãå¦æä½ ç°å¨ä¿åä½ ç示ä¾ä»£ç ï¼å¹¶å¨æ¯æ WebAssembly çæµè§å¨ä¸å è½½å®ï¼ä½ å°±è½çå°ç¨åºè¿æ ·è¿è¡èµ·æ¥ï¼
夿³¨ï¼è¿æ¯ä¸ä¸ªè¿åæ²æãå°å¦åé¿ï¼ä½å´å¹¶æ²¡æä»ä¹æä¹ç示ä¾ï¼ä½å®ç¡®å®è¯´æäºå¨ Web åºç¨ç¨åºä¸ä½¿ç¨ WebAssembly 代ç å JavaScript çå¯è½æ§ãæ£å¦æä»¬å¨å ¶ä»å°æ¹æè¯´ç飿 ·ï¼WebAssembly çç®æ 并䏿¯å代 JavaScriptï¼ç¸åï¼ä¸¤è å¯ä»¥ç¸äºåä½ï¼åé¿è¡¥çã
ä¸ä½¿ç¨æµå è½½æä»¬ç Wasm 模å
å¦æä½ ä¸è½æä¸æ³ä½¿ç¨ä¸è¿°çæµæ¹æ³ï¼ä½ å¯ä»¥ä½¿ç¨é串æµçæ¹æ³ WebAssembly.compile()/WebAssembly.instantiate() æ¥ä»£æ¿ã
è¿äºæ¹æ³ä¸è½ç´æ¥è®¿é®åèç ï¼å æ¤éè¦é¢å¤çæ¥éª¤ï¼å¨ç¼è¯/å®ä¾å Wasm 模åä¹åå°ååºè½¬å为 ArrayBufferã
çä»·ç代ç å¦ä¸ï¼
fetch("simple.wasm")
.then((response) => response.arrayBuffer())
.then((bytes) => WebAssembly.instantiate(bytes, importObject))
.then((results) => {
results.instance.exports.exported_func();
});
å¨å¼åè å·¥å ·æ¥ç wasm
Firefox 54+ ä¸çå¼åè å·¥å ·è°è¯å¨é¢æ¿è½å¤æ¾ç¤ºç½é¡µä¸ä»»ä½ Wasm 代ç çææ¬è¡¨ç¤ºãè¦æ¥çè¿ä¸é¢æ¿ï¼ä½ å¯ä»¥è¿å ¥è°è¯å¨é¢æ¿ï¼ç¹å»âwasm://âæ¡ç®ã

é¤äºä»¥ææ¬æ ¼å¼æ¥ç WebAssembly å¤ï¼å¼å人åè¿å¯ä»¥ä½¿ç¨ææ¬æ ¼å¼è°è¯ WebAssemblyï¼è®¾ç½®æç¹ãæ£æ¥è°ç¨å æ ã忥è°è¯çï¼ã
å å
å¨ WebAssembly çåºå±å 忍¡åä¸ï¼å å被表示为ä¸ä¸ªè¿ç»çæ ç±»ååèèå´ï¼ç§°ä¸ºçº¿æ§å åï¼ç±æ¨¡åå é¨çå è½½ååå¨æä»¤è¯»åãå¨è¿ç§å 忍¡åä¸ï¼ä»»ä½å è½½æå卿令é½å¯ä»¥è®¿é®æ´ä¸ªçº¿æ§å åä¸çä»»ä½åèï¼è¿å¯¹äºå¿ å®è¡¨ç¤ºæéç C/C++ æ¦å¿µæ¥è¯´æ¯å¿ è¦çã
ä½ä¸æ¬å° C/C++ ç¨åºä¸åçæ¯ï¼æ¬å° C/C++ ç¨åºçå¯ç¨å
åèå´æ¨ªè·¨æ´ä¸ªè¿ç¨ï¼èç¹å® WebAssembly å®ä¾å¯è®¿é®çå
åä»
éäº WebAssembly å
å对象æå
å«çä¸ä¸ªç¹å®èå´ï¼å¯è½é常å°ï¼ãè¿æ ·ï¼ä¸ä¸ªç½ç»åºç¨ç¨åºå°±å¯ä»¥ä½¿ç¨å¤ä¸ªç¬ç«çåºï¼æ¯ä¸ªåºé½å¨å
é¨ä½¿ç¨ WebAssemblyï¼å¹¶æ¥æå®å
¨ç¸äºé离çç¬ç«å
åãæ¤å¤ï¼è¾æ°çå®ç°è¿å¯ä»¥å建å
±äº«å
åï¼è¿äºå
åå¯ä»¥ä½¿ç¨ postMessage() å¨ Window å Worker ä¸ä¸æä¹é´ä¼ è¾ï¼å¹¶å¨å¤ä¸ªå°æ¹ä½¿ç¨ã
å¨ JavaScript ä¸ï¼Memory å®ä¾å¯è¢«è§ä¸ºä¸ä¸ªå¯è°æ´å¤§å°ç ArrayBufferï¼å¦ææ¯å
±äº«åå¨å¨çè¯ï¼åæ¯ SharedArrayBufferï¼ï¼å°±åä½¿ç¨ ArrayBuffers 䏿 ·ï¼Web åºç¨å¯ä»¥å建å¤ä¸ªç¬ç«ç Memory 对象ãä½ å¯ä»¥ä½¿ç¨ WebAssembly.Memory() æé 彿°å建ä¸ä¸ªå¯¹è±¡ï¼åæ°å
æ¬åå§å¤§å°åï¼å¯éï¼æå¤§å¤§å°ï¼ä»¥åè¯´ææ¯å¦ä¸ºå
±äº«å
åç shared 屿§ï¼ã
让æä»¬ä»ä¸ä¸ªå¿«é示ä¾å¼å§æ¢ç´¢ã
-
å建å¦ä¸ä¸ªæ°çç®å HTML 页é¢ï¼å¤å¶æä»¬çç®å模æ¿ï¼ï¼å¹¶å°å ¶å½å为
memory.htmlãå¨é¡µé¢ä¸æ·»å ä¸ä¸ª<script></script>å ç´ ã -
ç°å¨å¨èæ¬é¡¶é¨æ·»å 以ä¸ä¸è¡ï¼ä»¥å建å åå®ä¾ï¼
jsconst memory = new WebAssembly.Memory({ initial: 10, maximum: 100 });åå§åæå¤§çå使¯ WebAssembly 页ââè¿äºé¡µç大å°åºå®ä¸º 64KBãè¿æå³çä¸è¿°å åå®ä¾çåå§å¤§å°ä¸º 640KBï¼æå¤§å¤§å°ä¸º 6.4MBã
WebAssembly å åéè¿ç®åå°æä¾ä¸ä¸ªè¿å ArrayBuffer çç¼å²åº getter / setter æ¥æ¾ç¤ºå®çåèãä¾å¦ï¼è¦ç´æ¥å° 42 åå ¥çº¿æ§å åç第ä¸ä¸ªåè¯ï¼ä½ å¯ä»¥è¿æ ·åï¼
jsconst data = new DataView(memory.buffer); data.setUint32(0, 42, true);éè¦æ³¨æè¿éçåæ°
true强å¶è¦æ±ä½¿ç¨å°ç«¯åºè¿è¡è¯»åï¼å 为 WebAssembly çå åæ»æ¯å°ç«¯åºçãä½ ä¹å¯ä»¥è¿æ ·åæ¥è·ååæçå¼ï¼jsdata.getUint32(0, true); -
ç°å¨å°è¯è¿ä¸ªæ¼ç¤ºââä¿åç®åä¸ºæ¢æ·»å çå 容ï¼å°å ¶å è½½å°æµè§å¨ä¸ï¼ç¶åå°è¯å¨ JavaScript æ§å¶å°ä¸è¾å ¥ä¸è¿°ä¸¤è¡ã
å¢å å å
å
åå®ä¾ç大å°å¯ä»¥éè¿ Memory.prototype.grow() æ¥å¢å ï¼å次以 WebAssembly 页为å使å®åæ°ï¼
memory.grow(1);
妿å¨å建å
åå®ä¾æ¶æä¾äºæå¤§å¼ï¼åå°è¯è¶
è¿æ¤æå¤§å¼å°æåº RangeError å¼å¸¸ã弿å©ç¨è¿ä¸ªæä¾çä¸éæ¥æåé¢çå
åï¼è¿æ ·å¯ä»¥ä½¿è°æ´å¤§å°æ´ææçã
注æï¼ç±äº ArrayBuffer ç byteLength æ¯ä¸å¯åçï¼æä»¥å¨æåæ§è¡ Memory.prototype.grow() æä½ä¹åï¼ç¼å²åº getter å°è¿åä¸ä¸ªæ°ç ArrayBuffer 对象ï¼å¸¦æä¸ä¸ªæ°ç byteLengthï¼ï¼åæ¶ä»»ä½å
åç ArrayBuffer 对象é½å°è¢«âåç¦»å¼æ¥âï¼æè
说ä¸å
åæåçåºå±å
åæå¼è¿æ¥ã
å彿°ä¸æ ·ï¼çº¿æ§å
åå¯ä»¥å¨æ¨¡åå
é¨è¿è¡å®ä¹æè
导å
¥ã类似å°ï¼æ¨¡åè¿å¯ä»¥å¯éå°å¯¼åºå
¶å
åãè¿è¿æå³ç JavaScript å¯ä»¥éè¿å建ä¸ä¸ªæ°ç WebAssembly.Memory å¹¶å°å
¶ä½ä¸ºå¯¼å
¥æéè¿æ¥æ¶å
å导åºä¼ éç» WebAssembly å®ä¾çå
åæ¥è®¿é®ï¼éè¿ä½¿ç¨ Instance.prototype.exportsï¼ã
æ´å¤æçå å示ä¾
让æä»¬éè¿çä¸ä¸ªæ´å¤æçå å示ä¾ââä¸ä¸ªå¯¹æ´æ°æ°ç»è¿è¡æ±åç WebAssembly 模åââæ¥æç¡®ä¸é¢çæ¦å¿µãä½ å¯ä»¥å¨ memory.wasm 䏿¾å°ç¤ºä¾ã
-
ååé¢é£æ ·å¨ç¸åçç®å½ä¸å¤å¶ä¸ä»½
memory.wasmã夿³¨ï¼ä½ å¯ä»¥å¨ memory.wat æ¾å°æ¨¡åçææ¬è¡¨ç¤ºå½¢å¼ã
-
åå°ä½ çç¤ºä¾æä»¶
memory.htmlï¼ååé¢é£æ ·è·åãç¼è¯åå®ä¾åä½ ç wasm 模åââå¨ä½ çèæ¬ä»£ç åºé¨å å ¥ä¸é¢ç代ç ï¼jsWebAssembly.instantiateStreaming(fetch("memory.wasm"), { js: { mem: memory }, }).then((results) => { // å¨è¿éæ·»å 代ç }); -
å 为该模å导åºäºå®çå åï¼ç»å®è¯¥æ¨¡åçä¸ä¸ªå®ä¾ï¼æä»¬å¯ä»¥ä½¿ç¨ä¸ä¸ªå¯¼åºå½æ°
accumulate()å¨è¯¥æ¨¡åå®ä¾ç线æ§å åï¼memï¼ä¸å建åå¡«å ¥ä¸ä¸ªè¾å ¥æ°ç»ãå¨å颿æçå°æ¹å å ¥å¦ä¸ä»£ç ï¼jsconst summands = new DataView(memory.buffer); for (let i = 0; i < 10; i++) { summands.setUint32(i * 4, i, true); } const sum = results.instance.exports.accumulate(0, 10); console.log(sum);
注ææä»¬æ¯å¦ä½å¨å
å对象çç¼å²åºï¼Memory.prototype.bufferï¼ä¸ï¼è䏿¯å¨å
å对象æ¬èº«ä¸å建 DataView è§å¾çã
å åå¯¼å ¥ä¸å½æ°å¯¼å ¥å¾åï¼åªæ¯å å对象åä»£äº JavaScript 彿°ä½ä¸ºäºä¼ å ¥å¼ãå åå¯¼å ¥å¨ä¸é¢ä¸¤æ¹é¢å¾æç¨ï¼
- å®ä»¬å 许 JavaScript 卿¨¡åç¼è¯ä¹åæè åæ¶è·ååå建å åçåå§å 容ã
- å®ä»¬å 许ä¸ä¸ªåä¸çå å对象被å¤ä¸ªæ¨¡åå®ä¾å¯¼å ¥ï¼å¯¹äºå®ç° WebAssembly 卿龿¥æ¥è¯´ï¼è¿æ¯ä¸ä¸ªå ³é®çæå»ºæ¨¡åã
夿³¨ï¼ä½ å¯ä»¥å¨ memory.htmlï¼æå®æ¶è¿è¡ï¼ä¸æ¾å°æä»¬ç宿´ç¤ºä¾ã
表
WebAssembly 表æ¯ä¸ä¸ªå¯å大å°ç带类åçå¼ç¨æ°ç»ï¼å ¶ä¸çå¼ç¨å¯ä»¥è¢« JavaScript å WebAssembly 代ç ååãç¶èï¼å åæä¾çæ¯ä¸ä¸ªå¯å大å°ç带类åçåå§åèæ°ç»ãæä»¥ï¼æå¼ç¨åå¨å¨å å䏿¯ä¸å®å ¨ãç±äºå®å ¨ãå¯ç§»æ¤æ§åç¨³å®æ§çåå ï¼ä½ä¸ºå¼æä¿¡ä»»çå¼ç¨å¼æ¯åä¸ä¸è½è¢«ç´æ¥è¯»åçã
表æä¸ä¸ªå ç´ ç±»åï¼å ¶éå¶äºå¯ä»¥åå¨å¨è¡¨çå¼ç¨ç±»åãå¨å½åç WebAssembly çæ¬ä¸ï¼åªæä¸ç§ WebAssembly ä»£ç æéè¦çå¼ç¨ç±»åââ彿°ââä¹å°±æ¯å¯ä¸åæ³çå ç´ ç±»åãå¨å°æ¥ççæ¬ä¸ï¼æ´å¤çå ç´ ç±»åä¼è¢«å å ¥ã
彿°å¼ç¨å¯¹äºç¼è¯è¯¸å¦ C/C++ è¿ç±»æ¥æå½æ°æéçè¯è¨æ¥è¯´æ¯å¿ è¦çãå¨ C/C++ çåçå®ç°ä¸ï¼å½æ°æéæ¯éè¿å½æ°ä»£ç å¨è¿ç¨çèå°å空é´çåå§å°å表示çï¼å¹¶ä¸ç±äºå颿å°çå®å ¨åå ï¼å®æ¯ä¸è½è¢«ç´æ¥åå¨å¨çº¿æ§å åä¸çãåè代ä¹çæ¯ï¼å½æ°å¼ç¨è¢«åå¨å¨è¡¨ä¸ãå®ä»¬çæ´æ°ç´¢å¼å¯ä»¥åå¨å¨çº¿æ§å åä¸å¹¶è¿è¡ä¼ éã
å½è°ç¨ä¸ä¸ªå½æ°æéçæ¶åï¼WebAssembly è°ç¨å½æ°æä¾ç´¢å¼ãå¨è¿è¡ç´¢å¼åè°ç¨ç´¢å¼å°ç彿°å¼ç¨ä¹åï¼å¯ä»¥å¯¹è¯¥ç´¢å¼è¿è¡è¡¨çå®å ¨è¾¹çæ£æ¥ãå èï¼ç®åç表æ¯ä¸ä¸ªç¸å½åºå±çç¨æ¥å®å ¨å°åå¯ç§»æ¤å°ç¼è¯åºå±ç¼ç¨è¯è¨ç¹æ§çåºæ¬ç±»åã
表å¯ä»¥éè¿ Table.prototype.set() å Table.prototype.grow() è¿è¡æ´æ¹ï¼å®ä»¬ä¼æ´æ°è¡¨ä¸çä¸ä¸ªå¼åå¢å å¯ä»¥åå¨å¨è¡¨ç大å°ãè¿å
è®¸é´æ¥å¯è°ç¨å½æ°éåå¯ä»¥éçæ¶é´èæ¹åï¼å
¶å¯¹äºå¨æé¾æ¥ææ¯æ¥è¯´æ¯å¿
è¦çãè¿äºæ´æ¹å¯¹äº JavaScript å wasm æ¨¡åæ¥è¯´æ¯ç«å³çæçãåæ¶ï¼å¨ JavaScript å¯ä»¥éè¿ Table.prototype.get() å¾å°ææ°å¼ã
表示ä¾
让æä»¬çä¸ä¸ªç®åç表示ä¾ââä¸ä¸ª WebAssembly 模åï¼è¯¥æ¨¡åå建并导åºäºä¸ä¸ªå¸¦æä¸¤ä¸ªå ç´ ç表ï¼å ç´ 0 è¿å 13ï¼å ç´ 1 è¿å 42ãä½ å¯ä»¥å¨ table.wasm 䏿¾å°è¯¥ç¤ºä¾ã
-
å¨ä¸ä¸ªæ°çç®å½ä¸å¤å¶ä¸ä»½ table.wasmã
夿³¨ï¼ä½ å¯ä»¥å¨ table.wat 䏿¥ç模åçææ¬è¡¨ç¤ºã
-
å建ä¸ä»½ HTML 模æ¿çæ°å¯æ¬å¹¶å°å ¶å½å为
table.html. -
å¦åæç¤ºï¼è·åãç¼è¯å¹¶ä¸å®ä¾åä½ ç wasm 模åââå°ä¸é¢çä»£ç æ¾å ¥å° HTML body åºé¨ç
<script>èç¹éé¢ï¼jsWebAssembly.instantiateStreaming(fetch("table.wasm")).then((results) => { // å¨è¿éæ·»å 代ç }); -
ç°å¨ï¼è®©æä»¬è·å表ä¸çæ°æ®ââå°ä¸é¢çä»£ç æ¾å ¥å°æå®çä½ç½®ï¼
jsconst tbl = results.instance.exports.tbl; console.log(tbl.get(0)()); // 13 console.log(tbl.get(1)()); // 42
è¿æ®µä»£ç è·åè·åäºåå¨å¨è¡¨ä¸çæ¯ä¸ä¸ªå½æ°å¼ç¨ï¼ç¶åå®ä¾åå®ä»¬ä»èå°å®ä»¬æ¥æç弿å°å°æ§å¶å°ââæ³¨ææ¯ä¸ä¸ªå½æ°å¼ç¨æ¯å¦ä½ä½¿ç¨ Table.prototype.get() 彿°è·åçï¼å¨å
¶åé¢è¿è¦å ä¸å¯¹å°æ¬å·æå¯ä»¥çæ£çè°ç¨è¯¥å½æ°è·åå°ä¿¡æ¯ã
夿³¨ï¼ä½ å¯ä»¥å¨ table.htmlï¼æå®æ¶æ¥çè¿è¡ï¼æ¾å°æä»¬å®æ´ç示ä¾ã
å ¨å±åé
WebAssembly è½å¤å建å
¨å±åéå®ä¾ï¼è¿äºå®ä¾æ¢å¯ä» JavaScript 访é®ï¼ä¹å¯å¨ä¸ä¸ªæå¤ä¸ª WebAssembly.Module å®ä¾ä¸å¯¼å
¥/导åºãè¿é常æç¨ï¼å 为å®å
è®¸å¨æå°é¾æ¥å¤ä¸ªæ¨¡åã
è¦å¨ JavaScript ä¸å建 WebAssembly å
¨å±å®ä¾ï¼ä½ éè¦ä½¿ç¨ WebAssembly.Global() æé 彿°ï¼å¦ä¸æç¤ºï¼
const global = new WebAssembly.Global({ value: "i32", mutable: true }, 0)ï¼
å¯ä»¥çå°ï¼å®æ¥åä¸¤ä¸ªåæ°ï¼
-
ä¸ä¸ªå¯¹è±¡ï¼å ¶ä¸å å«æè¿°å ¨å±åéçä¸¤ä¸ªå±æ§ï¼
valueï¼å®çæ°æ®ç±»åï¼å¯ä»¥æ¯ WebAssembly æ¨¡åæ¥åç任使°æ®ç±»åââi32ãi64ãf32æf64ãmutableï¼å¸å°å¼ï¼æç¤ºå¼æ¯å¦å¯åã
-
å å«åéå®é å¼çå¼ãå®å¯ä»¥æ¯ä»»ä½å¼ï¼åªè¦ç±»å符åæå®çæ°æ®ç±»åã
é£ä¹æä»¬è¯¥å¦ä½ä½¿ç¨å¢ï¼å¨ä¸é¢ç示ä¾ä¸ï¼æä»¬å°å
¨å±åéå®ä¹ä¸ºå¯åç i32 ç±»åï¼å
¶å¼ä¸º 0ã
ç¶åæ¹åå
¨å±åéçå¼ãé¦å
ä½¿ç¨ Global.value 屿§å°å
¶å¼æ¹ä¸º 42ï¼ç¶å使ç¨ä» global.wasm 模å导åºç incGlobal() 彿°å°å
¶å¼æ¹ä¸º 43ï¼æ 论ç»å®çæ¯ä»ä¹å¼ï¼è¯¥å½æ°é½ä¼å 1ï¼ç¶åè¿åæ°å¼ï¼ã
const output = document.getElementById("output");
function assertEq(msg, got, expected) {
const result =
got === expected
? `SUCCESS! Got: ${got}\n`
: `FAIL!\nGot: ${got}\nExpected: ${expected}\n`;
output.innerText += `Testing ${msg}: ${result}`;
}
assertEq("WebAssembly.Global exists", typeof WebAssembly.Global, "function");
const global = new WebAssembly.Global({ value: "i32", mutable: true }, 0);
WebAssembly.instantiateStreaming(fetch("global.wasm"), { js: { global } }).then(
({ instance }) => {
assertEq(
"getting initial value from wasm",
instance.exports.getGlobal(),
0,
);
global.value = 42;
assertEq(
"getting JS-updated value from wasm",
instance.exports.getGlobal(),
42,
);
instance.exports.incGlobal();
assertEq("getting wasm-updated value from JS", global.value, 43);
},
);
夿³¨ï¼ä½ å¯ä»¥æ¥çå¨ GitHub ä¸å®æ¶è¿è¡çå®ä¾åå ¶æºä»£ç ã
夿 ·æ§
ç°å¨ï¼æä»¬å·²ç»å±ç¤ºäº WebAssembly ç主è¦ç»ææ¨¡åç使ç¨ï¼æä»¬åºè¯¥ç°å¨æèµ·å¤æ ·æ§è¿ä¸æ¦å¿µï¼è¿è½ä¸º WebAssembly æä¾äºå¤§éçå ³äºæ¶ææççä¼å¿ï¼
- ä¸ä¸ªæ¨¡åå¯ä»¥æ N 个å®ä¾ï¼è¿ä¸ä¸ä¸ªå½æ°å¯ä»¥äº§ç N 个éå å¼ä¸æ ·ã
- ä¸ä¸ªæ¨¡åå®ä¾å¯ä»¥ä½¿ç¨ 0-1 个å åå®ä¾ï¼å®ä¸ºè¿ä¸ªå®ä¾æä¾äºâå°å空é´âãå°æ¥ç WebAssembly çæ¬å¯è½å 许æ¯ä¸ªæ¨¡åå®ä¾æ¥æ 0-N 个å åå®ä¾ï¼åèå¤å åå®ä¾ï¼ã
- ä¸ä¸ªæ¨¡åå®ä¾å¯ä»¥ä½¿ç¨ 0-1 个表å®ä¾ââè¿æ¯è¯¥å®ä¾çâ彿°å°å空é´âï¼å¯ä»¥ç¨æ¥å®ç° C 彿°æéãå°æ¥ç WebAssembly çæ¬å¯è½å 许æ¯ä¸ªæ¨¡åå®ä¾æ¥æ 0-N 个表å®ä¾ã
- ä¸ä¸ªå åæè¡¨å®ä¾è½å¤è¢« 0-N 个模åå®ä¾ä½¿ç¨ââè¿äºå®ä¾å ¨é¨å ±äº«ç¸åçå°å空é´ï¼è¿ä½¿å¾å¨æé¾æ¥æä¸ºå¯è½ã
ä½ å¯ä»¥å¨æä»¬ççè§£ææ¬æ ¼å¼ä¸æä¸çå°å¤æ ·æ§çåºç¨ââåè§æ¹å表å卿龿¥é¨åã
æ»ç»
æ¬æå¸¦ä½ äºè§£äºä½¿ç¨ WebAssembly ç JavaScript API çåºæ¬ç¥è¯ï¼å æ¬å¨ JavaScript ä¸ä¸æä¸å¯¼å ¥ä¸ä¸ª WebAssembly 模åã使ç¨è¯¥æ¨¡åç彿°ä»¥åå¨ JavaScript ä¸ä½¿ç¨ WebAssembly çå åå表ãåæ¶ï¼æä»¬ä¹ä»ç»äºå¤æ ·æ§çæ¦å¿µã
åè§
- webassembly.org
- WebAssembly æ¦å¿µ
- Mozilla Research ä¸ç WebAssembly