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

📅  最后修改于: 2021-09-28 09:26:37             🧑  作者: 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)
    • 寄存器大小是固定的,并且从一个处理器到另一个处理器不同
    • 寄存器很复杂
    • 需要在上下文切换和过程调用期间保存和恢复更改