rev编译原理

rev编译原理,第1张

rev编译程序就是一个语言翻译程序。

语言翻译程序把一种语言(称作源语言)书写的程序翻译成另一种语言(称作目标程序)的等价程序。

高级语言程序------>编译程序------->低级语言程序(目标程序)

高级语言程序的处理过程

需预处理的源程序-------->预处理程序(文件合并、文件包含、宏处理、条件编译)----->编译程序---->目标汇编代码-->汇编程序-->可再装配的机器代码

------>可在装配的目标文件(装配/链接-编译程序)--->绝对的机器代码

二、编译过程和编译程序的结构

编译过程可划分为词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成六个阶段。

大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。在20世纪50年代,编译器的编写一直被认为是十分困难的事情,第一Fortran的编译器据说花了18年的时间才完成。在人们尝试编写编译器的同时,诞生了许多跟编译相关的理论和技术,而这些理论和技术比一个实际的编译器本身价值更大。就犹如数学家们在解决著名的哥德巴赫猜想一样,虽然没有最终解决问题,但是其间诞生不少名著的相关数论。推荐参考书虽然编译理论发展到今天,已经有了比较成熟的部分,但是作为一个大学生来说,要自己写出一个像TurbocC,Java那样的编译器来说还是太难了。不仅写编译器困难,学习编译原理这门课程也比较困难。第一本书的原名叫《CompilersPrinciples,Techniques,andTools》,另外一个响亮的名字就是龙书。原因是这本书的封面上有条红色的龙,也因为獗臼樵诒嘁朐砘嘴域确实忻所以很多国外的学者都直接取名为龙书。最近机械工业出版社已经出版了此书的中文版,名字就叫《编译原理》。该书出的比较早,大概是在85或86年编写完成的,作者之一还是著名的贝尔实验室的科学家。里面讲解的核心编译原理至今都没有变过,所以一直到今天,它的价值都非凡。这本书最大的特点就是一开始就通过一个实际的小例子,把编译原理的大致内容罗列出来,让很多编译原理的初学者很快心里有了个底,也知道为什么会有这些理论,怎么运用这些理论。而这一点是我感觉国内的教材缺乏的东西,所以国内的教材都不是写给愿意自学的读者,总之让人看了半天,却不知道里面的东西有什么用。第二本书的原名叫《ModernCompilerDesign》,中文名字叫做《现代编译程序设计》。该书由人民邮电出版社所出。此书比较关注的是编译原理的实践,书中给出了不少的实际程序代码,还有很多实际的编译技术问题等等。此书另外一个特点就是其现代而字。在传统的编译原理教材中,你是不可能看到如同Java中的垃圾回收等算法的。因为Java这样的解释执行语言是在近几年才流行起来的东西。如果你想深入学习编译原理的理论知识,那么你肯定得看前面那本龙书,如果你想自己动手做一个先进的编译器,那么你得看这本《现代编译程序设计》。第三本书就是很多国内的编译原理学者都推荐的那本《编译原理及实践》。或许是这本书引入国内比较早吧,我记得我是在高中就买了这本书,不过也是在前段时间才把整本书看完。此书作为入门教程也的确是个不错的选择。书中给出的编译原理讲解也相当细致,虽然不如前面的龙书那么深入,但是很多地方都是点到为止,作为大学本科教学已经是十分深入了。该书的特点就是注重实践,不过感觉还不如前面那本《现代编译程序设计》的实践味道更重。此书的重点还是在原理上的实践,而非前面那本那样的技术实践。《编译原理及实践》在讲解编译原理的各个部分的同时,也在逐步实践一个现代的编译器TinyC等你把整本书看完,差不多自己也可以写一个TinyC了。作者还对Lex和Yacc这两个常用的编译相关的工具进行了很详细的说明,这一点也是很难在国内的教材中看到的。推荐了这三本教材,都有英文版和中文版的。很多英文好的同学只喜欢看原版的书,不我的感觉是这三本书的翻译都很不错,没有必要特别去买英文版的。理解理论的实质比理解表面的文字更为重要。编译原理的实质几乎每本编译原理的教材都是分成词法分析,语法分析(LL算法,递归下降算法,LR算法),语义分析,运行时环境,中间代码,代码生成,代码优化这些部分。其实现在很多编译原理的教材都是按照85,86出版的那本龙书来安排教学内容的,所以那本龙书的内容格式几乎成了现在编译原理教材的定式,包括国内的教材也是如此。一般来说,大学里面的本科教学是不可能把上面的所有部分都认真讲完的,而是比较偏重于前面几个部分。像代码优化那部分东西,就像个无底洞一样,如果要认真讲,就是单独开一个学期的课也不可能讲得清楚。所以,一般对于本科生,对词法分析和语法分析掌握要求就相对要高一点了。词法分析相对来说比较简单。可能是词法分析程序本身实现起来很简单吧,很多没有学过编译原理的人也同样可以写出各种各样的词法分析程序。不过编译原理在讲解词法分析的时候,重点把正则表达式和自动机原理加了进来,然后以一种十分标准的方式来讲解词法分析程序的产生。这样的做法道理很明显,就是要让词法分析从程序上升到理论的地步。语法分析部分就比较麻烦一点了。现在一般有两种语法分析算法,LL自顶向下算法和LR自底向上算法。LL算法还好说,到了LR算法的时候,困难就来了。很多自学编译原理的都是遇到LR算法的理解成问题后就放弃了自学。其实这些东西都是只要大家理解就可以了,又不是像词法分析那样非得自己写出来才算真正的会。像LR算法的语法分析器,一般都是用工具Yacc来生成,实践中完全没有比较自己来实现。对于LL算法中特殊的递归下降算法,因为其实践十分简单,那么就应该要求每个学生都能自己写。当然,现在也有不少好的LL算法的语法分析器,不过要是换在非C平台,比如Java,Delphi,你不能运用YACC工具了,那么你就只有自己来写语法分析器。等学到词法分析和语法分析时候,你可能会出现这样的疑问:词法分析和语法分析到底有什么?就从编译器的角度来讲,编译器需要把程序员写的源程序转换成一种方便处理的数据结构(抽象语法树或语法树),那么这个转换的过程就是通过词法分析和语法分析的。其实词法分析并非一开始就被列入编译器的必备部分,只是我们为了简化语法分析的过程,就把词法分析这种繁琐的工作单独提取出来,就成了现在的词法分析部分。除了编译器部分,在其它地方,词法分析和语法分析也是有用的。比如我们在DOS,Unix,Linux下输入命令的时候,程序如何分析你输入的命令形式,这也是简单的应用。总之,这两部分的工作就是把不规则的文本信息转换成一种比较好分析好处理的数据结构。那么为什么编译原理的教程都最终把要分析的源分析转换成树这种数据结构呢?数据结构中有Stack,Line,List这么多数据结构,各自都有各自的特点。但是Tree这种结构有很强的递归性,也就是说我们可以把Tree的任何结点Node提取出来后,它依旧是一颗完整的Tree。这一点符合我们现在编译原理分析的形式语言,比如我们在函数里面使用函树,循环中使用循环,条件中使用条件等等,那么就可以很直观地表示在Tree这种数据结构上。同样,我们在执行形式语言的程序的时候也是如此的递归性。在编译原理后面的代码生成的部分,就会介绍一种堆栈式的中间代码,我们可以根据分析出来的抽象语法树,很容易,很机械地运用递归遍历抽象语法树就可以生成这种指令代码。而这种代码其实也被广泛运用在其它的解释型语言中。像现在流行的Java,NET,其底层的字节码bytecode,可以说就是这中基于堆栈的指令代码的。关于语义分析,语法制导翻译,类型检查等等部分,其实都是一种完善前面得到的抽象语法树的过程。比如说,我们写C语言程序的时候,都知道,如果把一个浮点数直接赋值给一个整数,就会出现类型不匹配,那么C语言的编译器是怎么知道的呢?就是通过这一步的类型检查。像C++语言这中支持多态函数的语言,这部分要处理的问题就更多更复杂了。大部编译原理的教材在这部分都是讲解一些比较好的处理策略而已。因为新的问题总是在发生,旧的办法不见得足够解决。本来说,作为一个编译器,起作用的部分就是用户输入的源程序到最终的代码生成。但是在讲解最终代码生成的时候,又不得不讲解机器运行环境等内容。因为如果你不知道机器是怎么执行最终代码的,那么你当然无法知道如何生成合适的最终代码。这部分内容我自我感觉其意义甚至超过了编译原理本身。因为它会把一个计算机的程序的运行过程都通通排在你面前,你将来可能不会从事编译器的开发工作,但是只要是和计算机软件开发相关的领域,都会涉及到程序的执行过程。运行时环境的讲解会让你更清楚一个计算机程序是怎么存储,怎么装载,怎么执行的。关于部分的内容,我强烈建议大家看看龙书上的讲解,作者从最基本的存储组织,存储分配策略,非局部名字的访问,参数传递,符号表到动态存储分配(malloc,new)都作了十分详细的说明。这些东西都是我们编写平常程序的时候经常要做的事情,但是我们却少去探求其内部是如何完成。关于中间代码生成,代码生成,代码优化部分的内容就实在不好说了。国内很多教材到了这部分都会很简单地走马观花讲过去,学生听了也只是作为了解,不知道如何运用。不过这部分内容的东西如果要认真讲,单独开一学期的课程都讲不完。在《编译原理及实践》的书上,对于这部分的讲解就恰到好处。作者主要讲解的还是一种以堆栈为基础的指令代码,十分通俗易懂,让人看了后,很容易模仿,自己下来后就可以写自己的代码生成。当然,对于其它代码生成技术,代码优化技术的讲解就十分简单了。如果要仔细研究代码生成技术,其实另外还有本叫做《AdvanceCompilerDesginandImplement》,那本书现在由机械工业出版社引进的,十分厚重,而且是英文原版。不过这本书我没有把它列为推荐书给大家,毕竟能把龙书的内容搞清楚,在中国已经就算很不错的高手了,到那个时候再看这本《AdvanceCompilerDesginandImplement》也不迟。代码优化部分在大学本科教学中还是一个不太重要的部分,就是算是实践过程中,相信大家也不太运用得到。毕竟,自己做的编译器能正确生成执行代码已经很不错了,还谈什么优化呢?编译原理的课程毕竟还只是讲解原理的课程,不是专门的编译技术课程。这两门课程是有很大的区别的。编译技术更关注实际的编写编译器过程中运用到的技术,而原理的课

