计算机程序设计语言及编译:
编译:将高级语言(源语言)翻译成汇编语言或机器语言(目标语言)的过程
编译器在语言处理系统中的位置:
预处理器:把存储在不同文件中的源程序聚合在一起,把被称为宏的缩写语句转换为原始语句
可重定位(Relocatable):在内存中存放的起始位置L不是固定的
加载器:修改可重定位地址;将修改后的指令和数据放到内存中适当的位置
连接器:将多个可重定位的机器代码文件(包括库文件)连接到一起,解决外部内存地址问题
库文件:其他可重定位目标程序
起始位置+相对地址=绝对地址
编译器的结构:
分析部分/前端(front end):与源语言相关
综合部分/后端(back end):与目标语言相关
词法分析/扫描(Scanning):
词法分析的主要任务:从左向后逐行扫描源程序的字符,识别出各个单词,确定单词的类型。将识别出的单词转换成统一的机内表示--此法单元(token)形式
token:<种别码,属性值>
语法分析(parsing):
语法分析器(parser)从词法分析器输出的token序列中识别出各类短语,并构造语法分析树(parse tree)
语法分析树描述了句子的语法结构
语义分析的主要任务:
1、收集标识符的属性信息
- 种属(Kind)
- 简单变量、符合变量(数组、记录、……)、过程、……
- 简单变量、符合变量(数组、记录、……)、过程、……
- 类型(Type)
- 整型、实型、字符型、布尔型、指针型……
- 整型、实型、字符型、布尔型、指针型……
- 存储位置、长度
- 值
- 作用域
- 参数和返回值信息
- 参数个数、参数类型、参数传递方式、返回值类型
2、语义检查
- 变量或过程未经声明就使用
- 变量或过程名重复声明
- 运算分量类型不匹配
- 操作符与操作数之间的类型不匹配
- 数组下标不是整数
- 对非数组变量使用数组访问操作符
- 对非过程名使用过程调用操作符
- 过程调用的参数类型或数目不匹配
- 函数返回类型有误
常用的中间表示形式:
三地址码(Three-address Code):三地址码由类似于汇编语言的指令序列组成,每个指令最多有三个操作数(operand)
语法结构树/语法树(Syntax Trees)
常用的三地址指令:
地址可以具有如下形式之一:
- 原程序中的名字(name)
- 常量(constant)
- 编译器生成的临时变量(temporary)
三地址指令的表示:
- 四元式(Quadruples):(op,y,z,x)
- 三元式(Triples)
- 简介三元式(Indirect triples)
编译器的结构:
- 目标代码生成以源程序的中间表示形式作为输入,并把它映射到目标语言
- 目标代码生成的一个重要任务是为程序中使用的变量合理分配寄存器
- 代码优化:为改进代码所进行的等价程序变换,使其运行得更快一些、占用空间更少一些,或者二者兼顾