1.1 什么是编译
- 编译:将高级语言(源语言)翻译成汇编语言或机器语言(目的语言)的过程
- 源程序 → 预 处 理 器 ( P r e p r o c e s s o r ) \xrightarrow{预处理器(Preprocessor)} 预处理器(Preprocessor) 经过处理的源程序 → 编 译 器 \xrightarrow{编译器} 编译器 汇编语言程序 → 汇 编 器 ( A s s e m b l e r ) \xrightarrow{汇编器(Assembler)} 汇编器(Assembler) 可重定位的机器代码 → 链 接 器 ( L i n k e r ) / 加 载 器 ( L o a d e r ) \xrightarrow{链接器(Linker)/加载器(Loader)} 链接器(Linker)/加载器(Loader) 目标机器代码
1.2 编译系统的结构
- 人工翻译的例子: → 源 语 言 句 子 \xrightarrow{源语言句子} 源语言句子 分析源语言(语义分析) → 句 子 的 语 义 \xrightarrow{句子的语义} 句子的语义 生成目标语言 → 目 标 语 言 句 子 \xrightarrow{目标语言句子} 目标语言句子
- 语义分析(Semantic Analysis):划分句子成分,通过短语
- 语法分析(Syntax Analysis):识别各类短语,通过词性
- 词法分析(Lexical Analysis):识别词性
- 中间表示:独立于具体语言
- 编译器的结构(阶段):
→
字
符
流
\xrightarrow{字符流}
字符流 词法分析器
→
词
法
单
元
流
\xrightarrow{词法单元流}
词法单元流 语法分析器
→
语
法
树
\xrightarrow{语法树}
语法树 语义分析器
→
语
法
树
\xrightarrow{语法树}
语法树 中间代码生成器
→
中
间
表
示
形
式
\xrightarrow{中间表示形式}
中间表示形式 机器无关代码优化器
→
中
间
表
示
形
式
\xrightarrow{中间表示形式}
中间表示形式 目标代码生成器
→
目
标
机
器
语
言
\xrightarrow{目标机器语言}
目标机器语言 机器相关代码优化器
→
目
标
机
器
语
言
\xrightarrow{目标机器语言}
目标机器语言
- 分析部分/前端(front end):中间代码生成器之前,与源语言相关
- 综合部分/后端(back end):中间表示形式之后,与目标语言相关
- 语法制导翻译(Syntax Directed Translation):在语法分析的同时进行语义分析
1.3 词法分析概述
-
源程序 → 从 左 向 右 逐 行 扫 描 , 识 别 各 个 单 词 , 确 定 单 词 类 型 \xrightarrow{从左向右逐行扫描,识别各个单词,确定单词类型} 从左向右逐行扫描,识别各个单词,确定单词类型 词法单元(token)集合
-
token:< 种别码, 属性值 >
-
关键字:
program
、if
等,一词一码 -
标识符:变量名、数组名等,多词一码,通过属性值区别不同标识符
-
常量:整型、字符型等,一型一码
-
运算符:算数、关系等,一词一码或一型一码
-
界限符:一词一码
注:对于事先可以完全确定的类型,可以为每一个值分配一个码;对于开放集合不能枚举,需要属性值加以标记
-
-
词法分析举例:
While(value!=100){num++}
while
: < W H I L E , − > < WHILE, - > <WHILE,−>(
: < S L P , − > < SLP, - > <SLP,−>value
: < I D N , v a l u e > < IDN, value > <IDN,value>!=
: < N E , − > < NE, - > <NE,−>100
: < C O N S T , 100 > < CONST, 100 > <CONST,100>)
: < S R P , − > < SRP, - > <SRP,−>{
: < L P , − > < LP, - > <LP,−>num
: < I D N , n u m > < IDN, num > <IDN,num>++
: < I N C , − > < INC, - > <INC,−>;
: < S E M I , − > < SEMI, - > <SEMI,−>}
: < R P , − > <RP, - > <RP,−>
-
实现词法分析器:第三章
1.4 语法分析概述
-
token 序列 → 识 别 各 类 短 语 , 构 造 语 法 分 析 树 \xrightarrow{识别各类短语,构造语法分析树} 识别各类短语,构造语法分析树 语法分析树(parse tree)
-
赋值语句的分析树:
position = initial + rate * 60
-
变量声明语句的分析树:
int a,b,c
-
根据语法规则为输入句子构造分析树:第四章
1.5 语义分析概述
-
收集标识符的属性信息:存放在符号表(Symbol Table)
-
种属(Kind):简单变量、复合变量(数组等)
-
类型(Type):整型、字符型等
-
存储位置、长度
-
值
-
作用域
-
参数和返回值信息
符号表:(NAME, TYPE, KIND, VAL, ADDR),附带字符串表记录NAME值
-
-
语义检查
- 变量或过程未经声明就使用
- 变量或过程重复声明
- 运算分量类型不匹配
- 操作符与操作数类型不匹配
1.6 中间代码生成
- 常用的中间表示形式:三地址码(Three-address Code),语法结构树/语法树(Syntax Trees)
- 三地址码:
- 三地址:源程序中的名字、常量、编译器生成的临时变量
- 三地址指令表示:
- 四元式(Quardruples):(op, y, z, x)
- 三元式(Triples)
- 间接三元式(Indirect triples)
- 举例
- 根据分析树生成中间代码:第六章
1.7 编译器后端概述
- 目标代码生成:中间表示形式
→
\rightarrow
→ 目标语言
- 重要任务:为程序中使用的变量合理分配寄存器
- 代码优化:等价程序变换,是程序运行更快、占用空间更少
- 减少冗余运算
- 替换高代价运算
- 详细介绍:第八、九章