编译技术的发展和应用_第1页
编译技术的发展和应用_第2页
编译技术的发展和应用_第3页
编译技术的发展和应用_第4页
编译技术的发展和应用_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编译技术的发展和应用据说第一个编译程序的出现是在 20 世纪 50 年代早期,很难讲出确切的时间,因为当初大量的实验和 实现工作是由不同的小组独立完成的,多数早期的编译工作是将算术公式翻译成机器代码。用现在的标准 来衡量,当时的编译程序能完成的工作十分初步,如只允许简单的单目运算,数据元素的命名方式有很多 限制。然而它们奠定了对高级语言编译系统的研究和开发的基础。 20 世纪 50 年代中期出现了 FORTRAN 等一批高级语言, 相应的一批编译系统开发成功。 随着编译技术的发展和社会对编译程序需求的不断增长, 20 世纪 50 年代末有人开始研究编译程序的自动生成工具,提出并研制编译程序的编

2、译程序。它的功能是 以任一语言的词法规则、语法规则和语义解释出发,自动产生该语言的编译程序。目前很多自动生成工具 已广泛使用,如词法分析程序的生成系统LEX ,语法分析程序的生成系统 YACC 等。 20 世纪 60 年代起,不断有人使用自展技术来构造编译程序。 自展的主要特征是用被编译的语言来书写该语言自身的编译程序。1971 年, PASCAL 的编译程序用自展技术生成后,其影响就越来越大。随着并行技术和并行语言的发展,处理并行语言的并行编译技术,将串行程序转换成并行程序的自动 并行编译技术也正在深入研究之中。 另外嵌入式应用迅速增长的需求,推动了交叉编译技术的发展.还有系统芯片设计方法和

3、关键 EDA 技术的研究,也带动了专用语言 VHDL 等及其编译技术的不断深化。编译实现方式的发展手工机器语言汇编系统程序设计语言自动构造工具 lex yacc gcc推动编译技术发展的因素语言范型(计算模式)计算机体系结构语言范型命令式 (imperative language)应用式 (applicative)基于规则的( rule-based )面向对象的( object-oriented )并行计算 (parallel computing)体系结构万诺曼机体系结构并行体系结构嵌入系统编译程序执行环境-批处理-交互环境嵌入系统环境为了提高软件开发的效率和保证质量,人们除了要在软件工程中对

4、软件开发过程所要遵循的规范化或标准化外,还尽量使用先进的软件开发技术和相应的软件工具,而大部分软件工具的开发,常常要用到编 译技术和方法。实际上编译程序本身也是一种软件开发工具。为了提高编程效率,缩短调试时间,软件工 作人员研制了不少对源程序处理的工具。这些工具的开发不同程度地用到编译技术和方法。下面仅是一些例子。1、 语言的结构化编辑器结构化编辑器是引导用户在语言的语法制导下编制程序,能自动地提供关键字和与其匹配的关键字,如if后必须有then, begin和end的配对,左右括号的配对等,这样可以减少语法上的错误,可加快对源程序的调试,提高效率和质量。2、 语言程序的调试工具调试是软件开发

