Spec-First, Always
Before writing a compiler, the Voyage team wrote the language down: ten Architecture Decision Records (ADR-0001 through ADR-0010), plus grammar.md, type-system.md, and memory-model.md. The full spec phase is complete and lives on the main branch of voyage-org/voyage-lang (23 commits).
Settled Decisions
- Syntax: Swift-inspired — func/struct/enum/protocol/extension, \(...) interpolation
- Concurrency: fully reentrant actors via lock-free Channel<T>-backed mailbox loops on the CLR ThreadPool
- Safety: atomic{'{}'} blocks with zero-runtime-cost compile-time rules — no await inside, transitive-await detection across the whole compilation unit
- Errors: both typed and untyped throws are supported
- Returns: implicit return for single-expression function bodies only
- Modules: resolve directly against CLR assembly metadata — bidirectional C# interop by construction
- Memory: struct is a CLR value type; class and actor are CLR reference types under a tracing GC, not ARC
- Keywords: defer adopted, weak repurposed, unowned dropped
Parser Strategy
ADR-0010 settles on a hand-written recursive-descent parser, matching Swift's own approach rather than a parser-generator toolchain.
Design Lineage
Voyage's single-runtime, no-FFI stance is a direct response to lessons learned building Nova AI Lang — where bridging two runtimes added friction the language couldn't design its way out of. Voyage avoids that by targeting the CLR alone.