WebAssembly

44.1 Freestanding WASM (Browser)

// math.zig
export fn add(a: i32, b: i32) i32 { return a + b; }

var buffer: [1024]u8 = undefined;
export fn getBufferPtr() [*]u8 { return &buffer; }

extern "env" fn consoleLog(ptr: [*]const u8, len: usize) void;   // imported from JS
export fn greet() void {
    const msg = "Hello from Zig/WASM";
    consoleLog(msg.ptr, msg.len);
}
zig build-exe math.zig -target wasm32-freestanding -fno-entry -rdynamic -O ReleaseSmall
const { instance } = await WebAssembly.instantiateStreaming(fetch("math.wasm"), {
  env: { consoleLog: (ptr, len) => console.log(new TextDecoder().decode(
      new Uint8Array(instance.exports.memory.buffer, ptr, len))) }
});
console.log(instance.exports.add(2, 3));

44.2 WASI

std.heap.wasm_allocator, @wasmMemoryGrow. Zig produces very small WASM modules.

Used for plugins (e.g., Extism/Zig PDK), edge functions, and games.

zig build-exe app.zig -target wasm32-wasi
wasmtime app.wasm