编译原理 0. 概述
忽略掉预处理以及链接的部分,C/C++ 语言的完整编译过程可以用下图表示:
flowchart LR
subgraph 源代码
A[main.c]
end
subgraph 汇编代码
C[main.s]
end
A --编译 -S--> C
subgraph 机器码
D[main.o]
end
C --汇编 -c--> D
机器码 ---> 可执行程序
可执行程序 --> z([运行])
编译原理中的“编译”二字与此处的“编译”二字并不是一个意思,此处的编译是具体的过程,从源代码到最终的可执行程序,而编译原理中的“编译”更加广泛,一切与解析某一种语言并转化为其他“语言”有关的过程都离不开此原理。
比如 python 的解释器(解释 python 代码并转化为具体指令运行),Markdown的解析渲染(解析 Markdown 并转化为 HTML 进行渲染),以及 SQL 的解析执行(解析 SQL 语句为具体的操作并执行)等等。
而这些过程都可以大致抽象为两大部分:
- 前端部分(Frontend)
负责将源代码经过一步步分析转化为一个抽象的树形结构 —— 抽象语法树(AST)
- 后端部分(Backend)
可能是个代码生成器,依照抽象的树形结构生成具体实际的转化目标的指令或语言等
或许还会包含优化器等部分