汪道之

有人的地方就有江湖

0%

编译原理第五章

编译概述

1. 不同语言程序之间的翻译

1.1 翻译

定义:语法单位之间等价的变换
就是将一种语言编写的程序转换成等价的另一种语言编写的程序

1.2 特殊的翻译:汇编、编译

汇编:将汇编语言程序翻译为机器语言的程序
编译:将高级语言程序翻译为低级语言的程序

1.3 翻译程序

定义:完成翻译工作的程序,也叫翻译器

image-20210426201154954

宿主语言:翻译程序对应的语言
宿主机:运行翻译程序的机器

1.4 编译程序

定义:实现编译的翻译程序,也叫编译器

image-20210426201419434

自驻留的编译程序:编译程序生成宿主机执行的机器代码
自编译的编译程序:编译程序是用源语言写的
交叉编译:编译程序生成的不是宿主机执行的机器代码

2. 编译的步骤

逻辑上分为两部分:

  1. 源程序的分析
  2. 目标程序的合成

具体为5个步骤:

  1. 词法分析
  2. 语法分析
  3. 语义分析与中间代码生成
  4. 中间代码优化
  5. 目标代码生成

编译的每个步骤都需要:

  1. 符号表管理
  2. 出错处理
2.1 词法分析

分析输入的字符串,根据词法规则识别出单词符号
单词符号:基本字、标识符、字面常量、运算符、界符

2.2 语法规则

根据语法规则,识别各类语法单位并进行语法检查
语法单位:表达式、语句、程序单元、程序

2.3 语义分析与中间代码生成

根据语义规则,对语法正确的语法单位进行翻译
注:可以直接生成目标程序,但目标程序执行效率低,故而生成中间代码

中间代码:大多数的编译器采用中间代码来描述源程序的语义,这种中间语言对应某种抽象机,结构简单,语义明确,易于翻译成目标代码,同时也便于优化和移植。

2.4 优化

对中间代码进行等价变换,提高代码的时空效率
注:语义分析产生的中间代码不依赖于实际的机器,故而易于做一些等价变换,使生成的目标程序占用空间更少,执行更快。

2.5 目标代码生成

根据优化后的中间代码以及有关信息,可生成较为有效的目标代码
目标代码:目标机的机器语言程序或汇编语言程序
注:若生成的是汇编语言程序,还需将其汇编成机器语言程序

2.6 符号表管理

描述符表:存放实体属性的表格
注:根据实体的不同,表格的形式也不同,其中最主要的是符号表
注:编译程序应有一组表格管理程序,负责表格的建立、维护、引用、查找、更新

2.7 出错处理

编译程序发现错误后进行出错处理,包括报告错误的性质和发生错误的位置等

2.8 编译器的结构

image-20210426210832819

3. 完整的程序处理过程

从分析源程序到建立一个可执行的目标程序,处理过程还需要预处理器、汇编器、连接器、装入器

3.1 完整的程序处理过程

image-20210426211128343

4. 编译前端与后端

现代编译器通常将编译过程划分为前端和后端分别实现,它们通过中间代码连接,可极大提高编译器设计与实现的效率

4.1 前端

主要是与源程序相关的部分,包括词法、语法分析、语义分析、中间代码生成等

4.2 后端

主要是与目标程序相关的部分,包括优化、目标代码生成等

5. 结语

词法分析基于有限状态自动机FA
语法分析基于下推自动机PDA