📜  编译器设计中的目标代码生成

📅  最后修改于: 2021-06-28 07:21:29             🧑  作者: Mango

目标代码生成是编译器的最后阶段。

  1. 输入:优化的中间表示。
  2. 输出:目标代码。
  3. 执行的任务:注册分配方法和优化,汇编级代码。
  4. 方法:三种流行的寄存器分配和优化策略。
  5. 实现:算法。

    目标代码生成使用汇编语言处理,以将优化的代码转换为机器可理解的格式。目标代码可以是机器可读代码或汇编代码。优化代码中的每一行都可以映射到机器(或)汇编代码中的一行或多行,因此存在与它们关联的1:N映射。

    1:N对应

    通常假定计算是在称为寄存器的高速存储位置上执行的。由于寄存器比缓存快,因此对寄存器执行各种操作非常有效。编译器有效地使用了此功能,但是寄存器数量不多且价格昂贵。因此,我们应尝试使用最少数量的寄存器来降低总体成本。

    优化代码:

    Example 1 :
    L1: a = b + c * d
    
    optimization :
    t0 = c * d
    a  = b + t0
    Example 2 :
    L2: e = f - g / d
    
    optimization :
    t0 = g / d
    e  = f - t0
    

    寄存器分配:
    寄存器分配是指将程序变量分配给寄存器并减少进出寄存器的交换次数的过程。变量在内存中的移动非常耗时,这就是为什么要使用寄存器的主要原因,因为它们在内存中可用,并且它们是最快访问的存储位置。

    Example 1:
    R1Advantages :
    • 快速访问的存储
    • 允许对其执行计算
    • 确定性,因为它不会错过
    • 减少内存流量
    • 减少整体计算时间

    缺点:

    • 寄存器数量通常很少(最多几百Kb)
    • 寄存器大小是固定的,并且因一个处理器而异
    • 寄存器很复杂
    • 在上下文切换和过程调用期间需要保存和恢复更改