§1 Provenance
- TCC (Tiny C Compiler): https://bellard.org/tcc/, mob branch at https://repo.or.cz/tinycc.git, mirror https://github.com/TinyCC/tinycc. Originally by Fabrice Bellard (~2001); since ~2012 maintained by grischka with community contributions through November 2025. Last official release: 0.9.27 (December 2017); the mob branch is the active line.
- chibicc: https://github.com/rui314/chibicc by Rui Ueyama (also author of LLVM lld and 8cc). Educational reference compiler for a book in progress.
- 8cc: https://github.com/rui314/8cc, Ueyama’s older C compiler, archived.
- Cuik: https://github.com/RealNeGate/Cuik, by Yasser Arguelles Snape (“NeGate”). Mastodon: https://mastodon.social/@negate. Active development through 2025; no formal releases yet.
- TB (Cuik’s backend): https://yasserarg.com/tb (referenced in Compiler Explorer request https://github.com/compiler-explorer/compiler-explorer/issues/7995).
§2 Mechanism
TCC: single-pass C99 compiler. Lexes, parses, and emits machine code in one walk of the source. No IR worth speaking of. The emitted code is approximately what you get from gcc -O0: correct, naive, no register allocation beyond a tiny window. The compile speed is the famous number: ~10x faster than GCC -O0 on equivalent input. TCC also implements -run, which JITs source and runs it in-process.
chibicc: pedagogical single-pass C11 compiler. ~10k lines of C. No optimization. Emits assembly (x86_64 SysV only). The author’s stated goal is readability for the accompanying book; chibicc happily compiles itself, Git, SQLite, libpng, and a few hundred thousand lines of real C code, with the catch that “chibicc emits terrible code which is probably twice or more slower than GCC’s output.”
Cuik: a modern C11 compiler aiming to replace GCC/MSVC/LLVM. Modular: libCuik is the frontend, TB (Tilde Backend) is the backend. TB has its own IR, instruction selection, register allocator; designed for fast compile times à la Cranelift. Cuik is “still early” per its README but development is steady through 2025.
§3 Target coverage (May 2026)
- TCC (mob branch): x86_64, i386, ARM (32-bit), ARM64 (AArch64), RISC-V (RV64), Win64. ELF, PE, Mach-O are partially supported.
- chibicc: x86_64 Linux only. No other targets, no plans.
- Cuik / TB: x86_64 primarily; AArch64 in progress; Windows COFF support good (the author’s focus).
Object formats: TCC emits ELF and PE/COFF; chibicc emits assembly only; Cuik emits ELF and COFF.
§4 Production / language adoption status (May 2026)
- TCC: production-adjacent use in reproducible-builds projects (notably the bootstrappable builds initiative, where TCC is one of the smallest reachable C compilers from a hex-coded seed). Distros ship it (Debian, Fedora, Arch). Commits through October 2025; mailing list active through November 2025.
- chibicc: not production. Used as the canonical “build a C compiler” reference. There is amusing 2026 chatter that Anthropic’s “Claude’s C compiler” project shows chibicc-flavored bugs (https://github.com/anthropics/claudes-c-compiler/issues/232), suggesting chibicc’s code may have been influential in training data.
- Cuik: hobbyist active project. Growing community interest; not production.
License: TCC is LGPL; chibicc is MIT (per the repo); Cuik is MIT.
§5 Engineering cost for Mochi
These are reference points, not realistic Mochi backends. The takeaways:
- TCC demonstrates that a single binary covering x86_64+arm+arm64+riscv64 in ~80k lines of C is achievable. If Mochi wrote its own native backend from scratch (rejecting LLVM/QBE/Cranelift), TCC’s source is the ceiling for “naive but useful.”
- chibicc demonstrates that you can have a real C compiler in ~10k lines, single-file, single-pass, x86_64-only. For a Mochi “weekend prototype” emitter targeting only macOS arm64 or Linux x86_64, this is the closest existing template.
- Cuik/TB demonstrates a modern alternative to LLVM’s pipeline in C, written by one person, with comparable architecture choices to Cranelift. TB might be a future target backend in its own right once it stabilizes.
For actual integration:
- TCC as JIT: TCC’s
libtcclets us compile C strings at runtime and call them. This pairs with thec_as_backendstrategy: Mochi emits C, libtcc JITs it for fast iteration, GCC/Clang compiles it for release. Mochi already hasruntime/tcc/Makefile. - chibicc and Cuik: too immature for Mochi to depend on; useful as design references only.
§6 Mochi adaptation note
The existing runtime/tcc/Makefile (/Users/apple/github/mochilang/mochi/runtime/tcc/Makefile) suggests Mochi already considered TCC as a fast development-tier compiler. Concretely:
- Mochi emits C (per
10_c_as_backend.md). - For
mochi runand tests: invokelibtccvia cgo to JIT the emitted C in ~10ms. - For
mochi build: invokecc(GCC/Clang/zig cc) for high-quality optimization.
This two-tier pattern (TCC for fast feedback, GCC/Clang for release) is the same pattern Cython, Nim, and Julia (in spirit) use.
If we want a non-C, non-LLVM lower-level backend written by ourselves, chibicc and Cuik are useful reference reads but not adoption candidates.
§7 Open questions for MEP-42
- Should Mochi ship a vendored TCC? TCC’s small size (~500 KB binary, LGPL) makes vendoring feasible, but LGPL bytecode-redistribution constraints would need legal review.
- Bus factor on TCC: grischka is the primary maintainer post-Bellard. Healthy mailing list but small community.
- Is rolling our own naive emitter sensible? Only if every external backend (LLVM, Cranelift, QBE, MIR) is rejected. The cost is multi-month for x86_64 alone, multi-year for full multi-arch parity. The chibicc and TCC source counts suggest realistic floors.
- Cuik watch: if Cuik/TB stabilizes by 2027 and gains AArch64 + RISC-V backends, it becomes a real “Cranelift in C” option for non-Rust hosts.
- No Wasm: none of these emit Wasm. Different problem.