编译和链接
编译
编译:扫描 -> 语法分析 -> 语义分析 -> 源代码优化 -> 代码生成 -> 目标代码优化
下图为从源代码
Source Code
到最终目标代码Final Target Code
的过程flowchart TD A(Source Code) --> |Scanner| B(Tokens) B --> |Parser| C(Syntax Tree) C --> |Semantic Analyzer| D(Commented Syntax Tree) D --> |Source Code Optimizer| E(Intermediate Representation) E --> |Code Generator| F(Target Code) F --> |Code Optimizer| G(Final Target Code)
词法分析
Lexical Analysis
- 扫描器
scanner
- 有限状态机
FSM (Finite State Machine)
算法:将源代码的字符分割成一系列的记号Token
lex
:按照用户描述好的词法规则将输入的字符串分割成一个个记号
语法分析
Syntax Analysis
- 语法分析器
Grammar Parser
- 语法树
Syntax Tree
- 上下文无关语法
Context-free Grammar
yacc
:Yet Another Compiler Compiler,根据用户给定的语法规则对输入记号序列进行解析,从而构建出一颗语法树
语义分析
Semantic Analysis
- 语义分析器
Semantic Analyzer
- 编译器能分析的是静态语义
Static Semantic
:静态语义通常包括声明和类型的匹配,类型的转换
中间语言生成
源码级优化器
Source Code Optimizer
中间代码
Intermediate Code
使得编译器分为前端和后端,前端负责产生机器无关的中间代码,后端负责将中间代码转换为目标机器代码,通常同一个前端可以通过组合不同的后端适配不同的平台
三地址码
Three-address Code
1
x = y op z
P-代码
P-Code
编译器后端
代码生成器
Code Generator
目标代码生成器
Target Code Optimizer
链接器
- 符号
Symbol
:表示一个地址,可能是一段子程序(函数)的地址,也可能是一个变量的起始地址 - 模块间通信方式:符号引用
- 链接
Linking
:- 地址和空间分配
Address and Storage Allocation
- 符号决议
Symbol Resolution
(or Symbol Binding, Name Binding, Name Resolution, Address Binding, Instruction Binding) - 重定位
Relocation
- 地址和空间分配
- 运行时库
Runtime Library
:支持程序运行的基本函数的集合 - 重定位入口
Relocation Entry
目标文件
格式
- COFF:Common file format –> .obj (windows) & .o (Linux)
- 动态链接库 (Dynamic Linking Library):.dll (windows) & .so (Linux)
- 静态链接库 (Static Linking Library):.lib(windows) & .a(linux)