Pular para o conteúdo

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.

01-emit-wasm.zolo
Playground
// 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.

Buscar no Zolo

9 resultados

enespt-br