Saltar al contenido

Flags --emit

En esta página

zolo build recorre un pipeline completo por defecto:

.zolo ──parse/typeck──▶ AST ──lower──▶ ZoloIR ──Cranelift──▶ .o ──link──▶ binario
                                        │ --emit ir           │ --emit obj   (defecto)

El flag --emit permite detenerse en cualquier etapa intermedia.

--emit ir

--emit ir imprime la representación intermedia textual (ZoloIR) en stdout en lugar de producir un binario. Nada se escribe en disco. Útil para entender cómo se baja una construcción antes del codegen o para depurar el compilador:

zolo build --emit ir muestra el ZoloIR de la función double y de la llamada a print.

02-emit-ir.zolo
Playground
// Feature: inspect ZoloIR — `zolo build --emit ir`

// Syntax: `zolo build file.zolo --emit ir`

// When to use: see the intermediate representation the native backend

//   lowers to before codegen — handy for debugging codegen or learning

//   how a construct compiles.


// Run:

//   zolo build 30-compilation/02-emit-ir.zolo --emit ir

//

// `--emit ir` prints the textual ZoloIR to stdout instead of producing

// a binary. Nothing is written to disk.


fn double(n: int) -> int {
  return n * 2
}

print(double(21))

// Abbreviated IR for the `print(double(21))` call:

//

//   ; ZoloIR Module

//   ; String pool:

//   ;   s0 = "print"

//   fn @__entry() -> val {

//     entry:

//       %0 = get_global "print"

//       %1 = call @double(21)

//       %2 = call %0(%1)

//       return

//   }

//

// expected (when run normally): 42

Requiere la CLI o el host de Zolo; ábrelo en el playground o ejecútalo localmente.

--emit obj

--emit obj compila el código hasta el archivo objeto (.o/.obj) y se detiene antes de la etapa de enlazado — no se produce ningún ejecutable. El archivo se escribe junto al fuente. Útil para integración con toolchains externas y experimentos de FFI:

zolo build --emit obj escribe 03-emit-obj.o y termina antes del enlazado.

03-emit-obj.zolo
Playground
// Feature: object file without linking — `zolo build --emit obj`

// Syntax: `zolo build file.zolo --emit obj`

// When to use: produce a `.o`/`.obj` to hand to an external linker, or

//   to inspect the generated machine code without a full link step.


// Run:

//   zolo build 30-compilation/03-emit-obj.zolo --emit obj

//   # -> Wrote 03-emit-obj.o

//

// `--emit obj` writes the compiled object file next to the source and

// stops before linking — no executable is produced. Useful for FFI

// experiments and toolchain integration.


let xs = [1, 2, 3, 4]
var total = 0
for x in xs {
  total += x
}
print("sum =", total)

// expected (when run): sum =	10

Requiere la CLI o el host de Zolo; ábrelo en el playground o ejecútalo localmente.

Desafío

Usa --emit ir en el ejemplo de 03-emit-obj.zolo y observa cómo aparece el bucle for en el IR. ¿En qué se diferencia de una llamada a función normal?

Buscar en Zolo

9 resultados

enespt-br