Emitir Wasm
En esta página
La flag --emit wasm instruye al compilador a generar un módulo .wasm en
lugar del binario nativo. En el modo predeterminado (VM-embedded) el
resultado es un único archivo que incluye la VM Zolo junto con tu bytecode;
las capacidades de I/O son provistas por el host-shim ABI — funciones
importadas que el runtime WASI o el loader JS inyectan en el momento de la
instanciación.
El comando básico:
zolo build 32-webassembly/01-emit-wasm.zolo --emit wasm
# -> target/01-emit-wasm-0.0.0.wasm
El programa más sencillo posible en wasm es un fn main() que llama a print:
Módulo VM-embedded mínimo; print es el único I/O wasm-seguro hoy.
// 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!
Requiere la CLI o el host de Zolo; ábrelo en el playground o ejecútalo localmente.
Superficie wasm-segura actual: solo std::os funciona dentro de un módulo
wasm. Los módulos crypto, log, datetime, fs e io aún generan pánico
al ser llamados, y process.open() entra en pánico al inicio por depender de
Instant::now(). Por ahora, mantén los programas wasm limitados a cálculos
puros y print.
El modo AOT también ejecuta este programa de principio a fin:
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!
Desafío
Añade una segunda llamada a print con el resultado de una operación
aritmética simple (ej.: 2 + 2) y recompila con --emit wasm. Confirma
que el .wasm generado ejecuta las dos líneas en orden.
Consulta también