zig cc
(即
clang
)在ZIG版本上编译为WASM 0.13.0-DEV.351+64EF45EB0,使用macos Sequoia 15.0.1(aarch64)上的clang 16.0.0(aarch64)。
这是我迄今为止写的代码:resource.c
#include <stdlib.h>
void print_test(void); // the function I want to use
const unsigned char heap[4096];
int __attribute__((export_name("memstart")))
memstart() {
return (int)&heap;
}
int __attribute__((export_name("return5")))
return5(int p) {
return 5 * p;
}
int __attribute__((export_name("entryAt")))
entryAt(int p) {
print_test();
return heap[p];
}
<!DOCTYPE html>
<html lang="en">
<head>
<title>For Stephen</title>
</head>
<body>
<input id="input" type="number" placeholder="int param..."></input>
<input id="bytes" placeholder="bytes..."></input>
<pre id="output">output goes gere</pre>
<button id="button_r5">Return 5</button>
<button id="button_nth">Get nth byte</button>
<canvas id="my_canvas"></canvas>
<script>
const c = {};
const encoder = new TextEncoder();
const decoder = new TextDecoder();
const importObject = {
"env": {
"print_test": () => console.log("test print")
}
};
WebAssembly.instantiateStreaming(fetch("resource.wasm", importObject))
.then(result => {
const {memory, memstart, return5, entryAt} = result.instance.exports;
console.log(memstart);
c.buffer = new Uint8Array(memory.buffer, memstart());
c.return5 = return5;
c.entryAt = entryAt;
});
const button_r5 = document.getElementById("button_r5");
const button_nth = document.getElementById("button_nth");
const input = document.getElementById("input");
const bytes = document.getElementById("bytes");
const output = document.getElementById("output");
button_r5.addEventListener("click", ()=>{
output.textContent = c.return5(input.value);
});
button_nth.addEventListener("click", ()=>{
c.buffer.set(encoder.encode(bytes.value));
output.textContent = c.entryAt(input.value);
});
</script>
</body>
</html>
构建命令
zig cc -target wasm32-freestanding -g resource.c -lc -Wl,--no-entry -o resource.wasm
您可以使用一些属性从JavaScript导入功能,这将取决于编译器。
EM_IMPORT(NAME)
。相当于
__attribute__((import_module("env"), import_name(#NAME)))
)。考虑Zig还使用LLVM,您也可以使用相同的属性:
__attribute__((import_module("env"), import_name("print_test"))) void print_test();
,如果它不起作用(也许它不使用Zig编译器),您可能还有其他口味:
void print_test() __attribute__((
__import_module__("env"),
__import_name__("print_test")
));
__attribute__((__import_name__("print_test"))) void print_test();
基于其他语言/编译器,例如swiftwasm和
.net-nativellvm(全部基于LLVM)。