还剩2页未读,继续阅读
文本内容:
编译原理学习导论大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了在世纪年代,编译器的编写一直被认为是十分困难的事情,第一2050Fortran的编译器据说花了年的时间才完成在人们尝试编写编译器的同时,诞生了许多跟编译相18关的理论和技术,而这些理论和技术比一个实际的编译器本身价值更大就犹如数学家们在解决著名的哥德巴赫猜想一样,虽然没有最终解决问题,但是其间诞生不少名著的相关数论
1.推荐参考书虽然编译理论发展到今天,已经有了比较成熟的部分,但是作为一个大学生来说,要自己写出一个像那样的编译器来说还是太难了不仅写编译器困难,学习编译原理TurbocC,Java这门课程也比较困难正是因为编译原理学习相对困难,那么就要求有好的教师和好的教材教师方面不是我们能自己更改的,而在教材方面我们却可以按自己的意愿来阅读我下面推荐几本好的编译原理的教材我推荐的书籍都是国外的经典教材,因为在国内的教材中,确实还没发现什么让人满意的第一本书的原名叫《》,另外一个响亮的名字就CompilersPrinciples,Techniques,andfbols是龙书原因是这本书的封面上有条红色的龙,所以很多国外的学者都直接取名为龙书最近机械工业出版社已经出版了此书的中文版,名字就叫《编译原理》该书出的比较早,大概是在或年编写完成的,作者之一还是著名的贝尔实验室的科学家里面讲解的核心编译原8586理至今都没有变过,所以一直到今天,它的价值都非凡这本书最大的特点就是一开始就通过一个实际的小例子,把编译原理的大致内容罗列出来,让很多编译原理的初学者很快心里有了个底,也知道为什么会有这些理论,怎么运用这些理论而这一点是我感觉国内的教材缺乏的东西,所以国内的教材都不是写给愿意自学的读者,总之让人看了半天,却不知道里面的东西有什么用第二本书的原名叫《》,中文名字叫做《现代编译程序设计》该Modern CompilerDesign书由人民邮电出版社所出此书比较关注的是编译原理的实践,书中给出了不少的实际程序代码,还有很多实际的编译技术问题等等此书另外一个特点就是其现代〃而字在传统的编译原理教材中,你是不可能看到如同中的垃圾回收〃等算法的因为这样的解释Java Java执行语言是在近几年才流行起来的东西如果你想深入学习编译原理的理论知识,那么你肯定得看前面那本龙书,如果你想自己动手做一个先进的编译器,那么你得看这本《现代编译程序设计》第三本书就是很多国内的编译原理学者都推荐的那本《编译原理及实践》或许是这本书引入国内比较早吧,我记得我是在高中就买了这本书,不过也是在前段时间才把整本书看完此书作为入门教程也的确是个不错的选择书中给出的编译原理讲解也相当细致,虽然不如前面的龙书那么深入,但是很多地方都是点到为止,作为大学本科教学已经是十分深入了该书的特点就是注重实践,不过感觉还不如前面那本《现代编译程序设计》的实践味道更重此书的重点还是在原理上的实践,而非前面那本那样的技术实践《编译原理及实践》在讲解编译原理的各个部分的同时,也在逐步实践一个现代的编译器等你把整本书看完,差不多Tiny C.自己也可以写一个了作者还对和这两个常用的编译相关的工具进行了很详Tiny CLex Yacc细的说明,这一点也是很难在国内的教材中看到的推荐了这三本教材,都有英文版和中文版的很多英文好的同学只喜欢看原版的书,不我的感觉是这三本书的翻译都很不错,没有必要特别去买英文版的理解理论的实质比理解表面的文字更为重要
2.编译原理的实质前面已经说过,学习编译原理其实也就是学习算法而己,没什么特别的只不过这些算法的产生已经形成了一套理论下面我来看看编译原理里面到底有什么高深的理论吧(几乎每本编译原理的教材都是分成词法分析,语法分析算法,递归下降算法,算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++理的教材在这部分都是讲解一些比较好的处理策略而已因为新的问题总是在发生,旧的办法不见得足够解决本来说,作为一个编译器,起作用的部分就是用户输入的源程序到最终的代码生成但是在讲解最终代码生成的时候,又不得不讲解机器运行环境等内容因为如果你不知道机器是怎么执行最终代码的,那么你当然无法知道如何生成合适的最终代码这部分内容我自我感觉其意义甚至超过了编译原理本身因为它会把一个计算机的程序的运行过程都通通排在你面前,你将来可能不会从事编译器的开发工作,但是只要是和计算机软件开发相关的领域,都会涉及到程序的执行过程运行时环境的讲解会让你更清楚一个计算机程序是怎么存储,怎么装载,怎么执行的关于部分的内容,我强烈建议大家看看龙书上的讲解,作者从最基本的存储组织,存储分配策略,非局部名字的访问,参数传递,符号表到动态存储分配都作了十malloqnew分详细的说明这些东西都是我们编写平常程序的时候经常要做的事情,但是我们却少去探求其内部是如何完成关于中间代码生成,代码生成,代码优化部分的内容就实在不好说了国内很多教材到了这部分都会很简单地走马观花讲过去,学生听了也只是作为了解,不知道如何运用不过这部分内容的东西如果要认真讲,单独开一学期的课程都讲不完在《编译原理及实践》的书上,对于这部分的讲解就恰到好处作者主要讲解的还是一种以堆栈为基础的指令代码,十分通俗易懂,让人看了后,很容易模仿,自己下来后就可以写自己的代码生成当然,对于其它代码生成技术,代码优化技术的讲解就十分简单了如果要仔细研究代码生成技术,其实另外还有本叫做《》,那本书现在由机械工业出版社引进的,Advance CompilerDesgin andImplement十分厚重,而且是英文原版不过这本书我没有把它列为推荐书给大家,毕竟能把龙书的内容搞清楚,在中国已经就算很不错的高手了,到那个时候再看这本《Advance CompilerDesgin and也不迟代码优化部分在大学本科教学中还是一个不太重要的部分,就是算是实Implements践过程中,相信大家也不太运用得到毕竟,自己做的编译器能正确生成执行代码已经很不错了,还谈什么优化呢?
3.关于实践编译原理的课程毕竟还只是讲解原理的课程,不是专门的编译技术课程这两门课程是有很大的区别的编译技术更关注实际的编写编译器过程中运用到的技术,而原理的课关注讲解其基本理论但是计算机科学本身就是一门实践性很强的课程,如果能够学以致用,那才叫真正的学会李阳在讲解疯狂英语的时候就说到,只要当你会实际中运用一个单词一个词组的时候你才能叫学会了这个单词或者词组,而不是只是知道了它的拼写和意思其实任何学习都是一样的,如果缺少了实践的结合,你不能算学会编译原理的课程主要就是讲解编译器产生的理论和原理,那么很简单,自己写个编译器就是最好的实践过程了不过你得小心,编译系统可能是所有软件系统中最复杂的系统之一,不然为什么大学里面还会把编译器的编写开成一门叫做编译原理的课程来讲?我很佩服那些学了操作系统原理就开始自己写操作系统,学了编译原理就开始自己写编译器的人们,确实,在中国,敢这么做的学生太少了且不管你这样做能不能做成功,至少有了这个尝试,会让你的程序设计,系统规划安排的功底增进不少我下面给出一些关于实践过程中可能会遇到的困难,希望能够在你陷入困境的前帮你一把和这两工具是作为词法分析和语法分析的工具如果你自己写一个编译器,
1.Lex Yacc.我十分不建议你连词法分析这种事情都亲手来写和应该是作为每本编译原理的教Lex Yacc材的必备内容,可是在国内的教材中缺很少看到这两个工具是系统下的小东西,如果Unix你要在中运用,那么你最好去下在这个软件它是个在下模拟Windows cygwinWindows Unix的东东,里面就包含了和这两个工具.这两个工具使用起来还挺麻烦flex.exe bison.exeyacc的其实下的很多十分有用的工具都是这样,不过在《编译原理与实践》这本书上对于这unix两个工具的讲解十分详细,还列举了不少实际的例子,做解释型语言比做生成机器代码的编译器简单虽然说,做解释型的编译器,像那2Java样的,你还得自己去写解释器,不过这样你就不必去查找机器代码的资料了如果你做生成的最终机器代码编译器可能会遇到问题还有就是寄存器为基础的代码生成方法前面说过,如果你生成的是以堆栈为基础的代码,那么其代码生成过程十分简单,需要考虑的东西也不多,如果你考虑最终的机器代码生成的话,你必须考虑机器的寄存器如何分配等麻烦的问题考虑用别人已经生成的语法文件,尽量不要自己动手写词法文件和语法文件以前一个
3.朋友曾经说过,写出一个好的程序语言的语法定义,就几乎完成了一个编译器的一半.确实是这样,语法文件的编写是个很难的事情•现在网上到处都可以找到比如语言,C C++,Java,Tiny等语言的词法文件和语法文件,你完全可以自己下下来来用.C,Minus C在《编译原理及实践》的书中,作者给出了一个的全部代码.我自我感觉作者的这Tiny C个编译器做得很不错,相对于其它等语言的源代码来说,简单得多,容易看懂,而且很php,perl清晰地展现了一个完成的编译系统的实现过程.其源代码可以在作者的网站上下载.后话编译原理的学习可能算是一个困难的历程,特别是对于那些不对编译系统感兴趣的同学来说,既然它已经作为了大学本科的必修课程,那么就说明的它引申出来的一套理论在整个计算机科学领域还是占有相对重要的地位.如果我们考究一下历史,就会发现很多被称为程序设计大师的人都是编译领域的高手.写出第一个微型机上运行的语言的比尔盖茨,设计出的的〃世界上最厉害Basic DelphiBorland的程序员的之父,贝尔实验室的之父…Sun J***A C++Compilers Principles,Techniques,and ToolsAlfred人民邮电V.Aho,Ravi Sethi,Jeffrey D.Ullman,1986版影印,机械工业版中译本,
2002.2003《程序设计语言编译原理》第版陈火旺等编著,国防工业出版社,32000Advanced CompilerDesign andImplementation机械工业出版社影印,Steven S.Muchnick,
1997.2003Modern CompilerImplementation inC人民邮电出版社影印,Andrew W.Appel,2005Programming LanguagePragmatics电子工业出版社中译本,Michaeil.Scott etc.,2005这些都是编译原理非常好的书,网上貌似也有电子版。
个人认证
优秀文档
获得点赞 0