代码优化
优化的分类:
机器无关优化:针对中间代码
机器相关优化:针对目标代码
局部代码优化:单个基本块范围内的优化
全局代码优化:面向多个基本块的优化
常用优化方法:
删除公共子表达式
如果表达式xopy已经被计算过,且到现在变量值未改变,称为公共子表达式,可以将他删除,避免重复计算
我们发现,t7和t10是重复计算的,而且变量值没有改变,叫做公共子表达式
同时,t2到t6的i也没有改变,t4到t8的j也没有改变,因此可以将t6和t8删除
删除无用代码
删除无用代码
复制传播:在复制语句x = y后尽可能的用y代替x
更改后,x = t3没有在本块中使用,也没有在其他块中使用,成为了无用代码,可以删除
常量合并
推导出一个表达式的值是常量,运用常量来代替这个表达式
代码移动
不管循环执行多少次都得到相同的表达式移动到循环之外
强度削弱
用较快的操作代替较慢的操作,+代替*,-代替/
删除归纳变量
归纳变量步调一致,可以删除为一个
基本块的优化(局部优化)
先把一个基本块转换为一个无环有向图(DAG)
从DAG上删除所有没有附加活跃变量的根节点,可以消除无用节点进而删除无用代码
题型补充
1.正则表达式转NFA
特殊的,如果R = A*,可以写成如下形式,*代表可能有任意个A
如果R = (A | B)*,表示方法为
2.NFA转换为DFA
先把正规式转换为NFA,再把NFA转换为DFA,最后进行最小化
转换NFA到DFA的方法是列表,看可以输入什么,从头开始看,将可以相通的放在一起即可
例如,我们转换好的NFA假设如下
现在我们从起点开始,进行构建
可以互通的就放在一起,最后I中的式子就是我们新的节点,然后就可以的出来了
3.NFA的最小化
进行状态的划分,把相同的状态分为一类,例如上图的1,3,4都是终止状态,就可以放在一起,最后得出结果
4.LL(1)文法
消除左递归(直接消除左递归,提取左因子),计算First集和Follow集,对于一个式子可以推出多种结果的式子进行分析,满足交集为空,即为LL(1)文法
例题:
本题目不需要消除左递归,因此直接求First和Follow集
判断是否为LL(1)文法,可以列出LL(1)表格,如果对应的只有一个式子,就是LL(1)文法,或者可以求SELECT集合,判空集
给出LL(1)文法让我们输入字符串分析
4.LR(0)自动机
A → aAd | aAb | ε
文法增广
构造自动机
LR(0)分析表如下
有重复内容,不是LR(0)文法,因此我们需要构建SLR(1)分析表
5.SLR(1)分析表
求左式的Follow值
写表
6.对输入串进行LR(0)或者SLR(1)分析
7.短语,直接短语,句柄
G[E]:
E→E+E | T
T→T*F | F
F→i | (E)
求T*F + i的短语,直接短语,句柄
8.三地址码
x+y*z 这样的源语言表达式要被翻译成
t1 = y*z;
t2 = x + t1;
x = t2;