目标代码的生成与机器的硬件环境有关,所以有些语言不能跨平台的原因就在于编译时需要了解机器的寄存器等资源,不同的机器寄存器不同,导致代码需要二次编译。
java语言由于是半编译半解释的语言,之所以能跨平台是因为在编译的阶段只生成java虚拟机能识别的中间代码,而不是目标代码,再由Java虚拟机来解释成机器码。
目标代码的生成需要获取寄存器的个数和使用情况,这里需要用到寄存器选择算法。
为了使目标代码的执行效率更高,需要设置两个数据结构:待用信息,活跃信息。在基本模块之内,记录各个变量的使用情况,然后根据待用信息来确定是否将寄存器的数据替换或者保留。活跃信息是在模块之外确定数据否需要保留或者替换。
代码优化包括:代码外提,删除无用代码,删除公共子表达式等。
代码外提:主要在循环结构中使用,这样能成倍的提高代码的运行效率。
删除公共表达式: 对于相同的三地址代码可以进行合并,删除。
删除无用代码: 对于一些临时变量和没有使用的代码可以进行删除。
程序流图的画法:
DAG图代码优化方法: