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

下载本文档

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

文档简介

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

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

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

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

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

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

11、此基础上开发的 RISC 工业产品的微处理器。这些系列产品被很多计算机公司 采用生产各种工作站和计算机系统。 R 系 列遵循按比例提高性能设计技术, 按不同工艺技术实现基本相同 的体系结构, 其适用围从低端的嵌入式控制器、 个人计算机到高端的超级小型机、 服务器甚至大型 机和巨 型机,而且系统软件和应用程序都是兼容的。 MIPS 公司在 1986 年推出 82000 处理器,1988 年推出 83000 处理器,1991 年推出第一款 64 位商用微处理器 84000 。之后,又陆续推出 88000( 于 1994 年 )、810000( 于 1996 年)和 812000( 于 1997 年

12、)等型号。 1999 年, MIPS 公司发布 MIPS 32 和 MIPS 64 架构标准。 2000 年, MIPS 公司发布了针对 MIPS 32 4Kc 的新版本以及未来 64位 MIPS 64 20Kc 处理器核。在整个 R 系列中 82000/82010 是最基础的原型 ;83000/83010 是 82000/82010 的增强型产品 ;由于 84000 采用高 精度的 CMOS 工艺,因此其性能很高,用途很广 ;而 86000/86010 是 ECL 电路化的高速品种,但 是由于 86000/86010 的功耗大,成本高, 所以其应用受到很大限制。但是 MIPSX 并不属于以上

13、提到的 CPU 中的任何一种,它是由 20 世纪 80 年代后期由美国国防部高级研究项目署 (DARPA) 资 助的一个项目 的成果。 因此,基于 MIPSX 的交叉编译工具链研究虽然现有的 GNU 交叉编译工具链对 MIPS 公司 R 系列 芯片的支持很好,但还是缺乏对 MIPSX 的有效支持,所以还是需要进行移植。进行移植工作前,必须首 先了解 MIPSX 的体系结构。 经过实验室前几届师兄的分析, 我们得知 MIPSX 的体 系结构与 MIPS 公司 R 系列芯片中的 82000 最为接近,当然它们在很多地方还是存在着差别, 比如具体指令集的不同, 比如 MIPSX 没有浮点操 作;MI

14、PSX 指令的基本操作码只占 5 位 ;MIPSX 在跳转指令中的延时槽有两条等。简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常 为低级语言)”的程序。一个现代编译器的主要工作流程: 源代码 (source code) 预处 理器 (preprocessor) 编译器 (compiler) 目标代码 (object code) 器 (Linker) 可执行程序 (executables)高级计算机语言便于人编写,阅读交流,维护。 机器语言是计算机能直接解读、运行 的。编译器将汇编或高级计算机语言 源程序(Source program )作为输入,翻译成目标语言 (T

15、arget language )机器代码的等价程序。源代码一般为高级语言 (High-level language) , 如 Pascal 、C、C+、Java、汉语编程等或汇编语言,而目标则是机器语言的 目标代码( Object code ),有时也称作机器代码( Machine code )。对于 C#、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言( MSIL/CIL )的字节码( ByteCode )。最后运行的时候通过通用语言运行库的 转换,编程最终可以被 CPU直接计算的机器码( NativeCode )。在 20 世纪 40 年代,由于

16、诺伊曼在存储 -程序计算机方面的先锋作用,编写一串代码或程序已成必要,这样计算机就可以执行所需的计算。开始时,这些程序都是用 机器语言(machine language )编写的。机器语言就是 表示机器实际操作的数字代码,例如:C7 06 0000 0002 表示在 IBM PC 上使用的 Intel 8x86 处理器将数字 2 移至地址 0 0 0 0 (16 进制)的指令。但编写这样的代码是十分费时和乏味的,这种代码形式很快就被汇编语言(assemblylanguage )代替了。在汇编语言中,都是以符号形式给出指令和存储地址的。例如,汇编 语言指令 MOV X,2 就与前面的机器指令等价

17、 (假设符号存储地址 X 是 0 0 0 0 )。汇编程 序( assembler )将汇编语言的符号代码和存储地址翻译成与机器语言相对应的数字代码。汇编语言大大提高了编程的速度和准确度,人们至今仍在使用着它,在 编码需要极快 的速度和极高的简洁程度时尤为如此。但是,汇编语言也有许多缺点:编写起来也不容易, 阅读和理解很难; 而且汇编语言的编写严格依赖于特定的机器, 所以为一台计算机编写的代 码在应用于另一台计算机时必须完全重写。发展编程技术 的下一个重要步骤就是以一个更类似于 数学 定义或自然语言的简洁形式 来编写程序的操作, 它应与任何机器都无关, 而且也可由一个程序翻译为可执行的代码。

