编译器概述-寄存器分配的概念

下面是一段抽象汇编指令 

load a to r1

load b to r2

mult r1 r2 to r3

首先声明的是 这里为什么叫抽象汇编指令因为我们假设是有无限多的寄存器的 我们可以一直r1 r2 r3 r4 ……我们称这些寄存器为virtual register(虚拟寄存器) 而后端中的register allocation做的工作就是把这些虚拟寄存器映射到真实的寄存器上
其次这里发现r1和r2都存储着真实的变量(variable)a和b 而r3却是一个中转的临时变量(temporaries) 实际中的汇编是没有变量这个概念的 实际中只有寄存器和内存地址

在优化过程中 例如common subexpression elimination(CSE)就是会增加变量的数量来减少重复计算,一旦变量太多 就会增加寄存器的负担,导致一部分变量不能存在速度最快的寄存器中而是存在了内存中 就有可能会适得其反降低了代码运行速度

如何通过一个AST转换成抽象汇编指令呢 这里有一个特性是deepth first 只有先计算了最底层的a*b和c*d才能执行上一层的加法运算 只有执行完加法运算才能执行赋值运算

ILOC(intermidate language for optimizing compiler)编译器优化的中间语言

load a \rightarrow r1

loadAI r_{arp}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值