标签:
杂谈 |
分类: 编译原理 |
编译原理--四元式优化
最近我在为公司的一个三维引擎系统设计一个脚本,本来是考虑用Python的,但考虑到功能不需要那么强大,并且考虑到需要针对系统进行特别优化,最终还是决定自己设计
一个编译系统,语法类似于C。
代码编译时经过词法分析、语法分析最后就是语义分析了。语义分析一般时间程序语言转化为四元式或者三元式。一般生成的四元式都不是最优的,需要对其进行优化,在这
儿我把握在做这个编译系统时遇到的优化问题列在下面:
1,赋值语句优化
比如: a = b+c;
编译的规程是b与c相加存入到一个临时变量中,再把这个临时变量赋值给a。四元式如下:
+ , tmp , b , c
= , a , tmp,
这两个四元式显然可以合并为如下形式:
+ , a , b , c
这种情况和容易发现,形如 = , a , tmp ,这样的四元式是肯定可以和别的四元式合并的,因为编译过程中产生的临时变量只能被使用一次。
2,跳转语句优化
比如: if(a>b)
c=2;
对应的四元式如下:
> , tmp , a ,
b ①
JZ, 4 ,
tmp, ② // JZ : jump if
iszero
= , c
,2,
③
other
formula ④
这个可以和上面的问题归纳为一类,都是和临时变量有关,优化后应该如下:
JBG , 3 , a , b ①
// JBG: jump if a > b
= , c
,2, ②
other
formula ③
这个优化分为两个步骤,一消除不必要的临时变量,二更改跳转语句序列。
3,For循环语句优化
for语句的优化相对前面两种情况稍微复杂一点,还是举个例子说明:
比如:for(int i=0;i<10;i++) a =
a+i;
四元式:
=, i,
0, ①
<,
tmp, i, 10 ②
JNZ, 7,
tmp, ③
JMP, 10,
, ④
=, i,
i, 1 ⑤
JMP, 2,
, ⑥
+, tmp, a,
i ⑦
=, a,
tmp, ⑧
JMP, 5,
这两个四元式显然可以合并为如下形式:
这种情况和容易发现,形如 = , a , tmp ,这样的四元式是肯定可以和别的四元式合并的,因为编译过程中产生的临时变量只能被使用一次。
这个优化分为两个步骤,一消除不必要的临时变量,二更改跳转语句序列。