Legend Since 1984
Cruising between Fantasy and Reality...

Thursday, November 23, 2006

Pallyc 1.5 Published

最近一直在忙申请的事情,反复改PS啦,收集学校资料啊,网申啊,找老师签推荐信啊,邮寄材料啊什么,忙得不亦乐乎。不过也没有冷落Pallyc项目。眼看申请的评审就要开始,Pallyc是我进行套磁行动的法宝。

Pallyc进化到1.5版的主要工作在于对4元式结构的处理上。在1.0中虽然定义了基本的4元式格式,但是却是不完善的。首先,没有考虑同名的子函数名——这将导致两个同名的二级子函数在4元式中具有相同的名字。针对这一情况,1.5版本中重新构建了存放4元式的类:将原来线性的四元式结构改造成二级结构——将原来的类CIntermediateCode重名命CIM_Segment,在外部再新建一个类CIM_Code作为CIM_Segment的容器。CIM_Segment,顾名思义,其意义不再代表整个4元式代码,而只是一个代码片断——更准确的说是代表一个函数体(全局函数或局部函数)中的代码;而CIM_Code既然是作为CIM_Segment的容器,也就代表了所有的4元式代码。对每一个局部函数,按照其嵌套层次重新命名,由于同一个嵌套层次下不会出现同名的函数,这种方法解决了4元式中函数名重复的问题。

除了改变4元式的结构,4元式的内容上也得到了较大的优化。首先为了解决优化中增添语句代来的转向语句地址的频繁更改,1.5不再使用1.0中那种绝对地址方式,而为每一个可能被跳转到的语句加上label,同时记录每个语句作为跳转目的语句的引用次数。在后续的优化中,如果某条跳转语句被删除,作为其跳转结果的语句的引用次数相应减1,如果引用计数变为了0,将删除这条语句上的标签label。对于四元式将优化两种情形:

  1. 紧邻着的(j*, , , Ln) Ln:(any value)语句将被替换为(any value),是否保留标签Ln取决于Ln被引用的次数
  2. 紧邻的(op, a, b, @n) (=, @n, , c)将被替换为(op, a, b, c),op代表算术运算符

以上两种情形在四元式生成完之后的优化过程中进行。而对立即数的优化则应该放在处理语义动作序列的过程中执行。其原则尽可能的在编译阶段处理立即数的计算步骤,四则算术运算、数组下标偏移量计算受到了较大的改造。

在其他一些细节方面,1.5解决了SLR(1)语法分析器不能处理if-else结构的问题;重新定义了一些四元式的格式,如下表所示:


符号意义
$ 立即数
@ 相对ebp地址
& 临时变量
function_start: 指示函数的开始

Pallyc Project: http://www.pallyc.org

Labels:

0 Comments:

Post a Comment

<< Home