第十章代码生成•代码生成概述•构造代码生成程序的几种方法代码生成概述•代码生成阶段•构造代码生成程序要考虑的因素•一个简单的代码生成程序的构造代码生成器(程序)的位置•代码生成将经过语法分析或优化后的中间代码,转换成特定机器的目标代码。•代码生成器完成代码生成这一过程的程序称为代码生成器,如图所示。代码生成器的位置•代码生成器的输入–中间代码–符号表中的信息编译前端代码优化代码生成器符号表目标程序源程序中间代码中间代码•目标代码一般有三种形式:–能够立即执行的机器语言代码,所有地址均已定位–待装配的机器语言模块。当需要执行时,由连接装入程序把它们和某些运行程序连接起来,转换成能执行的机器语言代码–汇编语言代码。尚需经过汇编程序汇编,转换成可执行的机器语言代码返回构造代码生成器所要考虑的主要问题•代码生成所要考虑的主要问题–如何使生成的目标代码较短–如何充分利用计算机的寄存器,减少目标代码中访问存储单元的次数返回代码生成的主要成份•指令选择–寻找一个合适的目标机指令以实现给定的中间表示•寄存器分配–确定在程序的哪个点将哪些值放在寄存器中比较有益•指令调度–确定程序指令的执行顺序•三者的关系指令选择•如:中间代码a:=a+1:实现1:INCa实现2:LDR0,aADDR0,#1STR0,a•主要功能多数CPU的指令集合具有冗余性,也即,同一计算可用两个或多个不同的指令序列完成。指令选择器选择其中之一以产生最好的代码。•指令选择的基本原则–减小产生代码的尺寸–减小目标代码的执行时间返回指令选择(续)目标机器的地址方式地址方式汇编形式地址增加的开销直接地址方式MM1寄存器方式RR0间接寄存器方式*Rcontents(R)0索引方式c(R)c+contents(R)1间接索引方式*c(R)contents(c+contents(R))1a:=b+c1.MOVb,R0ADDc,R0cost=6MOVR0,a2.MOVb,aADDc,acost=6假定R0,R1和R2中分别存放了a,b和c的地址,采用:3.MOV*R1,*R0ADD*R2,*R0cost=2假定R1和R2中分别包含b和c的值,并且b的值在这个赋值以后不再需要,则还可有4.ADDR2,R1MOVR1,acost=3寄存器分配•通常情况下,指令在寄存器中访问操作数的开销要比在内存中访问小。且许多指令不能直接访问内存。如果操作数在内存中,需要显式地取入到寄存器中。由此可见,将经常使用的操作数保存在寄存器中是比较有利的。然而,寄存器是比较稀少的资源,计算机程序所需要的寄存器要比可用的寄存器多。寄存器分配负责确定在程序的哪个点将哪些值放在寄存器中...