《编译技术的发展和应用精编.pdf》由会员分享,可在线阅读,更多相关《编译技术的发展和应用精编.pdf(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、编译技术的发展和应用精编 Jenny was compiled in January 2021编译技术的发展和应用据说第一个编译程序的出现是在 20 世纪 50 年代早期,很难讲出确切的时间,因为当初大量的实验和实现工作是由不同的小组独立完成的,多数早期的编译工作是将算术公式翻译成机器代码。用现在的标准来衡量,当时的编译程序能完成的工作十分初步,如只允许简单的单目运算,数据元素的命名方式有很多限制。然而它们奠定了对高级语言编译系统的研究和开发的基础。20 世纪 50 年代中期出现了 FORTRAN 等一批高级语言,相应的一批编译系统开发成功。随着编译技术的发展和社会对编译程序需求的不断增长,2
2、0 世纪 50 年代末有人开始研究编译程序的自动生成工具,提出并研制编译程序的编译程序。它的功能是以任一语言的词法规则、语法规则和语义解释出发,自动产生该语言的编译程序。目前很多自动生成工具已广泛使用,如词法分析程序的生成系统 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 的配对,左右括号的配对等,这样可以减少语法上的错误,可加快对源程序的调试,提高效率
5、和质量。2、语言程序的调试工具 调试是软件开发过程中一个重要环节,结构化编辑器只能解决语法错误的问题,而对一个已通过编译的程序来说,需进一步了解的是程序执行的结果与编程人员的意图是否一致,程序的执行是否实现预计的算法和功能。这种对算法的错误或程序没能反应算法的功能等错误就需用调试器来协助解决。调试器的功能愈强,实现愈复杂,但它必须与语法分析、语义处理有紧密联系。3、语言程序测试工具 语言程序的测试工具有两种:静态分析器和动态测试器静态分析器是对源程序进行静态地分析。它对源程序进行语法分析并制定相应表格,检查变量定值与引用的关系。如某变量未被赋值就被引用,或定值后未被引用,或多余的源代码等一些编
6、译程序的语法分析发现不了的错误。动态测试工具是在源程序的适当位置插入某些信息,并用测试用例记录(显示语句或函数)程序运行时的实际路径。将运行结果与期望的结果进行比较分析,帮助编程人员查找问题。这种测试工具在国内已有开发,如 FORTRAN语言和 C 语言的测试工具。4、高级语言之间的转换工具 由于计算机硬件的不断更新换代,更新更好的程序设计语言的推出为提高计算机的使用效率提供了良好条件,然而一些已有的非常成熟的软件如何在新机器新语言情况下使用呢为了减少重新编制程序所耗费的人力和时间,就要解决如何把一种高级语言转换成另一种高级语言,乃至汇编语言转换成高级语言的问题。这种转换工作要对被转换的语言进
7、行词法和语法分析,只不过生成的目标语言是另一种高级语言而已。这与实现一个完整的编译程序相比工作量要少些。在国内已研制出 C,PASCAL,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 体系结构,来源于斯坦福大学的 MIPS 计划。由于该系列
9、 CPU 不是采用加州大学伯克利分校的 RISC 窗口技术而是采用消除流水线各级互锁的微处理器 MIPS(MicroprocessorWithoutInterlocking 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 架构
12、标准。2000年,MIPS 公司发布了针对 MIPS 32 4Kc 的新版本以及未来64 位 MIPS 64 20Kc 处理器内核。在整个 R 系列中 82000/82010 是最基础的原型;83000/83010 是 82000/82010 的增强型产品;由于 84000采用高 精度的 CMOS 工艺,因此其性能很高,用途很广;而86000/86010 是 ECL 电路化的高速品种,但是由于86000/86010 的功耗大,成本高,所以其应用受到很大限制。但是 MIPSX 并不属于以上提到的 CPU 中的任何一种,它是由 20 世纪 80 年代后期由美国国防部高级研究项目署(DARPA)资
13、助的一个项目的成果。因此,基于 MIPSX 的交叉编译工具链研究虽然现有的 GNU 交叉编译工具链对 MIPS公司 R 系列芯片的支持很好,但还是缺乏对 MIPSX 的有效支持,所以还是需要进行移植。进行移植工作前,必须首先了解 MIPSX 的体系结构。经过实验室前几届师兄的分析,我们得知 MIPSX 的体 系结构与 MIPS 公司 R 系列芯片中的 82000 最为接近,当然它们在很多地方还是存在着差别,比如具体指令集的不同,比如 MIPSX 没有浮点操作;MIPSX 指令的基本操作码只占 5 位;MIPSX 在跳转指令中的延时槽有两条等。简单讲,就是将“一种语言(通常为高级语言)”翻译为“
14、另一种语言(通常为低级)”的程序。一个现代编译器的主要工作流程:(source code)(preprocessor)(compiler)(object code)(Linker)可执行(executables)高级计算机便于人编写,阅读交流,维护。是计算机能直接解读、运行的。编译器将汇编或高级计算机语言(Source program)作为输入,翻译成目标语言(Targetlanguage)机器代码的等价程序。一般为高级语言(High-level language),如、等或,而目标则是机器语言的(Object code),有时也称作机器代码(Machinecode)。对于 C#、VB 等高级
15、语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)的字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,编程最终可以被 CPU 直接计算的机器码(NativeCode)。在 20 世纪 40 年代,由于冯诺伊曼在存储-程序编译原理实验程序计算机方面的先锋作用,编写一串代码或程序已成必要,这样计算机就可以执行所需的计算。开始时,这些程序都是用(machine language)编写的。机器语言就是表示机器实际操作的数字代码,例如:C7 06 0000 0002 表示在 IBM PC 上使用的 Intel 8x86处理器将数字 2
16、移至 0 0 0 0()的指令。但编写这样的代码是十分费时和乏味的,这种代码形式很快就被(assembly language)代替了。在汇编语言中,都是以符号形式给出指令和存储地址的。例如,汇编语言指令 MOV X,2 就与前面的机器指令等价(假设符号存储地址 X 是 0 0 0 0)。汇编程序(assembler)将汇编语言的符号代码和存储地址翻译成与机器语言相对应的数字代码。汇编语言大大提高了编程的速度和准确度,人们至今仍在使用着它,在需要极快的和极高的简洁程度时尤为如此。但是,汇编语言也有许多缺点:编写起来也不容易,阅读和理解很难;而且汇编语言的编写严格依赖于特定的机器,所以为一台计算机
17、编写的代码在应用于另一台计算机时必须完全重写。发展的下一个重要步骤就是以一个更类似于定义或自然语言的简洁形式来编写程序的操作,它应与任何机器都无关,而且也可由一个程序翻译为可执行的代码。例如,前面的汇编语言代码可以写成一个简洁的与机器无关的形式x=2。在 1954 年至 1957 年期间,的带领的一个研究小组对及其编译器的开发,使得上面的担忧不必要了。但是,由于当时处理中所涉及到的大多数的翻译并不为人所掌握,所以这个项目的成功也伴随着巨大的辛劳。几乎与此同时,人们也在开发着第一个编译器,Noam Chomsky 开始了他的自然语言结构的研究。他的发现最终使得编译器结构异常简单,甚至还带有了一些
18、自动化。Chomsky 的研究导致了根据语言文法(grammar,指定其结构的规则)的难易程度以及识别它们所需的来为语言分类。正如现在所称的-与乔姆斯基分类结构(Chomsky hierarchy)一样-包括了文法的 4 个层次:0 型、1 型、2 型和 3 型文法,且其中的每一个都是其前者的专门化。2 型(或(context-freegrammar)被证明是程序设计语言中最有用的,而且今天它已代表着程序设计语言结构的标准方式。分析问题(parsing problem,用于限定上下文无关语言的识别的有效算法)的研究是在 20 世纪 60 年代和 70年代,它相当完善地解决了这一问题,现在它已是
19、编译理论的一个标准部分。它们与乔姆斯基的 3 型文法相对应。对它们的研究与乔姆斯基的研究几乎同时开始,并且引出了表示程序设计语言的单词(或称为记号)的符号方式。人们接着又深化了生成有效的目标代码的方法,这就是最初的编译器,它们被一直使用至今。人们通常将其误称为优化技术(optimization technique),但因其从未真正地得到过被优化了的目标代码而仅仅改进了它的有效性,因此实际上应称作代码改进技术(code improvementtechnique)。这些程序最初被称为编译程序-编译器,但更确切地应称为生成器(parser generator),这是因为它们仅仅能够自动处理编译的一部
20、分。这些程序中最着名的是(yetanother compiler-compiler),它是由 Steve Johnson在 1975 年为 Unix 系统编写的。类似地,有穷自动机的研究也发展了另一种称为扫描程序生成器(scanner generator)的工具,(与 Yacc 同时,由 Mike Lesk 为 Unix 系统开发的)是这其中的佼佼者。在 20 世纪 70 年代后期和 80 年代早期,大量的项目都关注于编译器其他部分的生成自动化,这其中就包括代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。编译器设计最近的发展包括:首先,编译器包括了更为复杂的算法
21、的,它用于推断或简化程序中的信息;这又与更为复杂的程序设计语言(可允许此类分析)的发展结合在一起。其中典型的有用于函数语言编译的 Hindle y-Milner 类型检查的统一算法。其次,编译器已越来越成为基于窗口的交互开发环境(interactive development environment,IDE)的一部分,它包括了、链接程序、调试程序以及项目管理程序。这样的 IDE 的标准并没有多少,但是已沿着这一方向对标准的窗口环境进行开发了。编辑器(编辑器(editoreditor):):编译器通常接受由任何生成标准文件(例如)的编辑器编写的源程序。现在,编译器已与另一个编辑器和其他程序捆绑进
22、一个交互的开发环境-IDE 中。此时,尽管编辑器仍然生成标准文件,但会转向正被讨论的程序设计语言的格式或结构。这样的编辑器称为基于结构的(structure based),且它早已包括了编译器的某些操作;因此,就会在程序的编写时而不是在编译时就得知错误了。从编辑器中也可调用编译器以及与它共用的程序,这样程序员无需离开编辑器就可。是专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、中间代码生成、代码优化和目标代码生成。编译原理是计算机专业设置的一门重要的专业课程。虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对学生提供了系
23、统而有效的训练,有利于提高人员的素质和能力。目前各个大学使用的教材、国防工业出版社出版的编译原理。大学课程为什么要开设编译原理呢这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。在 20 世纪 50 年代,编译器的编写一直被认为是十分困难的事情,第一 Fortr
24、an 的编译器据说花了 18 年的时间才完成。在人们尝试编写编译器的同时,诞生了许多跟编译相关的理论和技术,而这些理论和技术比一个实际的编译器本身价值更大。就犹如数学家们在解决着名的哥德巴赫猜想一样,虽然没有最终解决问题,但是其间诞生不少名着的相关数论。推荐参考书虽然编译理论发展到今天,已经有了比较成熟的部分,但是作为一个大学生来说,要自己写出一个像TurbocC,Java 那样的编译器来说还是太难了。不仅写编译器困难,学习编译原理这门课程也比较困难。第一本书的原名叫CompilersPrinciples,Techniques,andTools,另外一个响亮的名字就是龙书。原因是这本书的封面上
25、有条红色的龙,也因为獗臼樵诒嘁朐砘嘴域确实忻所以很多国外的学者都直接取名为龙书。最近机械工业出版社已经出版了此书的中文版,名字就叫编译原理。该书出的比较早,大概是在 85 或 86 年编写完成的,作者之一还是着名的贝尔实验室的科学家。里面讲解的核心编译原理至今都没有变过,所以一直到今天,它的价值都非凡。这本书最大的特点就是一开始就通过一个实际的小例子,把编译原理的大致内容罗列出来,让很多编译原理的初学者很快心里有了个底,也知道为什么会有这些理论,怎么运用这些理论。而这一点是我感觉国内的教材缺乏的东西,所以国内的教材都不是写给愿意自学的读者,总之让人看了半天,却不知道里面的东西有什么用。第二本书
26、的原名叫ModernCompilerDesign,中文名字叫做现代编译程序设计。该书由人民邮电出版社所出。此书比较关注的是编译原理的实践,书中给出了不少的实际程序代码,还有很多实际的编译技术问题等等。此书另外一个特点就是其现代而字。在传统的编译原理教材中,你是不可能看到如同 Java 中的垃圾回收等算法的。因为 Java 这样的解释执行语言是在近几年才流行起来的东西。如果你想深入学习编译原理的理论知识,那么你肯定得看前面那本龙书,如果你想自己动手做一个先进的编译器,那么你得看这本现代编译程序设计。第三本书就是很多国内的编译原理学者都推荐的那本编译原理及实践。或许是这本书引入国内比较早吧,我记得
27、我是在高中就买了这本书,不过也是在前段时间才把整本书看完。此书作为入门教程也的确是个不错的选择。书中给出的编译原理讲解也相当细致,虽然不如前面的龙书那么深入,但是很多地方都是点到为止,作为大学本科教学已经是十分深入了。该书的特点就是注重实践,不过感觉还不如前面那本现代编译程序设计的实践味道更重。此书的重点还是在原理上的实践,而非前面那本那样的技术实践。编译原理及实践在讲解编译原理的各个部分的同时,也在逐步实践一个现代的编译器 TinyC.等你把整本书看完,差不多自己也可以写一个 TinyC 了。作者还对 Lex 和 Yacc 这两个常用的编译相关的工具进行了很详细的说明,这一点也是很难在国内的
28、教材中看到的。推荐了这三本教材,都有英文版和中文版的。很多英文好的同学只喜欢看原版的书,不我的感觉是这三本书的翻译都很不错,没有必要特别去买英文版的。理解理论的实质比理解表面的文字更为重要。编译原理的实质几乎每本编译原理的教材都是分成词法分析,语法分析(LL 算法,递归下降算法,LR 算法),语义分析,运行时环境,中间代码,代码生成,代码优化这些部分。其实现在很多编译原理的教材都是按照 85,86 出版的那本龙书来安排教学内容的,所以那本龙书的内容格式几乎成了现在编译原理教材的定式,包括国内的教材也是如此。一般来说,大学里面的本科教学是不可能把上面的所有部分都认真讲完的,而是比较偏重于前面几个
29、部分。像代码优化那部分东西,就像个无底洞一样,如果要认真讲,就是单独开一个学期的课也不可能讲得清楚。所以,一般对于本科生,对词法分析和语法分析掌握要求就相对要高一点了。词法分析相对来说比较简单。可能是词法分析程序本身实现起来很简单吧,很多没有学过编译原理的人也同样可以写出各种各样的词法分析程序。不过编译原理在讲解词法分析的时候,重点把正则表达式和自动机原理加了进来,然后以一种十分标准的方式来讲解词法分析程序的产生。这样的做法道理很明显,就是要让词法分析从程序上升到理论的地步。语法分析部分就比较麻烦一点了。现在一般有两种语法分析算法,LL 自顶向下算法和 LR 自底向上算法。LL 算法还好说,到
30、了 LR 算法的时候,困难就来了。很多自学编译原理的都是遇到 LR 算法的理解成问题后就放弃了自学。其实这些东西都是只要大家理解就可以了,又不是像词法分析那样非得自己写出来才算真正的会。像 LR 算法的语法分析器,一般都是用工具 Yacc 来生成,实践中完全没有比较自己来实现。对于 LL 算法中特殊的递归下降算法,因为其实践十分简单,那么就应该要求每个学生都能自己写。当然,现在也有不少好的 LL 算法的语法分析器,不过要是换在非 C 平台,比如 Java,Delphi,你不能运用 YACC 工具了,那么你就只有自己来写语法分析器。等学到词法分析和语法分析时候,你可能会出现这样的疑问:词法分析和
31、语法分析到底有什么就从编译器的角度来讲,编译器需要把程序员写的源程序转换成一种方便处理的数据结构(抽象语法树或语法树),那么这个转换的过程就是通过词法分析和语法分析的。其实词法分析并非一开始就被列入编译器的必备部分,只是我们为了简化语法分析的过程,就把词法分析这种繁琐的工作单独提取出来,就成了现在的词法分析部分。除了编译器部分,在其它地方,词法分析和语法分析也是有用的。比如我们在DOS,Unix,Linux 下输入命令的时候,程序如何分析你输入的命令形式,这也是简单的应用。总之,这两部分的工作就是把不规则的文本信息转换成一种比较好分析好处理的数据结构。那么为什么编译原理的教程都最终把要分析的源
32、分析转换成树这种数据结构呢数据结构中有Stack,Line,List 这么多数据结构,各自都有各自的特点。但是 Tree 这种结构有很强的递归性,也就是说我们可以把Tree 的任何结点 Node 提取出来后,它依旧是一颗完整的Tree。这一点符合我们现在编译原理分析的形式语言,比如我们在函数里面使用函树,循环中使用循环,条件中使用条件等等,那么就可以很直观地表示在 Tree 这种数据结构上。同样,我们在执行形式语言的程序的时候也是如此的递归性。在编译原理后面的代码生成的部分,就会介绍一种堆栈式的中间代码,我们可以根据分析出来的抽象语法树,很容易,很机械地运用递归遍历抽象语法树就可以生成这种指令
33、代码。而这种代码其实也被广泛运用在其它的解释型语言中。像现在流行的 Java,.NET,其底层的字节码 bytecode,可以说就是这中基于堆栈的指令代码的。关于语义分析,语法制导翻译,类型检查等等部分,其实都是一种完善前面得到的抽象语法树的过程。比如说,我们写 C 语言程序的时候,都知道,如果把一个浮点数直接赋值给一个整数,就会出现类型不匹配,那么 C 语言的编译器是怎么知道的呢就是通过这一步的类型检查。像 C+语言这中支持多态函数的语言,这部分要处理的问题就更多更复杂了。大部编译原理的教材在这部分都是讲解一些比较好的处理策略而已。因为新的问题总是在发生,旧的办法不见得足够解决。本来说,作为
34、一个编译器,起作用的部分就是用户输入的源程序到最终的代码生成。但是在讲解最终代码生成的时候,又不得不讲解机器运行环境等内容。因为如果你不知道机器是怎么执行最终代码的,那么你当然无法知道如何生成合适的最终代码。这部分内容我自我感觉其意义甚至超过了编译原理本身。因为它会把一个计算机的程序的运行过程都通通排在你面前,你将来可能不会从事编译器的开发工作,但是只要是和计算机软件开发相关的领域,都会涉及到程序的执行过程。运行时环境的讲解会让你更清楚一个计算机程序是怎么存储,怎么装载,怎么执行的。关于部分的内容,我强烈建议大家看看龙书上的讲解,作者从最基本的存储组织,存储分配策略,非局部名字的访问,参数传递
35、,符号表到动态存储分配(malloc,new)都作了十分详细的说明。这些东西都是我们编写平常程序的时候经常要做的事情,但是我们却少去探求其内部是如何完成。关于中间代码生成,代码生成,代码优化部分的内容就实在不好说了。国内很多教材到了这部分都会很简单地走马观花讲过去,学生听了也只是作为了解,不知道如何运用。不过这部分内容的东西如果要认真讲,单独开一学期的课程都讲不完。在编译原理及实践的书上,对于这部分的讲解就恰到好处。作者主要讲解的还是一种以堆栈为基础的指令代码,十分通俗易懂,让人看了后,很容易模仿,自己下来后就可以写自己的代码生成。当然,对于其它代码生成技术,代码优化技术的讲解就十分简单了。如
36、果要仔细研究代码生成技术,其实另外还有本叫做AdvanceCompilerDesginandImplement,那本书现在由机械工业出版社引进的,十分厚重,而且是英文原版。不过这本书我没有把它列为推荐书给大家,毕竟能把龙书的内容搞清楚,在中国已经就算很不错的高手了,到那个时候再看这本AdvanceCompilerDesginandImplement也不迟。代码优化部分在大学本科教学中还是一个不太重要的部分,就是算是实践过程中,相信大家也不太运用得到。毕竟,自己做的编译器能正确生成执行代码已经很不错了,还谈什么优化呢编译原理的课程毕竟还只是讲解原理的课程,不是专门的编译技术课程。这两门课程是有很
37、大的区别的。编译技术更关注实际的编写编译器过程中运用到的技术,而原理的课第一个编译程序的出现是在 20 世纪 50 年代早期,很难讲出确切的时间,因为当初大量的实验和实现工作是由不同的小组独立完成的,多数早期的编译工作是将算 术公式翻译成机器代码。用现在的标准来衡量,当时的编译程序能完成的工作十分初步,如只允许简单的单目运算,数据元素的命名方式有很多限制。然而它们奠定 了对高级语言编译系统的研究和开发的基础。20 世纪 50 年代中期出现了FORTRAN 等一批高级语言,相应的一批编译系统开发成功。随着编译技术的发展和 社会对编译程序需求的不断增长,20 世纪 50 年代末有人开始研究编译程序
38、的自动生成工具,提出并研制编译程序的编译程序。它的功能是以任一语言的词法规 则、语法规则和语义解释出发,自动产生该语言的编译程序。目前很多自动生成工具已广泛使用,如词法分析程序的生成系统 LEX,语法分析程序的生成系统 YACC等。20 世纪 60 年代起,不断有人使用自展技术来构造编译程序。自展的主要特征是用被编译的语言来书写该语言自身的编译程序。1971 年,PASCAL 的编译程序用自展技术生成后,其影响就越来越大。随着并行技术和并行语言的发展,处理并行语言的并行编译技术,将串行程序转换成并行程序的自动并行编译技术也正在深入研究之中。另外嵌入式应用迅速增 长的需求,推动了交叉编译技术的发
39、展.还有系统芯片设计方法和关键 EDA 技术的研究,也带动了专用语言 VHDL 等及其编译技术的不断深化。我国编译器研发工作起步并不算晚,早在 60 年代初期,董韫美院士和杨芙清院士就分别在中科院和北大领导研究组开发编译器,那时面向的高级语言是 ALGOL 和 FORTRAN,目标机是国产机。在改革开放前,由于国家需要,中科院、国防科大、江南计算所、北大等单位一直在研制国产计算机,包括大型机和高性能计算机(如向量机、并行机),相应的也在研制高级语言编译器。中科院计算所以董韫美院士领导的研究组先后开发了 119 机、109 机的类 ALGOL 语言编译器 BCY。国防科大开发了向量编译器和向量识
40、别器。70 年代中科院计算所张兆庆教授研究组(以后称ACTGroup)开始在国产机上研制 FORTRAN 语言编译器,先后参与了众多的院级和国家级科研攻关项目,主持开发了013,757,KJ8920 等国产大型机系统中的 FORTRAN 语言编译器,所研制的编译器支持了数百万行应用软件的运行。90 年代以来 ACTGroup 承担科学院重大项目,国家攻关项目,863 项目,以及国际合作项目,先后开发了共享内存多处理机的并行识别器,分布式内存多处理机的并行识别器,SIMD 芯片和 VLIW 芯片的并行优化 C 编译器。将编译技术与图形学结合,ACTGroup 还推出了集成化、可视化的并行编程环境。ACTGroup 在先进编译技术和并行编程环境方面的研究工作获国内外专家高度评价,国际着名学者评价此研究组居编译领域的世界先进行列。