采用中间代码是把源程序映射成中间代码表示,再映射成目标代码的工作分在几个阶段进行,使编译算法更加清晰。中间代码有四种形式:

1、逆波兰表示

逆波兰表示又称后缀表示法,它是最简单的一种中间代码表示形式,早在编译程序出现之前,它就用于表示算术表达式。

2、四元式

四元式也是一种比较普遍采用的中间代码形式,

其形式为:(OP,ARG1,ARG2,RESULT)

3、三元式

三元式表示是与四元式类似的一种表示法,所不同的仅是三元式中没有表示运算结果的部分,凡要涉及到运算结果的均用三元式的位置或序号来代替。

4、树表示

树形表示是三元式的翻版。在树的表示中,树叶均为运算对象,即常量或变量,其他结点表示运算符。表达式的树形表示很容易实现:简单变量或常量的树就是该变量或常量自身。

扩展资料

中间语言的优点:

1、中间语言与具体机器特性无关,一种中间语言可以为生成多种不同型号的目标机的目标代码服务。

2、可对中间语言进行与机器无关的优化,有利于提高目标代码的质量。

对于中间语言,要求其不但与机器无关,而且有利于代码生成。

编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 编译原理是计算机专业设置的一门重要的专业课程。虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力。 目前各个大学使用的教材机械工业出版社、国防工业出版社出版的《编译原理》。

