andrewchambers/c
GitHub: andrewchambers/c
一个追求极简和自托管的轻量级 C 编译器套件,适合编译器学习和研究,但项目已暂停开发。
Stars: 491 | Forks: 62
# 一个小巧、快速的 C 编译器套件。
注意 - 该项目不再积极开发。请转向 https://badges.gitter.im/Join%20Chat.svg,这是一个更完善的后续项目。我现在将自己的修复提交到该项目中。
[](https://gitter.im/andrewchambers/c?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
- 小巧。
- 快速。
- 一致。
- 高质量。
- 低复杂度。
- 零依赖。
- 无需繁琐配置。
- 轻松交叉编译。
- 开箱即用。
你应该能在 30 秒内为任何受支持的目标平台获得 C 编译器、汇编器、链接器和 libc。
## 构建
(目前)需要外部 C 编译器和 gnu binutils,目前我只在 64 位 linux 上测试过。
代码确实使用了匿名联合体扩展,因此你的编译器也需要支持它们。
```
$ make
```
## 测试
```
$ make test
$ make selfhost # self hosting
```
## 计划
### 阶段 1.
自托管 x86_64,简易后端。
### 阶段 2.
自托管 arm,类似于树莓派/android。
### 阶段 3.
构建小型的整洁 C 代码库,如 8cc、tcc、sbase。
### 阶段 4.
构建 musl libc。
### 后续。
- 构建更多程序。
- 用我们自己的汇编器替换 gnu as。
- 用我们自己的静态链接器替换 ld。
- 构建 OS 内核。
- SSA 后端。
## 状态
处于阶段 2 之前。自托管但缺少许多常见情况。虽然从技术上讲,这些错误可以用编译器本身来修复 :)。它使用自己的桩头文件,尚无法正确处理系统头文件(寻求帮助)。
## 贡献
项目暂停。请参阅 以获取一个更完善的新编译器项目。
### 代码布局
- 库位于 src/*
- 命令位于 src/cmd/*
如果你不确定某个库的用途,请查看头文件,其中应该有简短描述。
### 代码风格
遵循 Plan9 风格约定。不允许头文件包含其他头文件,以消除循环依赖并提高构建速度。
src/u.h 是此规则的唯一例外。
- http://www.lysator.liu.se/c/pikestyle.html
- http://plan9.bell-labs.com/magic/man2html/6/style
- http://aiju.de/b/style
### 错误修复和问题
尝试附上能展示你问题的单个源文件。如果可能,手动缩减测试用例,直到尽可能小。
尝试遵循通用模板并根据需要修改:
```
What are you trying to do:
...
What you expected to happen:
...
What actually hapened:
...
```
尝试添加一个能复现问题的小型独立文件。
通常,每个错误修复或更改都应添加一个触发该错误的测试文件。
### 内存管理
编译器不会显式释放内存。自托管时的峰值内存使用量约为 2Mb,因此这应该不是问题,即使对于计划中的目标/主机(如树莓派)也是如此。
这实际上简化了代码,并可能使其更快,因为分配可以是指针碰撞。
## 有用的链接
- C11 标准最终草案 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
- Dave Prosser 的 C 预处理算法 http://www.spinellis.gr/blog/20060626/
- x86-64 ABI http://www.x86-64.org/documentation/abi.pdf
- http://aiju.de/rant/cross-compiling
- http://bellard.org/tcc/
- https://github.com/rui314/8cc
- http://harmful.cat-v.org/software/
- http://suckless.org/philosophy
标签:ARM架构, C语言编译器, DNS解析, Linux软件, x86_64架构, 云安全监控, 代码构建工具, 后端开发, 客户端加密, 嵌入式Linux, 嵌入式开发, 开源项目, 无依赖, 树莓派开发, 汇编器, 系统编程, 编程语言实现, 编译原理, 自托管编译器, 跨平台编译, 轻量级编译器, 链接器, 静态分析