← back

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.

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 linker dependency)