书上有别那么懒!。。。。

编译过程的六个阶段:词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成

解释程序:把某种语言的源程序转换成等价的另一种语言程序——目标语言程序,然后再执行目标程序。解释方式是接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句。

编译程序:就是指这样一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序(机器语言程序或汇编语言程序)。

解释程序和编译程序的根本区别:是否生成目标代码

句子的二义性(这里的二义性是指语法结构上的。):文法G[S]的一个句子如果能找到两种不同的最左推导(或最右推导),或者存在两棵不同的语法树,则称这个句子是二义性的。

文法的二义性:一个文法如果包含二义性的句子,则这个文法是二义文法,否则是无二义文法。

LL(1)的含义:(LL(1)文法是无二义的; LL(1)文法不含左递归)

第1个L:从左到右扫描输入串 第2个L:生成的是最左推导

1 :向右看1个输入符号便可决定选择哪个产生式

某些非LL(1)文法到LL(1)文法的等价变换: 1 提取公因子 2 消除左递归

文法符号的属性:单词的含义,即与文法符号相关的一些信息。如,类型、值、存储地址等。

一个属性文法(attribute grammar)是一个三元组A=(G, V, F)

G:上下文无关文法。

V:属性的有穷集。每个属性与文法的一个终结符或非终结符相连。属性与变量一样,可以进行计算和传递。

