mini-c
I set myself a challenge: write a self-hosting C compiler in 10 hours. This is the result, plus lots of cleanup (check "releases" for the 10 hour version).
Implementation:
- Generates 32-bit x86 assembly, which is then assembled and linked by GCC.
- It is all implemented in a single pass. Code generation is mixed with parsing. This requires some creativity.
- The parser peeks at the next token to decide whether to generate an lvalue.
Language:
- Local and global variables, parameters.
- Functions,
if, while, do``while, return.
=, ?: (ternary), ||, &&, ==, !=, <, >=, +, -, *, ++, -- (post-ops), !, - (unary), [], ()
- Integer, character,
true and false literals. String literals, with automatic concatenation.
- The language it implements is typeless. Everything is a 4 byte signed integer.
- Pointer indexing works in increments of 4 bytes, pointer arithmetic is byte-by-byte.
The general philosophy was: only include a feature if it reduces the total code size. This is taken to its extreme in the insane branch.
Building and running it
git clone http://github.com/Fedjmike/mini-c
cd mini-c
make selftest
This will first produce cc by compiling mini-c with GCC. Then it makes ccself by compiling mini-c with cc. Finally it makes test/triangular using ccself, and checks the result. You should get something like this:
$ make selftest