The target matrix

One source. Four outputs.
Every step visible.

Readable C. Go source. Portable ZX. WebAssembly. Follow a real program through the shared checker, inspect its intermediate representation, and compare what each target produces.

.zi Source.zir Checked IR.c · .go · .zx · .wasm Four outputs

Explore the outputs

Pick a program. Open any cell.

Choose a platform, then open any output.

Example programs compiled to four targets
Same .zi sourceCzi2cGozi2goZXzi2zx · VMWebAssemblyzi2wasm
Records & callsscore.ziVerified1.2 nsVerified1.3 nsVerified974.4 nsVerified74.3 ns
Text & importstext_demo.ziVerified5.1 nsVerified4.1 nsVerified2.03 µsVerified89.5 ns
Arrays & slicesarrays.ziVerified414.7 nsVerified3.51 µsVerified3.65 µsVerified15.75 µs
Enums & branchesenums.ziVerified148.1 nsVerified2.01 µsVerified2.51 µsVerified4.30 µs
Loops & collectionsloops.ziVerified726.2 nsVerified8.63 µsVerified4.35 µsVerified17.83 µs

Scroll across to compare all four outputs →

Median warm execution per entry, excluding 1.5×IQR outliers. Checked IR is a shared stage and has no execution time. Emission timings come from the desktop build host.

Inside the compiler

Records & calls

Expected result: 42
Download .zi ↓

The exact source used for every target in this row.

Score :: struct {
    value: s32;
    bonus: s32;
}

Total :: (score: Score) -> s32 {
    return score.value + score.bonus;
}

Answer :: () -> s32 {
    score: Score = Score.{value = 40, bonus = 2};
    return Total(score);
}

Desktop · Kryon

Real widgets, two frames at a time.

Button activation, text layout and UTF-8 input editing through public Kryon APIs. Includes paint-command generation with recorded output; excludes pixel rasterization and OS I/O.

Desktop widget scenarios compiled to C, Go and portable ZX
Two-frame scenarioCcc -O2GonativeZXportable VM
ButtonVerified1.90 µsVerified3.04 µsVerified606.53 µs
TextVerified2.08 µsVerified2.55 µsVerified639.79 µs
InputVerified2.71 µsVerified4.51 µsVerified864.04 µs

Median warm time on desktop, nine batches with 1.5×IQR outliers excluded. Open a cell to download its actual compiler output. Raw measurements and exclusions · Source fixtures · Complete checked IR

Measured, with context

Know what the numbers mean.

All four targets reproduce the independently checked return value or printed output of each source. Compare target behavior and costs on these small programs; the figures describe this run and its host.

Execution

Median warm time after 150 ms of warmup and calibrated batches, excluding symmetric 1.5×IQR outliers. Raw samples and exclusions remain downloadable. Loading, startup, downloads and offline compilation are excluded. Output is verified before timing; formatting and runtime-specific output to a null sink or browser callback remain included. Tiny programs emphasize call and I/O overhead.

Emission

Loading, checking, linking and writing the selected output on the desktop build host. C uses cc -O2 and Go uses go build afterward; those downstream build costs are excluded from emission. ZIR is inspected, not executed.

Size & coverage

Size means emitted files, including C headers and imported modules, rather than linked executable size. ZX uses the portable VM on every platform. WebAssembly runs in V8 on desktop and web, and WAMR AOT on the USB Android phone. Web C uses Emscripten; web Go uses its js/wasm runtime.

The snapshot includes the host, compiler hashes, revision, tool versions and every sample.

Run the benchmark yourself
make
build-queue -- python3 scripts/site_target_platforms.py --rebuild-outputs --serial USB_DEVICE_SERIAL --samples 5
python3 scripts/site_targets.py --check

Shared host, warm filesystem caches, no CPU isolation. Small examples emphasize call, output and runtime overhead. These measurements are not language rankings or evidence of full target parity.

Read current support → · The ZIR format → · WebAssembly execution tier →

Real workloads

JSON and UTF-8 on Alpha

Compare the same Ziran source across four targets. Inputs are prepared once during warmup; parsing, decoding, output allocation and result validation remain in each call.

Median time per operation on Alpha
Workload and sourceCGoZXWasm · V8
JSON string scan · 16 KiB1.44 µs71.82 µs2.12 msUnavailable
JSON parse · 16 KiB string1.77 µs76.98 µs2.85 msUnavailable
JSON parse · 128 escaped Unicode objects30.95 µs753.40 µs13.28 msUnavailable
JSON write · 256 mixed Unicode strings14.13 µs45.56 µs3.77 msUnavailable
JSON write · 64 KiB ASCII string10.25 µs470.16 µs13.25 msUnavailable
UTF-8 · scan, search, replace and split · 18 KiB148.39 µs94.39 µs30.25 msUnavailable

alpha · Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz · 2026-11-11 · 11 batches per target. Symmetric 1.5×IQR filtering; every batch checks its result. Process startup, offline compilation and loading are excluded. Wasm uses Node/V8; these are target comparisons, not JavaScript-source comparisons. Unavailable cells retain the compiler diagnostic and have no timing. Raw samples, excluded indices, compiler hashes and outputs ↓