DoctorWkt/acwj
GitHub: DoctorWkt/acwj
一个从零开始手把手教你编写 C 语言子集编译器的实践教程项目,覆盖从词法分析到代码生成的完整编译流程。
Stars: 13178 | Forks: 1183
# 编译器编写之旅
在这个 Github 仓库中,我正在记录我编写一个 C 语言子集的自举编译器的旅程。
我也写下了详细的细节,以便,
如果你想跟着做,这里会有关于我做了什么、为什么这么做的解释,
并提供了一些关于编译器理论的参考。
但不会有太多的理论,我希望这是一次实践的旅程。
以下是我目前所经历的步骤:
+ [第 0 部分](00_Introduction/Readme.md):旅程简介
+ [第 1 部分](01_Scanner/Readme.md):词法扫描简介
+ [第 2 部分](02_Parser/Readme.md):解析简介
+ [第 3 部分](03_Precedence/Readme.md):运算符优先级
+ [第 4 部分](04_Assembly/Readme.md):一个真正的编译器
+ [第 5 部分](05_Statements/Readme.md):语句
+ [第 6 部分](06_Variables/Readme.md):变量
+ [第 7 部分](07_Comparisons/Readme.md):比较运算符
+ [第 8 部分](08_If_Statements/Readme.md):If 语句
+ [第 9 部分](09_While_Loops/Readme.md):While 循环
+ [第 10 部分](10_For_Loops/Readme.md):For 循环
+ [第 11 部分](11_Functions_pt1/Readme.md):函数,第 1 部分
+ [第 12 部分](12_Types_pt1/Readme.md):类型,第 1 部分
+ [第 13 部分](13_Functions_pt2/Readme.md):函数,第 2 部分
+ [第 14 部分](14_ARM_Platform/Readme.md):生成 ARM 汇编代码
+ [第 15 部分](15_Pointers_pt1/Readme.md):指针,第 1 部分
+ [第 16 部分](16_Global_Vars/Readme.md):正确声明全局变量
+ [第 17 部分](17_Scaling_Offsets/Readme.md):更好的类型检查和指针偏移
+ [第 18 部分](18_Lvalues_Revisited/Readme.md):再探 Lvalues 和 Rvalues
+ [第 19 部分](19_Arrays_pt1/Readme.md):数组,第 1 部分
+ [第 20 部分](20_Char_Str_Literals/Readme.md):字符与字符串字面量
+ [第 21 部分](21_More_Operators/Readme.md):更多运算符
+ [第 22 部分](22_Design_Locals/Readme.md):局部变量与函数调用的设计思路
+ [第 23 部分](23_Local_Variables/Readme.md):局部变量
+ [第 24 部分](24_Function_Params/Readme.md):函数参数
+ [第 25 部分](25_Function_Arguments/Readme.md):函数调用与实参
+ [第 26 部分](26_Prototypes/Readme.md):函数原型
+ [第 27 部分](27_Testing_Errors/Readme.md):回归测试与一个惊喜
+ [第 28 部分](28_Runtime_Flags/Readme.md):添加更多运行时标志
+ [第 29 部分](29_Refactoring/Readme.md):一些重构
+ [第 30 部分](30_Design_Composites/Readme.md):设计 Structs、Unions 和 Enums
+ [第 31 部分](31_Struct_Declarations/Readme.md):实现 Structs,第 1 部分
+ [第 32 部分](32_Struct_Access_pt1/Readme.md):访问 Struct 中的成员
+ [第 33 部分](33_Unions/Readme.md):实现 Unions 和成员访问
+ [第 34 部分](34_Enums_and_Typedefs/Readme.md):Enums 和 Typedefs
+ [第 35 部分](35_Preprocessor/Readme.md):C 预处理器
+ [第 36 部分](36_Break_Continue/Readme.md):`break` 和 `continue`
+ [第 37 部分](37_Switch/Readme.md):Switch 语句
+ [第 38 部分](38_Dangling_Else/Readme.md):悬空 Else 及其他
+ [第 39 部分](39_Var_Initialisation_pt1/Readme.md):变量初始化,第 1 部分
+ [第 40 部分](40_Var_Initialisation_pt2/Readme.md):全局变量初始化
+ [第 41 部分](41_Local_Var_Init/Readme.md):局部变量初始化
+ [第 42 部分](42_Casting/Readme.md):类型转换与 NULL
+ [第 43 部分](43_More_Operators/Readme.md):错误修复与更多运算符
+ [第 44 部分](44_Fold_Optimisation/Readme.md):常量折叠
+ [第 45 部分](45_Globals_Again/Readme.md):再探全局变量声明
+ [第 46 部分](46_Void_Functions/Readme.md):Void 函数参数与扫描更改
+ [第 47 部分](47_Sizeof/Readme.md):`sizeof` 的子集
+ [第 48 部分](48_Static/Readme.md):`static` 的子集
+ [第 49 部分](49_Ternary/Readme.md):三元运算符
+ [第 50 部分](50_Mop_up_pt1/Readme.md):收尾工作,第 1 部分
+ [第 51 部分](51_Arrays_pt2/Readme.md):数组,第 2 部分
+ [第 52 部分](52_Pointers_pt2/Readme.md):指针,第 2 部分
+ [第 53 部分](53_Mop_up_pt2/Readme.md):收尾工作,第 2 部分
+ [第 54 部分](54_Reg_Spills/Readme.md):溢出寄存器
+ [第 55 部分](55_Lazy_Evaluation/Readme.md):惰性求值
+ [第 56 部分](56_Local_Arrays/Readme.md):局部数组
+ [第 57 部分](57_Mop_up_pt3/Readme.md):收尾工作,第 3 部分
+ [第 58 部分](58_Ptr_Increments/Readme.md):修复指针的自增/自减
+ [第 59 部分](59_WDIW_pt1/Readme.md):为什么它不起作用,第 1 部分
+ [第 60 部分](60_TripleTest/Readme.md):通过三重测试
+ [第 61 部分](61_What_Next/Readme.md):下一步是什么?
+ [第 62 部分](62_Cleanup/Readme.md):代码清理
+ [第 63 部分](63_QBE/Readme.md):使用 QBE 的新后端
+ [第 64 部分](64_6809_Target/Readme.md):6809 CPU 的后端
我已经停止了 *acwj* 的工作,现在正在从头开始编写一种名为 [alic](https://github.com/DoctorWkt/alic) 的新语言。快来看看吧!
## 版权声明
我借用了由 Nils M Holm 编写的
[SubC](http://www.t3x.org/subc/) 编译器中的一些代码和大量思想。
他的代码属于公共领域。我认为我的代码已经有足够的实质差异,
因此我可以为我的代码应用不同的许可证。
除非另有说明,
+ 所有源代码和脚本均由 Warren Toomey 采用
GPL3 许可证授权。
+ 所有非源代码文档(例如英文文档、
图像文件)均由 Warren Toomey 采用 Creative
Commons BY-NC-SA 4.0 许可证授权。
标签:ARM架构, DNS解析, DoH影响, x86架构, 云安全监控, 代码生成, 客户端加密, 开源项目, 快速连接, 指针, 教育资料, 汇编语言, 渗透测试工具, 源代码阅读, 编程教程, 编译原理, 编译器, 自举, 解析器, 计算机科学, 词法分析, 语法分析, 软件开发, 静态分析