Możesz użyć emscripten do wygenerowania dość minimalnego wyniku kodu.
Rozważmy następujący Trivial File adder.c
:
int adder (int a, int b) {
return a + b;
}
skompilować tak (wymaga dość niedawno emscripten):
emcc -O2 -s WASM=1 -s SIDE_MODULE=1 -o adder.wasm
aby zobaczyć co to generowany, rozbierać go do postaci tekstowej wast korzystania binaryen's wasm-dis
(możesz również użyć wasm2wast od wabt):
wasm-dis adder.wasm -o adder.wast
zdemontowanego źródłowy powinien wyglądać mniej więcej tak:
(module
(type $0 (func (param i32 i32) (result i32)))
(type $1 (func))
(import "env" "memoryBase" (global $import$0 i32))
(import "env" "memory" (memory $0 256))
(import "env" "table" (table 0 anyfunc))
(import "env" "tableBase" (global $import$3 i32))
(global $global$0 (mut i32) (i32.const 0))
(global $global$1 (mut i32) (i32.const 0))
(export "__post_instantiate" (func $2))
(export "runPostSets" (func $1))
(export "_adder" (func $0))
(func $0 (type $0) (param $var$0 i32) (param $var$1 i32) (result i32)
(i32.add
(get_local $var$1)
(get_local $var$0)
)
)
(func $1 (type $1)
(nop)
)
(func $2 (type $1)
(block $label$0
(set_global $global$0
(get_global $import$0)
)
(set_global $global$1
(i32.add
(get_global $global$0)
(i32.const 5242880)
)
)
(call $1)
)
)
;; custom section "dylink", size 5
)
Następnie można uruchomić w tym węźle (lub nowszym) v8.X takiego:
const WA = WebAssembly,
env = {memoryBase: 0,
tableBase: 0,
memory: new WA.Memory({initial: 256}),
table: new WA.Table({initial: 0, element: 'anyfunc'})},
code = new Uint8Array(require('fs').readFileSync('adder.wasm'))
WA.compile(code).then(m => {
return new WA.Instance(m, {env: env})
}).then(i => {
console.log(i.exports._adder(7, 8))
})
pamiętać, że jeśli chcą wspierać kod który używa stosu i/lub pamięci sterty rzeczy stają się bardziej skomplikowane. To znaczy.musisz przynajmniej ustawić bazę pamięci i zadzwonić pod numer __post_instantiate
ze swojego środowiska hosta, zanim zadzwonisz do dowolnego innego eksportu.
Jeśli chcesz zinterpretować kod WebAssembly bez środowiska JavaScript, możesz uruchomić go używając wac/wace (pełne ujawnienie: Stworzyłem ten projekt). Zauważ, że wace
zakłada, że masz zdefiniowaną "_ główną" lub "główną" funkcję.
prawdopodobnie związane pytanie z odpowiedzią - https://stackoverflow.com/questions/45146099/how-do-i-compile-ac-file-to -webassembly –