Bạn có thể sử dụng emscripten để tạo ra đầu ra mã khá nhỏ.
Hãy xem xét các tập tin sau đây tầm thường adder.c
:
int adder (int a, int b) {
return a + b;
}
Compile nó như thế này (yêu cầu một emscripten khá gần đây):
emcc -O2 -s WASM=1 -s SIDE_MODULE=1 -o adder.wasm
Để xem những gì nó tạo ra, tháo rời nó để hình thành văn bản wast sử dụng số nhị phân của wasm-dis
(bạn cũng có thể sử dụng wasm2wast từ wabt):
wasm-dis adder.wasm -o adder.wast
Nguồn tháo rời nên tìm một cái gì đó như thế này:
(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
)
Sau đó, bạn có thể chạy trong nút (v8.X hoặc mới hơn) như thế này:
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))
})
Lưu ý rằng nếu bạn muốn hỗ trợ mã sử dụng ngăn xếp và/hoặc bộ nhớ heap mọi thứ trở nên phức tạp hơn. I E.ít nhất bạn cũng cần phải đặt memoryBase và gọi __post_instantiate
từ môi trường máy chủ của bạn trước khi bạn gọi bất kỳ xuất khẩu nào khác.
Nếu bạn muốn giải thích mã WebAssembly mà không cần môi trường JavaScript, bạn có thể chạy nó bằng cách sử dụng wac/wace (tiết lộ đầy đủ: Tôi đã tạo dự án này). Lưu ý rằng wace
giả sử bạn đã xác định hàm "_main" hoặc "main".
câu hỏi Có thể liên quan với câu trả lời - https://stackoverflow.com/questions/45146099/how-do-i-compile-ac-file-to -webassembly –