加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

编译原理 四元式优化

(2007-02-03 20:40:03)
标签:

杂谈

分类: 编译原理
编译原理--四元式优化
    最近我在为公司的一个三维引擎系统设计一个脚本,本来是考虑用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,     
       JMP, 2,        
       +, tmp,   a,  
       =,   a, tmp,      ⑧ 
       JMP, 5,        
       other formula   
    经过1,2步优化后如下:
       =,   i,   0,       ① 
       JLT, 6,   i, 10   ② //
       JMP, 8,       
       =,   i,   i,     
       JMP, 2,       
       =,   a,   a,   
       JMP, 4,        ⑦ 
       other formula  
一共7条四元式中有4个跳转语句,之所有这样的原因是,我们先分析了for中的i++,而它要在每个循环的最后运行,所有对可对其进行如下优化: 
       =,   i,   0,       ① 
       JBE, 6,   i, 10   ② {<,tmp,1,10  | JZ,6,tmp,} // JBE jump if >=
       =,   a,   a,   
       =,   i,   i,     
       JMP, 2,        ⑤ 
       other formula  
看到这儿可能你会联想到:在pascal的for语句中不能改变循环变量的值,其目的是在分析for时,其范围和步进都是固定的,不让改变循环变量的值那整个循环体的循环次数就是
固定值它就可以进行根特别的优化,并且也不会有上面这个优化问题。我以后会写一个关于C和Pascal在实现一些语句的细微差别。
以上三种情况都可以归纳为语句循序和合并的问题。还有一些更深层次的优化:
    1,条件语句和逻辑表达式的优化
    2,case语句的优化
    3,递归(向前调用)函数的优化
这几个问题后面我计划一个一个的单独的来写,希望对这些问题感兴趣的朋友关注我的Blog。
 
 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有