Coming from Zig
Tape and Zig are the most philosophically aligned — comptime over generics, explicit over implicit, no hidden allocations. The differences are in scope and target domain.
comptime
Zig
comptime keyword on params/blocks. Type is a first-class value. Generates code implicitly during instantiation.
Tape
@tape {} blocks run at compile time. @emit injects declarations explicitly. Every specialization is visible at the call site.
UI & components
Zig
No built-in UI model. Use C libraries (SDL, raylib) via @cImport. UI is purely a library concern.
Tape
Components are in the language: component, prop, event, view {}. Compiler generates vtables and handles lifecycle.
source structure
Zig
One language, one syntax everywhere. Tests via test "name" {} inline.
Tape
Source regions: #code, #view, #style, #test. Each has its own parser optimized for its domain. All emit the same TAC IR. #style is not yet implemented.
profiles
Zig
One mode. Freestanding or with std. You configure the allocator and target.
Tape
Three profiles per module: t0 (kernel/freestanding), t1 (typed apps), t2 (scripting with optional GC). Mix them in one project.
what stays the same
- - Comptime replaces generics — same philosophy
- - No hidden allocations, explicit allocators in low-level code
- - No exceptions — error returns with explicit propagation
- - No hidden control flow (no operator overloading, no RAII)
- - Single-binary toolchain — no external assembler or linker to build an executable