目标代码生成是编译程序的最后一个工作阶段。其任务是把先行阶段所产生的中间代码转换为相应的目标代码。

对于一个好的代码生成程序来说,通常我们要求它至少能做到如下两点:第一,使所生成的目标代码尽可能的短。第二,能较充分地发挥目标计算机可用资源的效率,如尽可能地使用执行速度较快的指令;充分利用计算机的寄存器或变址器,以节省访问内存的时间;等等。

1、目标代码的形式

代码生成程序所输出的目标程序可以有如下三种形式:

( 1 )、具有绝对地址的机器语言程序;

( 2 )、可浮动的机器语言程序;

( 3 )、汇编语言形式的程序。

应当说第一种形式的目标代码最为有效,因为它们在存储空间中有固定的位置,一旦产生出此种形式的目标程序之后,便可直接投入运行。其缺点是不能独立地完成源程序各程序块的编译,即使是供源程序调用的子程序也必须同时进行编译,因而灵活性较差。通常是在程序较短,而调试工作量较大的情况下,采用此种方式。

       第二种形式的目标程序由若干个目的模块组成,各个模块中都包含目标程序中的一部分代码,且这些代码可在存储空间进行浮动(即可将它们装入到存储空间的任何位置)。此外,在各目的模块中还含有一些连接信息(如本模块需引用的其它模块中的符号名或子程序入口名)。所以,对于此种形式的目标代码,需经过连接装入程序把它们和所需的运行子程序的目的模块连接起来之后,才能投入运行。这种目标代码结构无疑有较大的灵活性,故为许多编译程序所采用,惟执行连接装入程序本身需耗费一些时间。

       第三种形式的目标程序是让代码生成程序产生汇编语言形式的目标程序,比前两种方式容易实现一些,但需在编译完毕之后额外增加一个汇编目标程序的阶段。所以,尽管此种方式有某些优点,但并不是一种最好的方案。