F:关于属性的断言或谓词(一组属性的计算规则)的有穷集。断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。

综合属性:若产生式左部的单非终结符A的属性值由右部各非终结符的属性值决定,则A的属性称为综合属

继承属性:若产生式右部符号B的属性值是根据左部非终结符的属性值或者右部其它符号的属性值决定的,则B的属性为继承属性。

(1)非终结符既可有综合属性也可有继承属性,但文法开始符号没有继承属性。

(2) 终结符只有综合属性,没有继承属性,它们由词法程序提供。

在计算时: 综合属性沿属性语法树向上传递;继承属性沿属性语法树向下传递。

语法制导翻译:是指在语法分析过程中,完成附加在所使用的产生式上的语义规则描述的动作。

语法制导翻译实现:对单词符号串进行语法分析,构造语法分析树,然后根据需要构造属性依赖图,遍历语法树并在语法树的各结点处按语义规则进行计算。

中间代码(中间语言)

1、是复杂性介于源程序语言和机器语言的一种表示形式。

2、一般,快速编译程序直接生成目标代码。

3、为了使编译程序结构在逻辑上更为简单明确,常采用中间代码,这样可以将与机器相关的某些实现细节置于代码生成阶段仔细处理,并且可以在中间代码一级进行优化工作,使得代码优化比较容易实现。

何谓中间代码:源程序的一种内部表示,不依赖目标机的结构,易于代码的机械生成。

为何要转换成中间代码:(1)逻辑结构清楚;利于不同目标机上实现同一种语言。

(2)便于移植,便于修改,便于进行与机器无关的优化。

中间代码的几种形式:逆波兰记号 ,三元式和树形表示 ,四元式

符号表的一般形式:一张符号表的的组成包括两项,即名字栏和信息栏。

信息栏包含许多子栏和标志位,用来记录相应名字和种种不同属性,名字栏也称主栏。主栏的内容称为关键字(key word)。

符号表的功能:(1)收集符号属性 (2) 上下文语义的合法性检查的依据: 检查标识符属性在上下文中的一致性和合法性。(3)作为目标代码生成阶段地址分配的依据

符号的主要属性及作用:

1 符号名 2 符号的类型 (整型、实型、字符串型等))3 符号的存储类别(公共、私有)

4 符号的作用域及可视性 (全局、局部) 5 符号变量的存储分配信息 (静态存储区、动态存储区)

存储分配方案策略:静态存储分配;动态存储分配:栈式、 堆式。

