第一部分:第十三章:编译程序的构造
1.为特定的源语言和目标机环境书写编译程序,是目前常用的编译程序构造途径,尤其是对编译程序的执行效率以及目标机代码的质量要求较高的应用环境。
2.如果一个编译程序是用高级语言或编译程序的构造工具开发的,那么它的各种性能将会大大提高。
3.《编译程序的自展技术》由于一个编译程序的功能是把某种高级语言的源程序翻译成目标机的机器语言(或汇编语言),目标机只能执行它自己的机器语言,因此最早的第一个高级语言的编译程序必须用目标机的汇编语言或机器语言书写。而一个结构较复杂庞大的高级语言的编译程序,若完全用汇编语言或机器语言书写会有种种不便之处,而用子站技术则可以很好地解决这个问题。自展的思想是先用目标机汇编语言或机器语言书写源语言的一个子集的编译程序,然后再用这个子集作为书写语言,实现源语言的编译层序。
4.交叉编译程序: 简单地说,交叉编译就是在一个平台上(通常称为主机平台)生成另一个平台上(称为目标平台)的可执行代码。所谓平台,实际上包含俩个概念:体系结构和操作系统。同一个体系结构可以运行不同的操作系统上。
5.编译程序成分一般包括词法分析器、语法分析器、语义检查、代码生成程序、代码优化器、机器描述工具和目标机模拟器。
6.可重定向编译程序: 普通的编译程序将源程序翻译成特定目标机的汇编代码或目标代码。而可重定向编译程序能够不同目标机,生成相应的目标代码。如:lcc编译程序,可以将ANSI C编译成MIPS /SPARC/ X86 等目标机的汇编代码。在可重定向编译程序中,将于目标机相关的部分单独编写成不同的模块,根据不同的目标机调用不同的模块。可重定向编译程序是一个结构定义良好的编译程序。机器相关的部分被封装起来前端通过间接调用的方式与机器相关的部分发生联系。前端、后端以及前后端接口定义良好。
有很多针对不同机型的可选后端对于不同的后端,前端基本上不用修改,做到了最大限度的代码复用。
7.中间表示技术: 程序代码的中间表示主要是用于实现优化,传统的中间表示(如: 三元式,四元式、树和DAG等)虽为循环优化、数据控制了分析等编译任务提供了适当的模型。
8.机器描述技术:
9.高级程序设计语言与其支撑的机器指令集合体系结构之间存在着灵活的、多变的、复杂的对应关系,利用代码生成程序将高级语言程序(通过中间表示)转化为等价的目标程序是不可缺少的。
10.目标机描述与目标代码生成的接口技术:
编译程序的前端和后端:
11.有关GCC:
12.GNU CC 之所以有如此广泛的移植和使用,其原因除了它的源代码公开之外,更重要的原因应归于其独特的结构。其清晰的前端语法树结构、高度概括的抽象机中间语言、简洁的机器描述等为快速的实现多语言开发、多平台移植提供了有力的支持。
13.GCC的总体架构:
GCC编译系统由与源语言相关的前端、与源语言无关的后端和目标机描述三部分组成,对于其支持的每种源语言,存在一个独立的、与语言相关的语发分析器。利用这些语法分析器,对不同的源语言产生相同的分析结果------语法树。与源语言无关的后端是GCC编译程序的主题部分,他将语法树转换成称之为RTL 的中间代码,然后对中间代码进行各种优化并最终生成汇编代码器的输入文件;机器描述由目标机描述宏文件和机器描述文件俩部分组成,它们分别描述目标机操作系统和目标机体系结构。
13.GCC的中间表示,GCC采用了双层中间表示。高层中间表示为语法树,底层中间表示为RTL.RTL的语法结构类似于LISP语言的表达式,它实际上表示的是一种树结构。RTL 设计的十分简洁、灵活,它仅有115种操作码,其中真正用于编译内部的只有91种,另外的24种则只出现在机器描述中。
GCC中间表示中每条RTL指令实际上都表示者目标机的一条指令。源程序中的一个处理单元(函数或程序段)中所有的RTL 指令形成 了一个完整的结构。
14.GCC的机器描述:GCC的机器描述有俩部分组成:一个是描述目标机各种参数的宏定义头文件machine.h 另一个是描述目标机指令的机器描述文件machine.md 这里machine泛指处理机的芯片名
宏定义头文件:
machine.h头文件主要内容包括:
1.编译驱动程序的宏定义。
2.存储器的编址信息
3.各种类型数据对象的存储约定
4.寄存器的个数,种类、名称及igzhogn寄存器的用途约定
5.栈的安排、函数入口、出口及调用约定
6.有关汇编语言输出的宏定义。
7.目标机操作系统所支持的目标文件格式或调式输出格式等
指令样板:
1.指令样板,描述目标机所支持的每一条指令相应的RTL ,指令形式和汇编输出形式
指令样板有俩个重要作用: 用于构造中间语言RTL中的指令和确定汇编代码的输出格式。它是支持多平台思想得以实现的核心部分。前面一提到,RTL 中每一条指令与目标机的指令是相对应的,即有一条RTL指令则有一条与之对应的目标机指令。
GCC在产生RTL 中间语言时会遇到俩个问题: 1.对于某个运算,应当生成什么样的RTL 指令才是目标机所能支持的指令?
2.对于一条给定的RTL 指令,它所对应的汇编指令格式是怎样的?
指令样板正是用来解决这俩个问题的。
机器藐视文件中必须给出这些标准运算所对应的RTL 指令样板,这些指令样板建立了抽象目标机与实际目标机间的对应关系。在RTL 生成遍,当需要生成某条标准运算的RTL指令时,由标准运算名去查看机器描述,便可得到相应的RTL 模板,代入具体的操作数,并产生了一条RTL指令。
GCC代码生成与机器描述的接口
对于每一个标准运算,GCC内部有一张操作表。
当GCC需要生成一条RTL 指令的汇编代码时,首先调用函数recog()得到与之相匹配的指令样板编号,依次编号为索引,通过quinsn[ ]或insn [ ]_outfun[ ]调用output-n ,得到汇编输出模板,然后根据汇编模板的控制要求输出汇编指令。
‘