5、过程中一个重要环节,结构化编辑器只能解决语法错误的问 题,而对一个已通过编译的程序来说,需进一步了解的是程序执行的结果与编程人员的意图是否一致,程序的执行是否实现预计的算法和功能。这种对算法的错误或程序没能反应算法的功能等错误就需用调试器来协助解决。调试器的功能愈强,实现愈复杂,但它必须与语法分析、语义处理有紧密联系。3、语言程序测试工具 语言程序的测试工具有两种:静态分析器和动态测试器静态分析器是对源程序进行静态地分析。它对源程序进行语法分析并制定相应表格,检查变量定值与 引用的关系。如某变量未被赋值就被引用,或定值后未被引用,或多余的源代码等一些编译程序的语法分(显示语句或函析发现不了的错

6、误。动态测试工具是在源程序的适当位置插入某些信息,并用测试用例记录 数)(显示语句或函具在国内已有开发,如 FORTRAN 语言和 C 语言的测试工具。4 、高级语言之间的转换工具 由于计算机硬件的不断更新换代,更新更好的程序设计语言的推出为提 高计算机的使用效率提供了良好条件, 然而一些已有的非常成熟的软件如何在新机器新语言情况下使用呢 ? 为了减少重新编制程序所耗费的人力和时间,就要解决如何把一种高级语言转换成另一种高级语言,乃至 汇编语言转换成高级语言的问题。这种转换工作要对被转换的语言进行词法和语法分析,只不过生成的目 标语言是另一种高级语言而已。这与实现一个完整的编译程序相比工作量要

7、少些。在国内已研制出C ,PASCAL ,FORTRAN 到 Ada 的翻译器和 IBM 4700 汇编到 C 的转换器,其效果很好。近年来 ,由于 JAVA 语言的发展 ,国内外也已研制出不少其他语言到 JAVA 的转换系统 ,如 c 到 JAVA 的转换系统 ,cobol 到 JAVA 的转换系统等等。编译实现方式的发展主要分一下五类: 手工、机器语言、 汇编、系统程序设计语言、 自动构造工具 lex yacc gcc 。推动编译技术发展的因素主要包括 :语言范型(计算模式)、计算机体系结构语言范型主要包括:命令式 (imperative language) 、应用式 (applicati

8、ve) 、基于规则的 (rule-based )、面向对象的 ( object-oriented )、 并行计算 (parallel computing) 。体系结构主要包括 :万诺曼机体系结构、并行体系结构、嵌入系统。编译程序执行环境主要包括:批处理、交互环境、嵌入系统环境、并行编译技术、交叉编译。 编译程序在一个机器(宿主机)上运行,产生另 一个机器(目标机)的汇编语言。嵌入式系统中的应用程序正是借助这样的编译程序生成。目标处理器 MIPSX 是 MIPS 系列芯片的种,属于 RISC 体系结构,来源于斯坦福大学的 MIPS 计划。由于 该系列 CPU 不是采用加州大学伯克利分校的 RIS

9、C 窗口技术而是采用消除流水线各级互锁的微处理器 MIPS(MicroprocessorWithout Interlocking Pipeline Stage)技术,因此而得名。 MIPS 是将 IBM 公司对优化编译程序的研究和加州大学伯克利分校的大规模集成电路的思想结合起来的产品。由于 RISC 指令集的简单和整齐,为了达到更好地利用计算机的性能, MIPS 系列芯片中很好地应用了流 水线策略。 流水线是现代各类微处理器都采用的指令执 行技巧, 即将若干条指令的取指、译码和执行过程 部分重叠在流水线中同时执行。以前在 CISC 计算机中,由于指令多而复杂,处理每条指令的所需时间不 固定,

10、当后面指令需要前条指令的结果时,往往造成指令互锁,因此无法实现流水线。而斯坦福大学的 MIPS 计划就是在编译的过程中,利用编译程序优化处理器的流水 线以求提高处理器流水线的效率。由于 采用了硬件连线控制来执行数目不多的简单指令,而且还能重组软件流水线,这样就减少了硬件复杂性。但是由于存在数据和指令转移的相关性,这会引起流水线的停顿,降低流水线整体的执行速率。为了调整这些相关性,又开发出了代码重组技术,其中一种是延迟转移(delayed branch),另一种叫延迟装入,提升了性能。MIPS公司的R系列就是在此基础上开发的RISC工业产品的微处理器。这些系列产品被很多计算机公司采用生产各种工作

11、站和计算机系统。R系列遵循按比例提高性能设计技术,按不同工艺技术实现基本相同的体系结构,其适用范围从低端的嵌入式控制器、个人计算机到高端的超级小型机、服务器甚至大型机和巨型机,而且系统软件和应用程序都是兼容的。MIPS公司在1986年推出82000处理器,1988年推出83000处理器,1991年推出第一款 64位商用微处理器84000。之后,又陆续推出88000(于1994年卜810000(于 1996年)和812000(于1997年)等型号。1999年,MIPS公司发布 MIPS 32和MIPS 64架构标准。2000 年,MIPS公司发布了针对 MIPS 32 4Kc的新版本以及未来 6

12、4位MIPS 64 20Kc处理器内核。在整个R系列中82000/82010是最基础的原型;83000/83010是82000/82010的增强型产品;由于84000 采用高精度的CMOS工艺,因此其性能很高,用途很广;而86000/86010是ECL电路化的高速品种,但是由于86000/86010的功耗大,成本高,所以其应用受到很大限制。但是MIPSX并不属于以上提到的CPU中的任何一种,它是由 20世纪80年代后期由美国国防部高级研究项目署(DARPA)资 助的一个项目的成果。因此,基于MIPSX的交叉编译工具链研究虽然现有的GNU交叉编译工具链对 MIPS公司R系列芯片的支持很好,但还是

13、缺乏对MIPSX的有效支持,所以还是需要进行移植。进行移植工作前,必须首先了解MIPSX的体系结构。经过实验室前几届师兄的分析,我们得知MIPSX的体系结构与MIPS公司R系列芯片中的82000最为接近,当然它们在很多地方还是存在着差别,比如具体指令集的不同,比如MIPSX没有浮点操 作;MIPSX指令的基本操作码只占 5位;MIPSX在跳转指令中的延时槽有两条等。简单讲,编译器就是将一种语言(通常为高级语言)”翻译为另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码(source code)宀预处理器(preprocessor) 宀编译器(compiler) 宀目标代

14、码 (object code) 宀链接器 (Linker)宀可执行 程序(executables)高级计算机 语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读、运行的。编译器将汇编或高级计算机语言源程序(Source program )作为输入,翻译成目标语言(Target Ianguage )机器代码的等价程序。源代码一般为高级语言(High-level language), 如Pascal、C、C+、Java、汉语编程 等或汇编语言,而目标则是机器语言的 目标代码(Object code),有时也称作机器代码( Machine code )。对于C#、VB等高级语言而言,此时编译

15、器完成的功能是把源码( SourceCode)编译成 通用中间语言(MSIL/CIL )的字节码(ByteCode )。最后运行的时候通过通用语言运行库的 转换,编程最终可以被CPU直接计算的机器码(NativeCode )。在20世纪40年代,由于冯 诺伊曼在存储-程序计算机方面的先锋作用,编写一串代码或程序已成必要,这样计算机就可以执行所需的计算。开始时,这些程序都是用机器语言(machi ne Ian guage)编写的。机器语言就是表示机器实际操作的数字代码,例如:C7 06 0000 0002 表示在IBM PC 上使用的In tel 8x86处理器将数字 2移至地址0 0 0 0(

16、 16进制)的指令。但编写这样的代码是十分费时和乏味的,这种代码形式很快就被汇编语言(assemblyIanguage )代替了。在汇编语言中,都是以符号形式给出指令和存储地址的。例如,汇编 语言指令 MOV X,2就与前面的机器指令等价(假设符号存储地址 X是0 0 0 0 )。汇编程序(assembler )将汇编语言的符号代码和存储地址翻译成与机器语言相对应的数字代码。汇编语言大大提高了编程的速度和准确度,人们至今仍在使用着它,在编码需要极快的速度和极高的简洁程度时尤为如此。但是,汇编语言也有许多缺点:编写起来也不容易, 阅读和理解很难;而且汇编语言的编写严格依赖于特定的机器,所以为一台

17、计算机编写的代码在应用于另一台计算机时必须完全重写。发展编程技术的下一个重要步骤就是以一个更类似于数学定义或自然语言的简洁形式来编写程序的操作,它应与任何机器都无关,而且也可由一个程序翻译为可执行的代码。例如,前面的汇编语言代码可以写成一个简洁的与机器无关的形式x = 2。在1954年至1957年期间,IBM 的John Backus 带领的一个研究小组对 FORTRAN 语言及其编译器的开发, 使得上面的担忧不必要了。但是,由于当时处理中所涉及到的大多数程序设计语言 的翻译并不为人所掌握,所以这个项目的成功也伴随着巨大的辛劳。几乎与此同时,人们也在开发着第一个编译器,Noam Chomsky

18、开始了他的自然语言结构的研究。他的发现最终使得编译器结构异常简单,甚至还带有了一些自动化。Chomsky的研究导致了根据语言文法(grammar ,指定其结构的规则)的难易程度以及识别它们所需的算法来为语言分类。正如现在所称的-与乔姆斯基分类结构(Chomsky hierarchy)一样-包括了文法的4个层次:0型、1型、2型和3型文法,且其中的每一个都是其前者的专门化。2型(或上下文无关文法 (con text-free grammar)被证明是程序设计语言中最有用的,而且今天它已代表着程序设计语言结构的标准方式。分析问题(parsi ng problem ,用于限定上下文无关语言的识别的有

19、效算法)的研究 是在20世纪60年代和70年代,它相当完善地解决了这一问题,现在它已是编译理论的一个标准部分。它们与乔姆斯基的3型文法相对应。对它们的研究与乔姆斯基的研究几乎同时开始,并且引出了表示程序设计语言的单词(或称为记号)的符号方式。数人从事编译方面的工作,但是这门课在理论、技术、方法上都对学生提供了系统而有效的训练,有利于提高 软件人员的素质和能力。目前各个大学使用的教材 机械工业出版社、国数人从事编译方面的工作,但是这门课在理论、技术、方法上都对学生提供了系统而有效的训练,有利于提高 软件人员的素质和能力。目前各个大学使用的教材 机械工业出版社、国防工业出版社出版的编译原理。人们接

20、着又深化了生成有效的目标代码的方法,这就是最初的编译器,它们被一直使 用至今。人们通常将其误称为优化技术( optimization tech ni que),但因其从未真正地得到过被优化了的目标代码而仅仅改进了它的有效性,因此实际上应称作代码改进技术(codeimproveme nt tech nique)。这些程序最初被称为编译程序-编译器,但更确切地应称为分析程序生成器 (parser gen erator ),这是因为它们仅仅能够自动处理编译的一部分。这些程序中最著名的是 Yacc ( yet another compiler- compiler ),它是由 Steve Johnson

21、 在 1975 年为 Unix 系 统编写的。类似地,有穷自动机的研究也发展了另一种称为扫描程序生成器(scanner generator)的工具,Lex (与Yacc同时,由Mike Lesk为Unix系统开发的)是这其中的佼佼者。在 20世纪70年代后期和80年代早期,大量的项目都关注于编译器其他部分的生成自动化, 这其中就包括代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。编译器设计最近的发展包括:首先,编译器包括了更为复杂的算法的应用程序,它用于推断或简化程序中的信息; 这又与更为复杂的程序设计语言 (可允许此类分析) 的发展结 合在一起。其中典型的有用

22、于函数语言编译的Hin dle y - Mil ner类型检查的统一算法。其次,编译器已越来越成为基于窗口的交互开发环境(in teractive developme ntenvironment , IDE )的一部 分,它包括了 编辑器、链接程序、调试程序以及项目管理程 序。这样的IDE的标准并没有多少,但是已沿着这一方向对标准的窗口环境进行开发了。编辑器(editor ):编译器通常接受由任何生成标准文件(例如 ASCII文件)的编辑器编写 的源程序。现在,编译器已与另一个编辑器和其他程序捆绑进一个交互的开发环境-IDE中。此时,尽管编辑器仍然生成标准文件,但会转向正被讨论的程序设计语言的

23、格式或结构。这样的编辑器称为基于结构的(structure based ),且它早已包括了编译器的某些操作;因此,程序员就会在程序的编写时而不是在编译时就得知错误了。从编辑器中也可调用编译器以及与它共用的程序,这样程序员无需离开编辑器就可执行程序。编译原理 是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。 内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。编译原理是计算机专业设置的一门重要的专业课程。虽然只有少大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理 和技术问题,似乎和计算机的基础领域不沾边

24、,可是编译原理却一直作为大学本 科的必修课程,同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相 对复杂。我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。在20世纪50年代,编译器的编写一直被认为是十分困难的事情,第一 Fortran的编译器据说花了 18年的时间才完成。在人们尝试编写编译器的同时,诞生了 许多跟编译相关的理论和技术,而这些理论和技术比一个实际的编译器本身价值 更大。就犹如数学家们在解决著名的哥德巴赫猜想一样, 虽然没

25、有最终解决问题, 但是其间诞生不少名著的相关数论。推荐参考书虽然编译理论发展到今天,已经有了比较成熟的部分,但是作为一个大学生 来说,要自己写出一个像TurbocCJava那样的编译器来说还是太难了。不仅写 编译器困难,学习编译原理这门课程也比较困难。第一本书的原名叫 CompilersPrinciples,Techniques,andTools,另外一个响亮的名字就是龙书。原因是这本书的封面上有条红色的龙, 也因为獗臼樵诒 嘁朐?砘?嘴域确实?忻?所以很多国外的学者都直接取名为龙书。最近机械工业出版社已经出版了此书的中文版,名字就叫编译原理。该书出的比较早,大概 是在85或86年编写完成的,

26、作者之一还是著名的贝尔实验室的科学家。里面 讲解的核心编译原理至今都没有变过,所以一直到今天,它的价值都非凡。这本书最大的特点就是一开始就通过一个实际的小例子,把编译原理的大致内容罗列出来,让很多编译原理的初学者很快心里有了个底,也知道为什么会有这些理论, 怎么运用这些理论。而这一点是我感觉国内的教材缺乏的东西, 所以国内的教材 都不是写给愿意自学的读者,总之让人看了半天,却不知道里面的东西有什么用。第二本书的原名叫ModernCompilerDesign ,中文名字叫做现代编译程序设计。该书由人民邮电出版社所出。此书比较关注的是编译原理的实践, 书中给出了不少的实际程序代码,还有很多实际的编

27、译技术问题等等。此书另外 一个特点就是其现代而字。在传统的编译原理教材中,你是不可能看到如同Java 中的垃圾回收等算法的。因为Java这样的解释执行语言是在近几年才流行起来 的东西。如果你想深入学习编译原理的理论知识,那么你肯定得看前面那本龙书, 如果你想自己动手做一个先进的编译器,那么你得看这本现代编译程序设计。第三本书就是很多国内的编译原理学者都推荐的那本编译原理及实践。或许是这本书引入国内比较早吧,我记得我是在高中就买了这本书,不过也是在 前段时间才把整本书看完。此书作为入门教程也的确是个不错的选择。书中给出 的编译原理讲解也相当细致,虽然不如前面的龙书那么深入,但是很多地方都是 点到

28、为止,作为大学本科教学已经是十分深入了。 该书的特点就是注重实践,不 过感觉还不如前面那本 现代编译程序设计 的实践味道更重。此书的重点还是 在原理上的实践,而非前面那本那样的技术实践。编译原理及实践在讲解编译原理的各个部分的同时,也在逐步实践一个现代的编译器Tin yC.等你把整本书看完,差不多自己也可以写一个 TinyC 了。作者还对Lex和Yacc这两个常用 的编译相关的工具进行了很详细的说明,这一点也是很难在国内的教材中看到的。推荐了这三本教材,都有英文版和中文版的。很多英文好的同学只喜欢看原 版的书,不我的感觉是这三本书的翻译都很不错,没有必要特别去买英文版的。 理解理论的实质比理解

29、表面的文字更为重要。编译原理的实质几乎每本编译原理的教材都是分成词法分析,语法分析(LL算法,递归下降算法,LR算法),语义分析,运行时环境,中间代码,代码生成,代码优化 这些部分。其实现在很多编译原理的教材都是按照 85,86出版的那本龙书来安排 教学内容的,所以那本龙书的内容格式几乎成了现在编译原理教材的定式,包括国内的教材也是如此。一般来说,大学里面的本科教学是不可能把上面的所有部 分都认真讲完的,而是比较偏重于前面几个部分。 像代码优化那部分东西,就像 个无底洞一样,如果要认真讲,就是单独开一个学期的课也不可能讲得清楚。所以,一般对于本科生,对词法分析和语法分析掌握要求就相对要高一点了

30、。词法分析相对来说比较简单。可能是词法分析程序本身实现起来很简单吧,很多没有学过编译原理的人也同样可以写出各种各样的词法分析程序。不过编译原理在讲解词法分析的时候,重点把正则表达式和自动机原理加了进来,然后以一种十分标准的方式来讲解词法分析程序的产生。这样的做法道理很明显,就是要让词法分析从程序上升到理论的地步。语法分析部分就比较麻烦一点了。现在一般有两种语法分析算法,LL自顶向下算法和LR自底向上算法。LL算法还好说,到了 LR算法的时候,困难就来 了。很多自学编译原理的都是遇到 LR算法的理解成问题后就放弃了自学。其实 这些东西都是只要大家理解就可以了,又不是像词法分析那样非得自己写出来才

31、 算真正的会。像LR算法的语法分析器,一般都是用工具 Yacc来生成,实践中完全没有比较自己来实现。对于 LL算法中特殊的递归下降算法,因为其实践十分简单,那么就应该要求每个学生都能自己写。当然,现在也有不少好的LL算法的语法分析器,不过要是换在非C平台,比如JavaQelphi,你不能运用YACC 工具了,那么你就只有自己来写语法分析器。等学到词法分析和语法分析时候,你可能会出现这样的疑问:词法分析和语 法分析到底有什么?就从编译器的角度来讲,编译器需要把程序员写的源程序转 换成一种方便处理的数据结构(抽象语法树或语法树),那么这个转换的过程就是通过词法分析和语法分析的。其实词法分析并非一开

32、始就被列入编译器的必备 部分,只是我们为了简化语法分析的过程, 就把词法分析这种繁琐的工作单独提 取出来,就成了现在的词法分析部分。除了编译器部分,在其它地方,词法分析 和语法分析也是有用的。比如我们在 DOS,Unix,Linux下输入命令的时候,程序 如何分析你输入的命令形式,这也是简单的应用。总之,这两部分的工作就是把 不规则的文本信息转换成一种比较好分析好处理的数据结构。那么为什么编译原理的教程都最终把要分析的源分析转换成树这种数据结构呢?数据结构中有 Stack,Line,List这么多数据结构,各自都有各自的特点。但是Tree这种结构有很强的递归性,也就是说我们可以把 Tree的任

33、何结点Node提取出来后,它依 旧是一颗完整的Tree。这一点符合我们现在编译原理分析的形式语言,比如我 们在函数里面使用函树,循环中使用循环,条件中使用条件等等,那么就可以很 直观地表示在Tree这种数据结构上。同样,我们在执行形式语言的程序的时候 也是如此的递归性。在编译原理后面的代码生成的部分, 就会介绍一种堆栈式的 中间代码,我们可以根据分析出来的抽象语法树,很容易,很机械地运用递归遍 历抽象语法树就可以生成这种指令代码。 而这种代码其实也被广泛运用在其它的解释型语言中。像现在流行的 Java,.NET,其底层的字节码bytecode,可以说就 是这中基于堆栈的指令代码的。关于语义分析

34、,语法制导翻译,类型检查等等部分,其实都是一种完善前面 得到的抽象语法树的过程。比如说,我们写 C语言程序的时候,都知道,如果 把一个浮点数直接赋值给一个整数,就会出现类型不匹配,那么C语言的编译器是怎么知道的呢?就是通过这一步的类型检查。像C+语言这中支持多态函数的语言,这部分要处理的问题就更多更复杂了。 大部编译原理的教材在这部分 都是讲解一些比较好的处理策略而已。因为新的问题总是在发生,旧的办法不见得足够解决。本来说,作为一个编译器,起作用的部分就是用户输入的源程序到最终的代 码生成。但是在讲解最终代码生成的时候,又不得不讲解机器运行环境等内容。 因为如果你不知道机器是怎么执行最终代码的

35、,那么你当然无法知道如何生成合 适的最终代码。这部分内容我自我感觉其意义甚至超过了编译原理本身。因为它会把一个计算机的程序的运行过程都通通排在你面前,你将来可能不会从事编译 器的开发工作,但是只要是和计算机软件开发相关的领域,都会涉及到程序的执 行过程。运行时环境的讲解会让你更清楚一个计算机程序是怎么存储,怎么装载,怎么执行的。关于部分的内容,我强烈建议大家看看龙书上的讲解, 作者从最基 本的存储组织,存储分配策略,非局部名字的访问,参数传递,符号表到动态存 储分配(malloc,new)都作了十分详细的说明。这些东西都是我们编写平常程序的 时候经常要做的事情,但是我们却少去探求其内部是如何完

36、成。关于中间代码生成,代码生成,代码优化部分的内容就实在不好说了。国内 很多教材到了这部分都会很简单地走马观花讲过去,学生听了也只是作为了解,不知道如何运用。不过这部分内容的东西如果要认真讲, 单独开一学期的课程都讲不完。在编译原理及实践的书上,对于这部分的讲解就恰到好处。作者主 要讲解的还是一种以堆栈为基础的指令代码,十分通俗易懂,让人看了后,很容易模仿,自己下来后就可以写自己的代码生成。当然,对于其它代码生成技术, 代码优化技术的讲解就十分简单了。 如果要仔细研究代码生成技术,其实另外还 有本叫做AdvanceCompilerDesginandlmplement,那本书现在由机械工业出版社引进的,十分厚重,而且是英文原版。不过这本书我没有把它列为推荐书 给大家,毕竟能把龙书的内容搞清楚,在中国已经就算很不错的高手了,到那个时候再看这本AdvanceCompilerDesginandlmplement也不迟。代码优化部分在大学本科教学中还是一个不太重要的部分,就是算是实践过程中,相信大 家也不太运用得到。毕竟,自己做的编译器能正确生成执行代码已经很不错了, 还谈什么优化呢?编译原理的课程毕竟还只是讲解原理的课程,不是专门的编译技术课程。这 两门课程是有很大的区别的。编译技术更关注实际的编写编译器过程中运用到的 技术,而原理的课第

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论