编译程序

一个编译程序就是一个语言翻译程序,把一种语言(源语言)书写的程序翻译成另一种语言(目标语言)

![[images/截屏2026-03-29 10.51.27.png]]

预处理程序

一个源程序可能分为多个模块存放在不同文件中,通过预处理程序将所有源程序进行汇集

编译类型

  • 一趟编译
  • 多趟编译
  • 具有调试和优化功能的编译

编译过程

  • 词法分析
  • 语法分析
  • 语义分析
  • 中间代码生成
  • 代码优化
  • 目标代码生成

![[images/截屏2026-03-29 10.54.47.png]]

词法分析

从左到右一个字符一个字符地读入源程序,并进行扫描和分解,识别出单词(或称为符号)

类别:

  • 标识符
  • 保留字
  • 算符
  • 界符

语法分析

在词法分析的基础上将单词序列分解为各类语法短语,可以表示成语法树

![[images/截屏2026-03-29 10.57.51.png]]

语法分析依据语言的语法规则,确定输入串是否构成一个在语法上正确的程序

程序的结构

通常由递归规则表示

  1. 任何标识符是表达式
  2. 任何常数是表达式
  3. 若表达式 A 和表达式 B 都是表达式,则以下都是表达式: 4. 表达式 A + 表达式 B 5. 表达式 A x 表达式 B 6. (表达式 A)

语义分析

审查源程序有无语义错误,为代码生成阶段收集类型信息。

进行类型审查,审查每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误

![[images/截屏2026-03-29 11.20.18.png]]

语义处理节点:inttoreal

中间代码生成

有的编译程序会将源程序变成一种内部表示形式,称为中间代码

中间代码:结构简单、含义明确的记号系统

常见形式:四元式

$$
(\text{operator},\text{object1},\text{object2},\text{result})
$$

代码优化

对中间代码进行变换和改造,使得目标代码更加高效

目标代码生成

将中间代码变换为特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码

编译程序的结构

![[images/截屏2026-03-29 14.04.00.png]]

解释程序

解释程序接受某个语言的程序并立即运行这个源程序。是一个个地获取、分析并执行源程序语句,一旦一个语句分析结束,源程序便开始运行并且生成结果

![[images/截屏2026-03-29 14.06.39.png]]

存储组织

编译程序:

  • 编译:存储源程序和目标代码,以及编译所用的表格
  • 运行:存储目标代码和数据

解释程序:

  • 源程序、符号表始终存放在存储区中

![[images/截屏2026-03-29 14.09.19.png]]

解释程序的效率低于编译程序

PL/0 语言编译系统

系统构成

PL/0 由编译程序和解释程序组成

  • PL/0 编译程序:将 PL/0 源代码转换为类 P-code 程序(中间代码)
  • PL/0 解释程序:解释执行上一步生成的代码

![[images/截屏2026-03-29 14.10.45.png]]

编译程序可由任意语言书写

![[images/截屏2026-03-29 14.12.46.png]]

PL/0 语言

程序结构

![[images/截屏2026-03-29 14.14.20.png]]

  • 常量说明必须在开始
  • 程序结尾需要有 . 标记
  • 循环:while
  • if thenelse
  • 无数据类型,均为 int

保留字

const var procedur begin end odd if then call while do read write

运算符

+ - * / < > <= >= # = :=

界符

( ) , ; .

EBNF

![[images/截屏2026-03-29 14.15.53.png]]

  • <>:中文表示语法单元;英文表示词法单元
  • ::=:左部语法单位由右部定义
  • |:表示或
  • {}:0 或任意多
  • []:0 或 1

类 P-code 语言

![[images/截屏2026-03-29 14.28.21.png]]

PL/0 编译程序

PL/0 编译程序采用单遍扫描方式的编译过程,由以下 3 个独立的过程组成:

  • 词法分析程序
  • 语法语义分析程序
  • 代码生成程序

![[images/截屏2026-03-29 14.29.32.png]]

驱动代码

以语法语义分析程序为核心,不断调用词法分析程序 getsym() 获取下一个单词,调用代码生成程序生成类 P-code 代码,在需要报错时调用 error() 函数

语法语义分析程序执行自上而下的分析过程,采用递归下降分析/翻译子程序的构造方法,每个语法单元对应一个子程序

interpret() 顺序读取类 P-code 指令并逐条解释执行