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
这是什么?chibicc 是一个小型 C 编译器,实现了大部分 C11 特性——它的定位是一个可读性强、面向教学的真实编译器实现。
它是能真正用于实际项目的编译器,还是只是个练手的东西?它是一个真正的命令行编译器,而不是一个库。虽然仍属于玩具编译器的范畴,但它可以原封不动地编译 Git、SQLite 和 libpng 这样的真实程序,而且这些程序都能通过自己的测试套件。
我怎么把它跑起来?克隆仓库,然后用 make 从源码构建——它是一个普通的 C 项目,而且已经完整到可以编译它自己。
它有什么短板——生成的代码质量怎么样?它没有优化环节,所以生成的程序通常比 GCC 的慢一倍以上。另外它不支持复数、K&R 风格的函数原型、GCC 风格的内联汇编,也不支持二合字母/三合字母。
它为什么被开发出来——是不是和某本书绑定?它是作者那本关于 C 编译器和底层编程的书的配套参考实现。每个提交都对应书中的一个章节,读者读一两个提交就能学会一个特性。
它能在哪些系统上运行?它面向 x86-64 Linux:作者在 Ubuntu 20.04 上开发,并让它在 Ubuntu 18.04、Fedora 32 和 Gentoo 2.6 上也能用,但可移植性并不是目标——其他系统能不能跑就不好说了。
它支持哪些小型编译器通常缺少的 C11 特性?包括预处理器、80 位 x87 long double、位域、alloca()、变长数组、复合字面量、thread-local 和 atomic 变量、指定初始化器、宽字符/UTF 字符串字面量,以及按 x86-64 SystemV ABI 传入和返回结构体的函数。
它和 tcc 有什么区别?两者都是小型 C 编译器,但 tcc 是单遍处理,而 chibicc 刻意采用多遍处理(分词、预处理、解析、代码生成),这样每个阶段都小巧易读。
配套的那本书出了吗?根据 README,当时这本书还在写——作者原计划在 2021 年出版,并提供了邮件列表订阅,出免费章节时会通知。目前的进展请查看仓库。
为什么代码从不释放分配的内存?因为编译器都是短命的程序:chibicc 用 calloc 分配内存,退出时把一切都交还给操作系统回收,和 DMD 编译器用的是同一套办法。在这里,简单比干净的清理更重要。
Creator
rui314
Size
0.9 MB
Stars
11.9K
Updated
CommitDec 07
Age
7y
Commits · 90 Days