自己动手写编译器

What I cannot create, I do not understand. – Richard Feynman

#目标

  • 实现一个 C-to-assembly compiler
  • 可以有 pre-processer
  • 不需要 linker, 生成二进制通过已有的 Assembler
  • 支持常用的 C99 语法
  • 需要有编译优化

#词法分析, 语法分析

  • 用已有的工具 flex, bison

#类型系统

1
2
3
4
struct TypeKind {
VOID,
...
}

#中间表示 - 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

#关键数据结构

  1. 类型(Type)结构

  2. 结构体/联合体成员(Member)结构

  3. 全局变量/函数定义对象(Obj)结构