← back

Coming from Go

Tape shares Go's commitment to simplicity and fast compilation. The biggest differences: no GC in t0/t1, no goroutines, and UI is a first-class concern.

generics / code generation

Go

Resisted generics for years, added them in 1.18. go generate for code gen.

Tape

Never adding generics. @tape {} is built-in code generation — same language, runs at compile time, type-safe.

concurrency

Go

Goroutines + channels. M:N scheduling. Lightweight, implicit.

Tape

Explicit thread declarations with typed events and on_done callbacks. No scheduler magic. You see every thread boundary.

memory

Go

GC handles everything. Escape analysis decides heap vs stack. No manual free.

Tape

Manual memory in t0. In t1 the compiler frees strings and other owned values at scope exit, with no GC. t2 scripts allocate from an arena, with a simple GC for long-running ones.

error handling

Go

val, err := foo() then if err != nil. Verbose, easy to forget.

Tape

let val = foo() or return — one line. Compiler won't let you ignore the error.

what stays the same

  • - Fast compilation (single binary compiler)
  • - No inheritance, composition over hierarchy
  • - Structural interfaces (has .next()? iterable)
  • - Produces a single executable (GUI programs ship their UI libraries beside it)