编译原理(1)
引论
程序设计语言及编译
程序设计语言
- 机器语言
- 汇编语言
- 高级语言
编译程序
编译程序是现代计算机系统的基本组成部分.
从功能上看,一个编译程序就是一个语言翻译程序,它把一种语言(称作源语言)书写的程序翻译成另一种语言(称作目标语言)的等价的程序.
编译程序:A语言—–>B语言的程序(两者逻辑上等价)
编译程序:高级语言 ——->低级语言
解释程序:边解释边执行
源程序执行途径
解释程序(Interpreter)
- 不产生目标程序文件
- 不区别翻译阶段和执行阶段
- 翻译源程序的每条语句后直接执行
- 程序执行期间一直有解释程序守候
- 常用于实现虚拟机
编译过程概述
- 词法分析
- 语法分析
- 语义分析
- 中间代码生成
- 代码优化
- 目标代码生成
编译过程与语言翻译的对比
词法分析:扫描源程序—–>区分单词—–>换为属性字
语法分析:单词序列—–>语法短语(程序、表达式、条件语句……)检查语法错误,若无错误,给出正确的语法结构。这种语法短语也称语法单位,可表示成语法树。
语义分析与中间代码生成:根据语法结构,分析含义,产生中间代码。
中间代码多采用三地址指令或四元式形式。
| 算符 | 左操作数| 右操作数 |结果 |
| ————- |:————-:| —–:|—–:|
代码优化:时间和空间
目标代码生成:中间代码—–>低级语言代码
编译程序结构
- 表格管理
- 出错处理
源程序错误:
- 语法错误:不符合语法(或语义)规则的错误,可在词法分析或语法分析时检测。
- 语义错误:不符合语义规则的错误,在语义分析(或运行时)可检测。
遍(趟)pass
- 编译的若干阶段通常以一遍来实现,每遍读一次输入文件、产生一个输出文件。
- 多个编译阶段可以组合为编译的一遍,并且每一遍中的各编译阶段的工作可以相互交错。
编译程序的生成
- 移植
- 自编译
T型图
- S:编译程序所实现的源语言
- T:目标语言
- I:编译程序的实现语言
编译程序与T型图
(M机器上运行的)本地编译器
(M机器上运行的)交叉编译器
用已有语言L1实现新语言L2
方法:
- 用L1语言编写A机器的L2语言编译程序
- 将该L2语言的编译程序用L1语言的编译程序进行编译
移植:
用A机器上已有的语言L编写一个在B机器上运行的语言L的编译程序。方法:
- 用L编写在A机器上运行的产生B机器代码的L编译程序源程序X
- 用L编译程序对X进行编译后,得到一个能在A机器上运行的产生B机器代码的编译程序Y(交叉编译程序)
- 再用Y对X进行编译,得到能在B机器上运行的L语言的编译程序