【摘要】:目标代码生成阶段的任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。例如,使用两个寄存器,如图6.56所示的中间代码可生成如图6.57所示的某汇编代码。图6.57目标代码第一条指令将id3的内容送至寄存器R2,第二条指令将其与实常数10.0相乘,这里用#表明10.0处理为常数,第三条指令将id2移至寄存器R1,第四条指令加上前面计算出的R2中的值,第五条指令将寄存器R1的值移到id1的地址中。
目标代码生成阶段的任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。这是编译的最后阶段,它的工作与硬件系统结构和指令含义有关,这个阶段的工作很复杂,涉及硬件系统功能部件的运用、机器指令的选择、各种数据类型变量的存储空间分配以及寄存器和后缓寄存器的调度等。
例如,使用两个寄存器(R1和R2),如图6.56所示的中间代码可生成如图6.57所示的某汇编代码。
图6.57 目标代码(www.daowen.com)
第一条指令将id3的内容送至寄存器R2,第二条指令将其与实常数10.0相乘,这里用#表明10.0处理为常数,第三条指令将id2移至寄存器R1,第四条指令加上前面计算出的R2中的值,第五条指令将寄存器R1的值移到id1的地址中。这些代码实现了本节开头给的源程序片段的赋值。
前面说过,上述编译过程的阶段划分是一种典型的处理模式,事实上并非所有的编译程序都包括这样几个阶段。有些编译程序并不要中间代码,即不存在中间代码生成阶段;有些编译程序不进行优化,优化阶段即可省去;有些最简单的编译程序只有词法分析、语法分析、语义分析和目标代码生成。
编译程序的另外两个重要的工作是表格管理和出错处理。它们与上述6个阶段都有联系。编译过程中源程序的各种信息被保留在种种不同的表格里,编译各阶段的工作都涉及构造、查找或更新有关的表格,因此需要有表格管理的工作;如果编译过程中发现源程序有错误,编译程序应报告错误的性质和错误发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能继续被编译下去,有些编译程序还能自动校正错误,这些工作称为出错处理。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
有关计算机导论的文章