北航编译原理ppt课件 12编译程序生成方法和工具.ppt
第十二章 编译程序生成方法和工具,编译程序的书写语言自编译性自展编译程序的移植编译程序的自动生成,12.1 编译程序的书写语言,机器语言或汇编语言 主要优点:编出来的程序效率高。主要缺点:编程效率低,可读性差,不便于修改和移植。高级程序设计语言已基本取代汇编语言 优点:编程效率高,可读性好,利于移植。缺点:编译程运行效率较低。,12.2 自编译性,自编译性:如果一个高级语言能用来书写自己的编译程序,则该语言具有自编译性,并称该语言为自编译语言。,两点说明:通常用自编译语言除可编写本语言的编译程序以外,也可用来编写别的语言的编译程序。如果某台机器上已配备有某种自编译语言,则可利用这种语言为本台机器配置其它的高级语言。,例:A机上有自编译语言L1的编译程序 L1.AO L1语言L1的编译程序 AO以A机的机器指令形式给出 利用语言L1可为A机生成语言L2的编译程序,源语言,目标语言,书写语言,L2,L1,Ao,L1,Ao,Ao,L2,Ao,f,f,2.自编译性不是绝对的,只是强弱不同 数据类型丰富的语言 控制结构丰富的语言,自编译性强,数据类型:除一般的外还有字符串类型,数组,结构,枚举,指 针等类型。控制结构:应适于进行多分支的程序设计,如有CASE语句等 FORTRAN,ALGOL自编译性差 PASCAL,C,ADA,C,JAVA自编译性强实践示例:用PASCAL语言编写一个简单的编译程序,就是利用 PASCAL的自编译性。,12.3 自展,利用高级语言的自编译性,还可以通过自展方式生成语言的编译程序。设L为自编译语言,自展生成 L.Ao(A机目标形式的语言L的编译器,可在A机上运行),步骤:1.首先,将语言划分为N个部分:L=L1+L2+Ln L1 核心部分 L2 Ln扩充部分,2.先用A机上的汇编编写L1的编译程序,L1.Aa L1.AaAssemberL1.Ao,4.用(L1+L2)编写L1+L2+L3的编译程序,(L1+L2).Ao,L.Ao,L1.Ao,滚雪球式,用自展方式进行编译,可提高生产率。因核心语言小,可用汇编实现。其余部分高级语言编写。比全用低级语言效率高。,12.4 编译程序的移植,移植:将某台机上的成熟软件移植到另一台机器上,也就是将宿主机上的软件移植到目标机上。如果使用具有自编译性的高级语言来书写程序,则移植是方便的。,移植,通过移植,在B机上可得到语言L的编译程序,具B机目标形式,可在B机上运行。,移植步骤:,将L.L分为两部分:一部分与机器无关 F.L 一部分与机器有关 A.L L.L=F.L+A.L,3.第一次编译 将I.L在宿主机A上用L的编译程序进行编译,生成能在宿主机A上运行的语言L的交叉编译器,它能生成目标机B的代码。,4.第二次编译(交叉编译),Ao,L,Bo,Ao,Bo,L,L,L,Ao,可以设想,只要在某台机器上为某目标机配置一个L语言的交叉编译程序,就能将宿主机上的L语言所写的所有软件移植到其他目标机上。采用软件移植的办法来开发软件,可提高软件生产率,并提高软件的可靠性。由于上述优点,所以软件的可移植性是软件开发所追求的目标之一。目前有许多编译程序都考虑到可移植性的要求。例如有:可移植的PASCAL编译程序。P.J.Brown,Software Portablility.朱关铭等译,1982.12,12.5 编译程序的自动生成,理想的编译程序自动生成工具:,L语言规格说明L语义描述和机器规格说明,编译程序生成工具,该语言(L)的编译程序,目标代码,L源程序,目前还没有一个系统能自动生成整个编译系统。早期的工作集中在分析部分,即针对语法规则的形式化描述。对编译程序后端,即与目标机有关的代码生成与代码优化部分,由于对语义和目标机进行形式化描述方面所存在的困难,最近有所突破,但未见到流行的产品。(样机未形成真正产品)有词法分析器的自动生成器和语法分析器的自动生成器。词法分析器生成器(在第三章已作介绍)LEX:,LEX源文件(.l 文件)(正则表达式表示的单词符号),LEX(构造识别单词符号的自动机),词法分析器(lex.yy.c 文件)(自动机),语法分析器生成器:YACC(YET ANOTHER COMPILER-COMPILER),Bison:美国GNU开发的语法分析器生成器)和YACC一样都在 UNIX系统下运行。(已有PC版),用yacc建立翻译程序,yacc源程序:translate.y1.键入命令:yacc translate.y2.生成进行LALR分析的翻译程序:y.tab.c 3.对生成的分析器进行编译:cc y.tab.c-ly(ly为使用LR分析器的库)生成可执行的 翻译程序 a.out,函数定义部分,声明部分,%,%,翻译规则部分,Yacc编译程序,y.output,y.tab.h,yacc源程序(*.y),y.tab.c,头文件,处理记录,语法分析表yyparse()语法分析函数,/*表达式计算*/%token NUM%line:expr n printf(n,$1);expr:expr+term$=$1+$3;|expr-term$=$1-$3;|term/*$=$1*/;term:term*factor$=$1*$3;|term/factor$=$1/$3;|factor/*$=$1*/;factor:(espr)$=$2;|NUM/*$=$1*/;,%#includeyylex()intc;while(c=getchar()=);if(isdigit(c)yylval=c 0;while(isdigit(c=getchar()yylval=yylval*10+(c-0);ungetc(c,stdin);retun NUM;else return c;,