资源描述:
《《编译原理实践及应用》ppt教学课件第8章代码生成》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、代码生成第八章本章要求主要内容:目标代码生成的任务,设计目标代码生成器需要考虑的主要问题,简单的代码生成器,Sample语言目标代码生成器的设计重点掌握:代码生成要考虑的主要问题,寄存器的分配,基本块的代码生成,以及从DAG生成代码代码生成所处的位置8.1概述代码生成器的作用各种代码的形式中间代码:后缀式,三地址代码,四元式符号表中的项:名字,类型,嵌套深度,偏移量目标代码:绝对机器代码,可重定位代码,汇编代码生成器的输出必须是正确和高质量的产生最优化代码的问题是不可判定的8.2代码生成器设计中的问题代码生成器依赖于目标机器
2、和操作系统要充分发挥目标机器的能力:充分利用目标机器的资源代码生成器固有的问题存储管理指令选择寄存器分配计算次序选择可移植的代码生成器机器描述代码生成器的输入符号表信息决定中间代码中名字所代表的数据对象的运行地址偏移量作用域可能在动态时刻作为调试信息存在中间代码代码生成的很多技术是可以用于不同的中间代码代码生成前,中间代码记录了足够详细的程序信息名字的值可以表示为目标机器能够直接操作的数类型检查已经完成明显的语义错误已经发现代码生成器的输出:目标程序绝对机器语言可以放在内存中固定地方,并立即执行小程序、需要迅速编译和执行可重
3、定位的机器语言程序可以分为多个目标模块,分别编译需要连接装配器将一组可重定位模块一起装入执行需要额外的开销,但灵活:可分别编译子程序和从目标模块中调用其它先前编译好的程序模块如果目标机器不能自动处理重定位,则编译器必须提供显式的重定位信息给装配程序汇编语言代码生成的过程容易避免了重复汇编器的工作存储管理把程序中的名字映射到运行时的目标对象的地址是由前端和代码生成器共同完成的语言中过程的语义决定了运行时刻名字如何与存储空间相联系对名字的引用通过符号表记录了名字在过程数据区的相对地址所需要的存储空间运行时活动记录的管理运行时活动
4、记录的分配和释放作为过程调用和返回序列的一部分call(调用),return(返回)halt(暂停),其它语句存储管理分静态、栈式和堆式存储分配一个代码生成器的输入其中,arr,i,j是过程s中定义的数据;buf和n是过程p定义的数据三地址代码/*s的代码*/action1callpaction2halt/*p的代码*/action3returnS的活动记录返回地址arrijp的活动记录返回地址bufn0:4:56:60:0:4:84:指令地址的决定通过一个计数器决定每个指令的地址标号的处理:j:gotoi/*j是当前语句的
5、号码*/如果i小于ji出现在j之前,目标地址是i对应的三地址代码的第一条指令地址如果i大于ji出现在j之后,目标地址此时不可知,可以利用回填的技术解决指令选择目标机器指令系统的性质决定了指令选择的难易程度指令系统的一致性和完整性是重要因素如果目标机器不能以一致的方式支持各种数据类型,则每种例外都要专门的处理指令的速度和机器的特点是另一些重要的因素如果不考虑目标程序的效率,则指令选择是直截了当的代码的质量取决于它的执行速度和长度可以从多种指令中选择合适的:a=a+1MOVa,R0ADD#1,R0INCaMOVR0,a时间信息对
6、代码序列是重要的,但不是任何时候都精确的指令选择的例子a:=b+cd:=a+eMOVb,R0ADDc,R0MOVR0,aMOVa,R0ADDe,R0MOVR0,d逐条语句地产生代码的方法常常产生低质量的代码寄存器分配利用寄存器放置运算对象的指令比运算对象在内存中的指令短些执行也快些充分利用寄存器对高质量的代码生成是重要的寄存器片内CACHE片外CACHE主存外存寄存器优化局部性优化寄存器分配(续)寄存器使用的两个子问题寄存器分配:为程序的某一点选择驻留在寄存器中的一组变量寄存器指派:挑出变量将要驻留的具体寄存器寄存器分配的最
7、优化是NP完全的特定要求的满足计算次序选择计算执行的次序会影响目标代码的效率选择最佳次序是一个NP完全问题MOVR1,&AMOVR1,&AADDR1,R0MULR2,R3MULR2,R3ADDR1,R0ADDR1,R2ADDR1,R2代码生成的途径代码生成器的目的正确的代码:最重要的目标易于实现、调试和维护代码生成需要多方面的信息流信息依赖信息……代码生成的可移植性也是要考虑的一个问题将机器相关部分和不相关部分区分开8.3目标机器熟悉目标机器和它的指令系统是设计一个好的代码生成器的先决条件但不存在通用的有效的机器描述目标机器
8、字节可寻址机器,4字节为一个字有n个通用寄存器R0,R1,…,R(n-1)指令形式:机器指令形式(opdestination,source)ADDRd,Rs//d+sSUBRd,Rs//d-sMOVRd,Rs//sd机器指令开销(cost),不同的操作开销不同MOVR,M开销2ADD#1