
Seed: Plan 9 C compiler suite (qc / 6c / 8c / 5c) and linker mechanics.
Central fact: the Plan 9 toolchain has no separate preprocessor pass and no textual assembly stage between source and machine code — the compiler writes directly to a machine-specific intermediate object format, skipping the paper the rest of the world hands between steps.
A conventional C toolchain is a relay race with visible batons: cpp expands macros and includes into a fatter block of text, cc reads that text and emits human-readable assembly, as writes that assembly into an object file, and ld links objects into an executable. Every handoff is a file you could, in principle, read. Plan 9 collapses most of that relay into one machine: 6c (amd64), 5c (ARM), 8c (386) — one compiler per architecture, sharing a common front end — reads C source and writes straight to a numbered object format (.6, .5, .8) without ever materializing an assembly-language intermediate a human was meant to inspect.
The corresponding linkers, 6l and 5l, are not thin gluers of precompiled fragments; they perform global register allocation and dead-code elimination across the whole program at link time, producing a final a.out-format executable with no dynamic linking step left over to resolve at runtime. The toolchain also permits language liberties standard C never granted — anonymous struct and union fields that behave as if inherited into the enclosing type, direct whole-struct assignment — small conveniences that assume the compiler already knows the entire shape of the program, because nothing was hidden from it in a preprocessor pass it never ran.
Every stage most compilers show you in a separate, catchable file, this one keeps in its head.