18、例 如,前面的汇编语言代码可以写成一个简洁的与机器无关的形式x = 2。在 1954 年至 1957 年期间, IBM 的 John Backus 带领的一个研究小组对 FORTRAN 语言 及其编译器的开发, 使得上面的担忧不必要了。 但是, 由于当时处理中所涉及到的大多 数程序设计语言 的翻译并不为人所掌握, 所以这个项目的成功也伴随着巨大的辛劳。 几乎与 此同时,人们也在开发着第一个编译器, Noam Chomsky 开始了他的自然语言结构的研究。 他的发现最终使得编译器结构异常简单,甚至还带有了一些自动化。 Chomsky 的研究导致 了根据语言文法( grammar ,指定其结构的规

19、则)的难易程度以及识别它们所需的 算法 来 为语言分类。正如现在所称的 - 与乔姆斯基分类结构( Chomsky hierarchy )一样 -包括了文 法的 4个层次: 0型、1型、2型和 3型文法,且其中的每一个都是其前者的专门化。2型(或 上下文无关文法 ( context-free grammar )被证明是程序设计语言中最有用的,而 且今天它已代表着程序设计语言结构的标准方式。分析问题( parsing problem ,用于限定上下文无关语言的识别的有效算法)的研究 是在 20 世纪 60 年代和 70 年代,它相当完善地解决了这一问题, 现在它已是编译理论的 一个标准部分。它们与

20、乔姆斯基的 3 型文法相对应。对它们的研究与乔姆斯基的研究几乎 同时开始,并且引出了表示程序设计语言的单词(或称为记号)的符号方式。人们接着又深化了生成有效的目标代码的方法,这就是最初的编译器,它们被一直使 用至今。人们通常将其误称为优化技术( optimization technique ),但因其从未真正地得 到过被优化了的目标代码而仅仅改进了它的有效性, 因此实际上应称作代码改进技术 ( code improvement technique )。这些程序最初被称为编译程序 -编译器,但更确切地应称为 分析程序 生成器 ( parser generator ),这是因为它们仅仅能够自动处理

21、编译的一部分。这些程序中最著名的 是 Yacc ( yet another compiler- compiler ),它是由 Steve Johnson 在 1975 年为 Unix 系 统编写的。类似地,有穷自动机的研究也发展了另一种称为扫描程序生成器( scanner generator )的工具, Lex (与 Yacc 同时,由 Mike Lesk 为 Unix 系统开发的)是这其中的佼佼者。在 20 世纪 70 年代后期和 80 年代早期,大量的项目都关注于编译器其他部分的生成自动化, 这其中就包括代码生成。 这些尝试并未取得多少成功, 这大概是因为操作太复杂而人们又对 其不甚了解。

22、编译器设计最近的发展包括:首先,编译器包括了更为复杂的算法的 应用程序 ,它用 于推断或简化程序中的信息; 这又与更为复杂的程序设计语言 (可允许此类分析) 的发展结 合在一起。其中典型的有用于函数语言编译的Hindle y - Milner 类型检查的统一算法。其次,编译器已越来越成为基于窗口的交互开发环境( interactive development environment , IDE )的一部 分,它包括了 编辑器 、程序、调试程序以及项目管理程序。 这样的 IDE 的标准并没有多少, 但是已沿着这一方向对标准的窗口环境进行开发了。编辑器( editor ): 编译器通常接受由任何生

23、成标准文件(例如ASCII 文件 )的编辑器编写的源程序。 现在, 编译器已与另一个编辑器和其他程序捆绑进一个交互的开发环境-IDE 中。此时, 尽管编辑器仍然生成标准文件, 但会转向正被讨论的程序设计语言的格式或结构。 这 样的编辑器称为基于结构的 ( structure based ),且它早已包括了编译器的某些操作; 因此, 程序员 就会在程序的编写时而不是在编译时就得知错误了。 从编辑器中也可调用编译器以及 与它共用的程序,这样程序员无需离开编辑器就可 执行程序 。编译原理 是 计算机 专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。 容包括语言和文法、词法分析、语法分

24、析、 语法制导翻译 、中间代码生成、 存储管理 、代码 优化和目标代码生成。 编译原理是计算机专业设置的一门重要的专业课程。虽然只有少数 人从事编译方面的工作, 但是这门课在理论、 技术、 方法上都对学生提供了系统而有效的训 练,有利于提高 软件 人员的素质和能力。 目前各个大学使用的教材 机械工业 、国防工业出 版的编译原理 。大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理 和技术问题, 似乎和计算机的基础领域不沾边, 可是编译原理却一直作为大学本 科的必修课程, 同时也成为了研究生入学考试的必考容。 编译原理及技术从本质 上来讲就是一个算法问题而已, 当然由于这个问题

25、十分复杂, 其解决算法也相对 复杂。我们学的数据结构与算法分析也是讲算法的, 不过讲的基础算法, 换句话 说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。 在 20 世纪 50 年代,编译器的编写一直被认为是十分困难的事情, 第一 Fortran 的编译器据说花了 18 年的时间才完成。在人们尝试编写编译器的同时,诞生了 许多跟编译相关的理论和技术, 而这些理论和技术比一个实际的编译器本身价值 更大。就犹如数学家们在解决著名的哥德巴赫猜想一样, 虽然没有最终解决问题, 但是其间诞生不少名著的相关数论推荐参考书虽然编译理论发展到今天, 已经有了比较成熟的部分, 但是作为一个

26、大学生 来说,要自己写出一个像 TurbocC,Java 那样的编译器来说还是太难了。不仅写 编译器困难,学习编译原理这门课程也比较困难。第一本书的原名叫 CompilersPrinciples,Techniques,andTools,另外一个响亮的名字就是龙书。 原因是这本书的封面上有条红色的龙, 也因为獗臼樵诒 嘁朐?砘?嘴域确实 ?忻?所以很多国外的学者都直接取名为龙书。 最近机械工业已 经出版了此书的中文版,名字就叫编译原理。该书出的比较早,大概是在 85 或 86 年编写完成的, 作者之一还是著名的贝尔实验室的科学家。 里面讲解的 核心编译原理至今都没有变过, 所以一直到今天, 它的

27、价值都非凡。 这本书最大 的特点就是一开始就通过一个实际的小例子, 把编译原理的大致容罗列出来, 让 很多编译原理的初学者很快心里有了个底 ,也知道为什么会有这些理论,怎么运 用这些理论。 而这一点是我感觉国的教材缺乏的东西, 所以国的教材都不是写给 愿意自学的读者,总之让人看了半天,却不知道里面的东西有什么用。第二本书的原名叫 ModernCompilerDesign ,中文名字叫做现代编译 程序设计。该书由人民邮电所出。此书比较关注的是编译原理的实践,书中给 出了不少的实际程序代码, 还有很多实际的编译技术问题等等。 此书另外一个特 点就是其现代而字。在传统的编译原理教材中,你是不可能看到

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

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

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

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

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

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

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

35、va,.NET,其底层的字节码 bytecode, 可以说就 是这中基于堆栈的指令代码的。关于语义分析, 语法制导翻译, 类型检查等等部分, 其实都是一种完善前面 得到的抽象语法树的过程。比如说,我们写 C 语言程序的时候,都知道,如果 把一个浮点数直接赋值给一个整数,就会出现类型不匹配,那么 C 语言的编译 器是怎么知道的呢?就是通过这一步的类型检查。像 C+ 语言这中支持多态函 数的语言, 这部分要处理的问题就更多更复杂了。 大部编译原理的教材在这部分 都是讲解一些比较好的处理策略而已。 因为新的问题总是在发生, 旧的办法不见 得足够解决。本来说,作为一个编译器, 起作用的部分就是用户输入

36、的源程序到最终的代 码生成。但是在讲解最终代码生成的时候, 又不得不讲解机器运行环境等容。 因 为如果你不知道机器是怎么执行最终代码的, 那么你当然无法知道如何生成合适的最终代码。 这部分容我自我感觉其意义甚至超过了编译原理本身。 因为它会把 一个计算机的程序的运行过程都通通排在你面前, 你将来可能不会从事编译器的 开发工作,但是只要是和计算机软件开发相关的领域 ,都会涉及到程序的执行过 程。运行时环境的讲解会让你更清楚一个计算机程序是怎么存储, 怎么装载, 怎 么执行的。关于部分的容, 我强烈建议大家看看龙书上的讲解, 作者从最基本的 存储组织,存储分配策略,非局部名字的访问,参数传递,符号

37、表到动态存储分 配 (malloc,new) 都作了十分详细的说明。 这些东西都是我们编写平常程序的时候 经常要做的事情,但是我们却少去探求其部是如何完成。关于中间代码生成,代码生成 ,代码优化部分的容就实在不好说了。国很多 教材到了这部分都会很简单地走马观花讲过去, 学生听了也只是作为了解, 不知 道如何运用。不过这部分容的东西如果要认真讲, 单独开一学期的课程都讲不完。 在编译原理及实践的书上,对于这部分的讲解就恰到好处。作者主要讲解的 还是一种以堆栈为基础的指令代码,十分通俗易懂,让人看了后,很容易模仿, 自己下来后就可以写自己的代码生成。 当然, 对于其它代码生成技术, 代码优化 技术

38、的讲解就十分简单了。 如果要仔细研究代码生成技术, 其实另外还有本叫做 AdvanceCompilerDesginandImplement ,那本书现在由机械工业引进的,十分厚重, 而且是英文原版。 不过这本书我没有把它列为推荐书给大家, 毕竟能 把龙书的容搞清楚,在中国已经就算很不错的高手了,到那个时候再看这本 AdvanceCompilerDesginandImplement也不迟。代码优化部分在大学本科教学中还是一个不太重要的部分, 就是算是实践过程中, 相信大家也不太运用 得到。毕竟, 自己做的编译器能正确生成执行代码已经很不错了, 还谈什么优化 呢?编译原理的课程毕竟还只是讲解原理的课程, 不是专门的编译技术课程。 这 两门课程是有很大的区别的。 编译技术更关注实际的编写编译器过程中运用到的 技术,而

温馨提示

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

评论

0/150

提交评论