chibicc README

The project's README from github.com/rui314/chibicc. As one markdown file: README.md.

chibicc: A Small C Compiler

(The old master has moved to historical/old branch. This is a new one uploaded in September 2020.)

chibicc is yet another small C compiler that implements most C11 features. Even though it still probably falls into the "toy compilers" category just like other small compilers do, chibicc can compile several real-world programs, including Git, SQLite, libpng and chibicc itself, without making modifications to the compiled programs. Generated executables of these programs pass their corresponding test suites. So, chibicc actually supports a wide variety of C11 features and is able to compile hundreds of thousands of lines of real-world C code correctly.

chibicc is developed as the reference implementation for a book I'm currently writing about the C compiler and the low-level programming. The book covers the vast topic with an incremental approach; in the first chapter, readers will implement a "compiler" that accepts just a single number as a "language", which will then gain one feature at a time in each section of the book until the language that the compiler accepts matches what the C11 spec specifies. I took this incremental approach from the paper by Abdulaziz Ghuloum.

Each commit of this project corresponds to a section of the book. For this purpose, not only the final state of the project but each commit was carefully written with readability in mind. Readers should be able to learn how a C language feature can be implemented just by reading one or a few commits of this project. For example, this is how while, [], ?:, and thread-local variable are implemented. If you have plenty of spare time, it might be fun to read it from the first commit.

If you like this project, please consider purchasing a copy of the book when it becomes available! 😀 I publish the source code here to give people early access to it, because I was planing to do that anyway with a permissive open-source license after publishing the book. If I don't charge for the source code, it doesn't make much sense to me to keep it private. I hope to publish the book in 2021. You can sign up here to receive a notification when a free chapter is available online or the book is published.

I pronounce chibicc as chee bee cee cee. "chibi" means "mini" or "small" in Japanese. "cc" stands for C compiler.

Status

chibicc supports almost all mandatory features and most optional features of C11 as well as a few GCC language extensions.

Features that are often missing in a small compiler but supported by chibicc include (but not limited to):

chibicc does not support complex numbers, K&R-style function prototypes and GCC-style inline assembly. Digraphs and trigraphs are intentionally left out.

chibicc outputs a simple but nice error message when it finds an error in source code.

There's no optimization pass. chibicc emits terrible code which is probably twice or more slower than GCC's output. I have a plan to add an optimization pass once the frontend is done.

I'm using Ubuntu 20.04 for x86-64 as a development platform. I made a few small changes so that chibicc works on Ubuntu 18.04, Fedora 32 and Gentoo 2.6, but portability is not my goal at this moment. It may or may not work on systems other than Ubuntu 20.04.

Internals

chibicc consists of the following stages:

Contributing

When I find a bug in this compiler, I go back to the original commit that introduced the bug and rewrite the commit history as if there were no such bug from the beginning. This is an unusual way of fixing bugs, but as a part of a book, it is important to keep every commit bug-free.

Thus, I do not take pull requests in this repo. You can send me a pull request if you find a bug, but it is very likely that I will read your patch and then apply that to my previous commits by rewriting history. I'll credit your name somewhere, but your changes will be rewritten by me before submitted to this repository.

Also, please assume that I will occasionally force-push my local repository to this public one to rewrite history. If you clone this project and make local commits on top of it, your changes will have to be rebased by hand when I force-push new commits.

Design principles

chibicc's core value is its simplicity and the reability of its source code. To achieve this goal, I was careful not to be too clever when writing code. Let me explain what that means.

Oftentimes, as you get used to the code base, you are tempted to improve the code using more abstractions and clever tricks. But that kind of improvements don't always improve readability for first-time readers and can actually hurts it. I tried to avoid the pitfall as much as possible. I wrote this code not for me but for first-time readers.

If you take a look at the source code, you'll find a couple of dumb-looking pieces of code. These are written intentionally that way (but at some places I might be actually missing something, though). Here is a few notable examples:

About the Author

I'm Rui Ueyama. I'm the creator of 8cc, which is a hobby C compiler, and also the original creator of the current version of LLVM lld linker, which is a production-quality linker used by various operating systems and large-scale build systems.

References

[1] https://www.drdobbs.com/cpp/increasing-compiler-speed-by-over-75/240158941

DMD does memory allocation in a bit of a sneaky way. Since compilers are short-lived programs, and speed is of the essence, DMD just mallocs away, and never frees.

chibicc (rui314/chibicc)

Searching Database…

11.9K ·GitHub
What is this?chibicc is a small C compiler that implements most C11 features — created as a readable, teaching-oriented implementation of a real compiler.
Is this a compiler I could actually use for real projects, or just a learning exercise?It is a real command-line compiler, not a library. It still falls in the toy-compilers category, but it builds real programs like Git, SQLite and libpng unmodified, and they pass their test suites.
How do I get it running?Clone the repository and build it from source with make — it is a plain C project, and it is complete enough to compile itself.
What's the catch — is the code it generates any good?There is no optimization pass, so output is typically twice or more slower than GCC's. It also lacks complex numbers, K&R-style prototypes, GCC-style inline assembly, and digraphs/trigraphs.
Why was it built — is it tied to a book?It is the reference implementation for the author's book on C compilers and low-level programming. Every commit maps to a book section and is written so a reader can learn one feature by reading a commit or two.
Which systems does it run on?It targets x86-64 Linux: the author develops on Ubuntu 20.04 and made it work on Ubuntu 18.04, Fedora 32 and Gentoo 2.6, but portability is not a goal — other systems may or may not work.
Which C11 features does it support that small compilers usually miss?The preprocessor, 80-bit x87 long double, bit-fields, alloca(), variable-length arrays, compound literals, thread-local and atomic variables, designated initializers, wide/UTF string literals, and functions that take or return structs per the x86-64 SystemV ABI.
How does it differ from tcc?Both are small C compilers, but tcc works in a single pass while chibicc is deliberately multi-pass (tokenize, preprocess, parse, codegen), which keeps each stage small and readable.
Is the companion book available yet?Per the README, the book was still in progress — the author hoped to publish it in 2021 and offered a mailing-list signup for a free chapter notification. Check the repository for its current status.
Why does the code never free allocated memory?Because compilers are short-lived programs: chibicc allocates with calloc and lets the OS reclaim everything at exit, the same scheme the DMD compiler uses. Simplicity beats tidy cleanup here.
Creator
rui314
Size
0.9 MB
Stars
11.9K
Updated
CommitDec 07
Age
7y
Commits · 90 Days