静态存储分配

1、基本策略

在编译时就安排好目标程序运行时的全部数据空间,并能确定每个数据项的单元地址。

2、适用的分配对象:子程序的目标代码段;全局数据目标(全局变量)

3、静态存储分配的要求:不允许递归调用,不含有可变数组。

FORTRAN程序是段结构,不允许递归,数据名大小、性质固定。 是典型的静态分配

动态存储分配

1、如果一个程序设计语言允许递归过程、可变数组或允许用户自由申请和释放空间,那么,就需要采用动态存储管理技术。

2、两种动态存储分配方式:栈式,堆式

栈式动态存储分配

分配策略:将整个程序的数据空间设计为一个栈。

例在具有递归结构的语言程序中,每当调用一个过程时,它所需的数据空间就分配在栈顶,每当过程工作结束时就释放这部分空间。

过程所需的数据空间包括两部分

一部分是生存期在本过程这次活动中的数据对象。如局部变量、参数单元、临时变量等;

另一部分则是用以管理过程活动的记录信息(连接数据)。

活动记录(AR)

一个过程的一次执行所需要的信息使用一个连续的存储区来管理,这个区 (块)叫做一个活动记录。

构成

1、临时工作单元;2、局部变量;3、机器状态信息;4、存取链;

5、控制链;6、实参;7、返回地址

什么是代码优化

所谓优化,就是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加快或占用存储空间减少。

优化原则:等价原则:经过优化后不应改变程序运行的结果。

有效原则:使优化后所产生的目标代码运行时间较短,占用的存储空间较小。

合算原则:以尽可能低的代价取得较好的优化效果。

常见的优化技术

(1) 删除多余运算(删除公共子表达式) (2) 代码外提 +删除归纳变量+ (3)强度削弱; (4)变换循环控制条件 (5)合并已知量与复写传播 (6)删除无用赋值

基本块定义

程序中只有一个入口和一个出口的一段顺序执行的语句序列,称为程序的一个基本块。

给我分数啊。。。

如果你在学编译原理的话,你可以把它理解为一个编写《编译器》的时间课程~

当然,事实上,编译原理的老师也是这么要求的~

编译器就是把你编写的源程序代码变成程序可理解的二进制代码的过程。

而把这个过程细化之后就可以归纳为:1、预处理过程(例如去掉不需要的空格、注释之类的~)、2、词法分析(就是把你写的程序从头到尾扫描一遍,识别出你的程序中所有的“单词”,并编号记录,按顺序放在一张大的二维表中,一遍下一个处理过程用到~,当然,如果你的单词有错的话,还要做相应的出错处理哈~)、3、语法分析(处理的是第二部中得到的单词二维表,经过一定的算法处理,可以得到一张成为预测分析表的东东~简单的说就是按照预测分析表对一个个句子进行检查,全部通过就进入下一关节,否则出错处理)、4、语义分析、5、目标代码的生成(这部分生成基本的与机器无关的单步执行的代码)

之后的步骤就是与机器有关的东西了~目标代码优化>汇编代码生成>生成二进制代码~

恩,差不多就是这么个流程,你可以再去针对自己感兴趣的部分百度一下哈~

编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 编译原理是计算机专业设置的一门重要的专业课程。虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力。

编译主要工作是检查一下你的源代码,看看它是否能够读懂,如果可以完全明白,就把你的源代码变成一种计算机更方便处理的文件,通常我们称为目标文件,常用后缀obj 或o,编译的工作就结束了。

链接程序的拿到目标文件后,进行装配工作。因为你设计的程序中,要不是调用自己设计的功能,要不调用系统提供的功能。链接就是把根据你程序说明的调用关系,找到相应的程序,把它们拼接起来,形成可以被 *** 作系统执行的文件,也就是可执行文件。

以上就是关于rev编译原理全部的内容,包括:rev编译原理、为什么要学习编译原理(转)、为什么要采用中间代码中间代码有哪几种形式(编译原理)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10213694.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存