自己动手写编译器
What I cannot create, I do not understand. – Richard Feynman
#目标
- 实现一个 C-to-assembly compiler
- 可以有 pre-processer
- 不需要 linker, 生成二进制通过已有的 Assembler
- 支持常用的 C99 语法
- 需要有编译优化
#词法分析, 语法分析
- 用已有的工具 flex, bison
#类型系统
1 | struct TypeKind { |
#中间表示 - CMinor
IR定义:
- ARITH arg1 arg2 result
- ADD/SUB/MUL/MOD/SHL/SHR/AND/OR/XOR
- LT/LE/GT/GE/EQ/NE
- ARITH arg result
- NEG/NOT/CAST
- MOV arg result
- GOTO addr
- IF_GOTO arg label
- UNLESS_GOTO arg label
- IF_REL arg1 arg2 label
- LT/LE/GT/GE/EQ/NE
- PARAM x
- y = CALL p, n
- RETURN y
- GET_ELEMENT array index result
- STORE_ELEMENT array index value
- ADDR arg result
- LOAD arg result
- STORE arg result
#关键数据结构
类型(Type)结构
结构体/联合体成员(Member)结构
全局变量/函数定义对象(Obj)结构