Emitir Wasm
Nesta página
A flag --emit wasm instrui o compilador a gerar um módulo .wasm em vez do
binário nativo. No modo padrão (VM-embedded) o resultado é um único
arquivo que inclui a VM Zolo em conjunto com o seu bytecode; capacidades de
I/O são fornecidas pelo host-shim ABI — funções importadas que o runtime
WASI ou o loader JS injetam no momento da instanciação.
O comando básico:
zolo build 32-webassembly/01-emit-wasm.zolo --emit wasm
# -> target/01-emit-wasm-0.0.0.wasm
O programa mais simples possível em wasm é um fn main() que chama print:
Módulo VM-embedded mínimo; print é o único I/O wasm-seguro hoje.
// Feature: WebAssembly output — `zolo build --emit wasm`
// Syntax: `zolo build file.zolo --emit wasm`
// When to use: run Zolo inside a WASM host (WASI runtime, or a browser
// via the generated JS glue).
// Run:
// zolo build 32-webassembly/01-emit-wasm.zolo --emit wasm
// # -> Built target/01-emit-wasm-0.0.0.wasm (...)
//
// By default this emits a VM-embedded module under the host-shim ABI:
// the Zolo VM + your bytecode are packaged into one `.wasm`, and host
// capabilities (I/O, etc.) are provided through imported shim functions.
// Default host profile is `wasi` (see 02 for `--host browser` / `--aot`).
//
// AOT (pure-wasm, no embedded VM) now executes this program end-to-end:
// zolo build 32-webassembly/01-emit-wasm.zolo --emit wasm --aot --host browser -o target/aot/01.wasm
// node crates/zolo-wasm-aot/tests/run_wasm.mjs target/aot/01.wasm
// # -> Hello from WebAssembly!
fn main() {
print("Hello from WebAssembly!")
}
// Heads-up (wasm-safe surface, current state): only `std::os` is
// wasm-safe today. crypto / log / datetime / fs / io still panic when
// called inside wasm, and `process.open()` panics at boot via
// `Instant::now()`. Keep wasm programs to plain compute + `print` for now.
//
// expected (run natively): Hello from WebAssembly!
Requer a CLI/host do Zolo — abra no playground ou rode localmente.
Superfície wasm-segura atual: apenas std::os funciona dentro de um
módulo wasm. Os módulos crypto, log, datetime, fs e io ainda
entram em pânico ao serem chamados, e process.open() pânica na
inicialização por depender de Instant::now(). Por enquanto, mantenha os
programas wasm restritos a cálculos puros e print.
O modo AOT também executa este programa do início ao fim:
zolo build 32-webassembly/01-emit-wasm.zolo --emit wasm --aot --host browser \
-o target/aot/01.wasm
node crates/zolo-wasm-aot/tests/run_wasm.mjs target/aot/01.wasm
# -> Hello from WebAssembly!
Desafio
Adicione uma segunda chamada print com o resultado de uma operação
aritmética simples (ex.: 2 + 2) e recompile com --emit wasm. Confirme
que o .wasm gerado executa as duas linhas em ordem.
Veja também