国外精选视频:编译原理入门4

中间代码

在这里插入图片描述

TAC

三位址码是很多编译器都在用的中间表达形式
因为三位址码不特定于某台机器,中间代码的生成可以被认为是前端任务

抛开语言,我们来谈3地址码
对于三位址码,每一条赋值指令的右侧只能有一个操作符,总共最多有三个地址(等号右侧只能有一个操作符,比如t1=y+z,这里t1,y,z都是地址,它们指向了地址对应的内存数据)

在这里插入图片描述
三位址码指令依赖于符号标签来改变控制流程
在这里插入图片描述
三位址码简化了嵌套的控制流图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

反向修补:

编译器只需要通过遍历一次源码,就能生成三位指令序列

在最后机器码生成这一步之前,编译器可能会将三位地址码拆分为基本块
基本块是由那些始终放在一起执行的指令所组成的序列
基本块也被允许编译器去分析并改进程序中的流程控制,例如,可以从三位址码中消除多余的跳转指令
当最终生成二进制机器代码时,基本块优化可以让寄存器分配和将变量分配给寄存器更容易
对于一个程序的性能而言,一般讲常用的放在cpu,不常用的放在主页

变化1
在这里插入图片描述
变化2
在这里插入图片描述
变化3
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样他们跳转的是基本块而不是标签或者行号

这很关键,因为现在可以通过改变基本块内指令的顺序来尝试优化代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Bsic Block Optimisation

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

复写传播

常数折叠

猜你喜欢

转载自blog.csdn.net/weixin_44522477/article/details/112062257