计算机程序设计语言及编译
高级语言(High Level Language)
类似于数学定义或自然语言的简洁形式
接近人类表达习惯
不依赖于特定的机器
编写效率高
汇编语言(Assembly Language)
引入助记符
依赖于特定机器,非计算机专业人员使用受限制
编写效率低
机器语言(Machine Language)
可以被计算机直接理解
与人类表达习惯相差很大
难记忆
难编写、难阅读
易写错
编译: 将高级语言翻译成汇编语言或机器语言的过程
编译器在语言处理系统中的位置
起始位置+相对位置=绝对地址
源程序
预处理器(Preprocessor):把存储在不同文件中的源程序聚合在一起,把被称为宏的缩写语句转换为原始语句
经过预处理的源程序
编译器
汇编语言程序
汇编器(Assembler)
可重定位(Relocatable)的机器代码:在内存中存放的起始位置L不是固定的
链接器(Linker)/加载器(Loader):加载器修改可重定位地址,将修改后的指令和数据放到内存中适当位置。库文件,其它可重定位目标程序。链接器:将多个可重定位的机器代码文件(包括库文件)连接到一起,解决外部内存地址问题。
目标机器代码
编译系统的结构
词法分析(Lexical Analysis)
语法分析(Syntax Analysis)
语义分析(Semantic Analysis)
![[编译器的结构.png]]
词法分析/扫描(Scanning)
词法分析的主要任务
从左向右逐行扫描源程序的字符,识别出各个单词,确定单词的类型。
将识别出的单词转换成统一的机内表示——词法单元(token)形式
token:<种别码,属性值>
单词类型
关键字:一词一码(种别码)
标识符:多词一码(种别码)
常量:一型一码(种别码)
运算符:一词一码或一型一码(种别码)
界限符:一词一码(种别码)
语法分析(Parsing)
语法分析器(parser)从词法分析器输出的token序列种识别出各类短语,并构造语法分析树(parse tree)
语法分析树描述了句子的语法结构
语义分析
语义分析的主要任务
- 收集标识符的属性信息
- 种属(Kind)
- 简单变量、复合变量(数组、记录、…)、过程、…
- 类型(Type)
- 整型、实型、字符型、布尔型、指针型…
- 存储位置、长度
- 值
- 作用域
- 参数和返回值信息
- 参数个数、参数类型、参数传递方式、返回值类型、…
- 种属(Kind)
字符串表
符号表是用于存放标识符的属性信息的数据结构
- 语义检查
- 变量或过程未经声明就使用
- 变量或过程名重复声明
- 运算分量类型不匹配
- 操作符与操作数之间的类型不匹配
- 数组下标不是整数
- 对非数组变量使用数组访问操作符
- 对非过程名使用过程调用操作符
- 过程调用的参数类型或数目不匹配
- 函数返回类型有误
中间代码生成及编译器后端概述
地址可以具有如下形式之一
- 源程序中的名字(name)
- 常量(constant)
- 编译器生成的临时变量
常用的中间表示形式
- 三地址码(Three-address Code)
- 三地址码由类似于汇编语言的指令序列组成,每个指令最多有三个操作数(operand)
- 语法结构树/语法树(Syntax Trees)
三地址指令的表示
- 四元式(Quadruples)
- (op, y, z, x)
- 三元式(Triples)
- 间接三元式(Indirect triples)
三地址指令序列唯一确定了运算完成的顺序
编译器的结构
目标代码生成以源程序的中间表示形式作为输入,并把它映射到目标语言
目标代码生成的一个重要任务是为程序中使用的变量合理分配寄存器
- 代码优化
- 为改进代码所进行的等价程序变换,使其运行得更快一些、占用空间更少一些,或者二者兼顾
- 分为机器无关代码优化器和机器相关代码优化器