1、实验三 中间的代码优化某些编译程序在中间代码或目标代码生产之后要对其进行优化,所谓优化就是对代码进行等价的变换。而变换后的代码运行结果与变换前的代码运行结果相同。而运行速度加快或占用内存空间减少。中间的代码优化就是对中间代码进行等价的变换。基本块的有向图 DAG(Directed Acyclic Graph)有向图中任何一条通路都不是环路,则称该有向图为无环路有向图,简称为DAG。一、 实验题目:中间代码的局部优化二、 实验目的:掌握局部优化方法、提高机器的运行速度三、实验内容:1 、构造基本块内的优化 DAG假设:(1) ni 为已知结点号,n 为新结点号;(2)访问各结点信息时,按结点号逆
2、序排序2、完成对下例三类表达式的优化(1)常值表达式的优化(2)公共表达式的优化(3)无用赋值的优化3、输出根据优化的 DAG 重组四元式四、设计概要:首先要实现表达式中间代码生成,采用递归下降子程序法实现。ET0 “push(SYN,w)”T“QUAT” TF1”push(SYN,w)”F “QUAT”Fi“push(SEM,entry(w)”|(E)其中:push(SYN,w)-当前单词 w 入符号栈 SYN;push(SEM,entry(w)- 当前 i 在符号表中的入口值压入语义栈 SEM;QUAT-生成四元式函数 T:=newtemp; QTj=(SYNk,SEMs-1,SEMs,T
3、);j+; pop(SYN,_);pop(SEM,_);pop(SEM,_); push(SEM,T);在对中间代码进行局部优化五、程序代码及运行结果:1.表达式中间代码生成#include#includeusing namespace std;char str50;char sem50;char syn50;char ch;int i=0;int j=0;int n=0;int p=1;void push_sem(char w)semj+=w;void push_syn(char w)synn+=w;void Gen()char s22;char w;w=sem-j;if(w=1w1=str
4、i+;w2=stri+;if(w2!=) i=i-2;q=1;ch=stri+;k=E();if(q=0)w=sem-j;if(w=1int i=1; int j=0,n=0; int p; int m=1;int Ti=0;char prog100; char ch;char syn20,sem503; void SEM(void)int i,j;for(i=0;i=a)|(ch=A)temp0=ch;push1(sem,temp);ch=progp+;if(ch=)push0(syn,ch);ch=progp+;E();if(m=0)cout=a)|(ch=A)|(ch=0)temp0=c
5、h;push1(sem,temp);ch=progp+;else m=0;void push0(char sz,char x)int top;top=strlen(sz);sztop=x;top+;sztop+1=0;void pop0(char sz)int top;top=strlen(sz)-1;sztop=0;void push1(char sz503,char x3)int top=1;while(sztop0)top+;strcpy(sztop,x);top+;sztop+10=0;void pop1(char sz503)int top=1;while(sztop0)top+;t
6、op-;sztop0=0;sztop1=0;sztop2=0;void quat0(char w)int top=1,i;char *p;while(semtop0)top+;strcpy(quadj.ag1,semtop-2);strcpy(quadj.ag2,semtop-1);quadj.op=w;p=newT();for(i=0;i0;n-)for(l=0;l0;n-)for(l=0;l0;n-)for(l=0;l0;n-)for(l=0;l0;n-)if(Nn-1.pre0=tag1)break;if(tag!=0)if(Ntag-1.op=quadm.op)if(!Ntag-1.b
7、z01)top=1;while(Ntag-1.bztop0)top+;strcpy(Ntag-1.bztop,quadm.result);else if(!quadm.result1)temp=Ntag-1.bz01;strcpy(Ntag-1.bz0,quadm.result);top=1;while(Ntag-1.bztop0)top+;Ntag.bztop0=t;Ntag.bztop1=temp;elsetop=1;while(Ntag-1.bztop0)top+;strcpy(Ntag-1.bztop,quadm.result);continue;elsenewN();Ni-1.op=
8、quadm.op;strcpy(Ni-1.bz0,quadm.result);Ni-1.pre0=tag1;Ni-1.pre1=tag2;continue;elsenewN();Ni-1.op=quadm.op;strcpy(Ni-1.bz0,quadm.result);Ni-1.pre0=tag1;Ni-1.pre1=tag2;continue;elsenewN();strcpy(Ni-1.bz0,quadm.ag2);tag2=i-1;tag=0;for(n=i;n0;n-)for(l=0;l25;l+)if(strcmp(quadm.result,Nn-1.bzl)=0)tag=n;to
9、p=l;break;if(tag=0)newN();strcpy(Ni-1.bz0,quadm.result);Ni-1.op=quadm.op;Ni-1.pre0=tag1;Ni-1.pre1=tag2;continue;elsefor(l=top+1;l25;l+)strcpy(Ntag-1.bzl-1,Ntag-1.bzl);newN();strcpy(Ni-1.bz0,quadm.result);Ni-1.op=quadm.op;Ni-1.pre0=tag1;Ni-1.pre1=tag2;void newquat(void)int l,top;for(l=1;li;l+)if(Nl.p
10、re1=0elsefor(top=1;Nl.bztop1;top+)if(!Nl.bztop0)strcpy(newquadn.ag1,Nl.bz0);newquadn.ag20=_;newquadn.op=;strcpy(newquadn.result,Nl.bztop);n+;else continue;else if(Nl.pre1!=0|Nl.pre0!=0)strcpy(newquadn.ag1,NNl.pre0.bz0);strcpy(newquadn.ag2,NNl.pre1.bz0);newquadn.op=Nl.op;strcpy(newquadn.result,Nl.bz0);n+;if(!Nl.bz01)for(top=1;Nl.bztop0;top+)if(!Nl.bztop1)strcpy(newquadn.ag1,Nl.bz0);newquadn.ag20=_;newquadn.op=;strcpy(newquadn.result,Nl.bztop);n+;void print2(void)int i;cout“优化后的代码:“endl;for(i=0;in;i+)cout(i+1)“、(“newquadi.op“,“newquadi.ag1“,“newquadi.ag2“,“newquadi.result“)“endl;运行结果: