编译原理天书一样难懂
① 有没有比龙书通俗易懂的编译原理书籍
大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。在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)都作了十分详细的说明。这些东西都是我们编写平常程序的时候经常要做的事情,但是我们却少去探求其内部是如何完成。
关于中间代码生成,代码生成,代码优化部分的内容就实在不好说了。国内很多教材到了这部分都会很简单地走马观花讲过去,学生听了也只是作为了解,不知道如何运用。不过这部分内容的东西如果要认真讲,单独开一学期的课程都讲不完。在《编译原理及实践》的书上,对于这部分的讲解就恰到好处。作者主要讲解的还是一种以堆栈为基础的指令代码,十分通俗易懂,让人看了后,很容易模仿,自己下来后就可以写自己的代码生成。当然,对于其它代码生成技术,代码优化技术的讲解就十分简单了。如果要仔细研究代码生成技术,其实另外还有本叫做《》,那本书现在由机械工业出版社引进的,十分厚重,而且是英文原版。不过这本书我没有把它列为推荐书给大家,毕竟能把龙书的内容搞清楚,在中国已经就算很不错的高手了,到那个时候再看这本《》也不迟。代码优化部分在大学本科教学中还是一个不太重要的部分,就是算是实践过程中,相信大家也不太运用得到。毕竟,自己做的编译器能正确生成执行代码已经很不错了,还谈什么优化呢?
编译原理的课程毕竟还只是讲解原理的课程,不是专门的编译技术课程。这两门课程是有很大的区别的。编译技术更关注实际的编写编译器过程中运用到的技术,而原理的课
② 《编译原理》犹如天书,怎么学
话说编译原理这种东西除了天才和真正潜心做学问的人,有人学懂过么?
要通过考试的话,自己照着书上的例子做个小的词法分析跟语法分析的玩具玩玩就好了(可以报编译错误的那种 ),语义分析别想了
还有本书叫《深入java虚拟机》,可以参考着看一下,看解释型语言和编译型语言的区别
③ 天书是什么意思
1.帝王的诏书。 唐 王勃 《为原州赵长史请为亡父度人表》:“天书屡降,手勅仍存。” 宋 王安石 《送孙叔康赴御史府》诗:“天书下东南,趣召赴严阙。” 清 周亮工 《宋去损以予累客死都门哭送四诗兼贻令嗣峩长》之一:“ 岭 外天书一夜颁, 河 干令子泣潸潸。”
2.道家称 元始天尊 所说之经,或托言天神所赐之书。《隋书·经籍志四》:“﹝ 元始天尊 所说之经﹞凡八字,尽道体之奥,谓之天书。字方一丈,八角垂芒,光辉照耀,惊心眩目,虽诸天仙,不能省视。”《宋史·真宗纪二》:“ 大中祥符 元年春正月乙丑,有黄帛曳 左承天门 南鸱尾上……上召群臣拜迎于 朝元殿 ,启封,号称天书。”《水浒传》第四二回:“娘娘法旨道:‘ 宋星主 ,传汝三卷天书,汝可替天行道。’” 清 阮元 《小沧浪笔谈·封泰山论》:“ 秦始皇 、 汉武帝 之求长生, 光武帝 之用谶纬, 宋真宗 之得天书,皆以邪道坏古礼。”
3.比喻难认的文字或难懂的文章。《红楼梦》第八六回:“﹝ 寳玉 ﹞看着又奇怪,又纳闷,便说:‘妹妹近日越发进了,看起天书来了!’” 瞿秋白 《“打倒帝国主义”的古典》:“彷佛嫌它太欧化,比天书还难懂。”
④ C语言程序设计看不懂
条条大路通罗马,下面只是我的个人观点,仅供参考。
我觉得安大计算机系的学生四年的学习计划如下:
Y1: 学好高等数学,线代,概率;数理逻辑(可惜安大不单独开),离散数学,不要说
这些东西没用,说实在的,你比世杰电脑学校的学生就多知道这些。没用是因为你
现在的档次太低,现在”还不配“用;到时候你就发现,即使你这些课门门100,还得
大大加深这些课的内容。
学好一门语言,建议是C++(原因是它足够难,否则怎么对别人说你是CS呢?
java也是一个选择,不过建议暂时不要受J2EE的诱惑),请把C++的书至少读3 遍, C++比你想象的功能要多得多(结构化,OOP,泛型);
多写程序,在这一年结束时,写一个1000行左右的程序(用VC,可以作个CONSOLE APPLICATION)。这时你觉得你得看看数据结构什么的了
Y2:
这一年最重要的是学好数据结构。天知道,为什么数据结构课程放在大二下上,这样作
的后果是你又迟了一年成为专业人士。自己看,当别人在大三上数据结构时,你已可以在总结一些经典算法了(原来解决8皇后问题,我们用回朔方法;解决最长公共子序列问题,我们用动态规划;huffman编码我们用的是贪婪算法.......)
这里还得谈谈VC,相信你对C++语言应该比较熟悉了,这一年VC也该有所进步。用MFC
就可以了。不只一个人跟我说VC难,我认为这得看你的基础了,有C++的基础,
多态,继承.....,有sdk的基础,知道一点就可以,为的是更好地理解MFC,有操作系统的基础,进程,线程,消息传递......,唉,不过MFC被淘汰也就
是这几年的问题了,没关系,就当技术积累,影响不大。)
这一年下来你觉得你可以解决很多问题了,那就写一个大点的软件吧(2000行以上)。
程序规模大了以后,你会觉得分析很重要了,这样你在看软件工程方面的书时就
有所体会了。
Y3:在这一年实际上是关键的,你得问问自己,是对计算机科学,还是计算机工程更敢
兴趣,尽管并不矛盾,但你得有所侧重。
实际上,这一年你才真正进入计算机专业领域。数据库,编译原理,操作系统,想必
你也是如雷贯耳的了。我不知道为什么这么重要的课程为什么安大每们课只安排了一个学
期,而且编译原理的实践课程实际上只有几个人真实的自己写了程序。只有靠自己了。
我觉得OS应该以linux为例,资料太多了,而且社会上需求很大。
编译原理,号称计算机系最难的课程,其实,安大的编译原理课程最难的部分还没上呢
上的是属于比较简单的部分,当然也是最有用的部分(科大课件称他们的编译原理课
程要做到国内领先 。),作个pascal或c子集的编译器,译成中间语言就可以了或者
自己设计一套语言,这要看你的兴趣了。
数据库课程重要的是你得学会设计数据库。这一年下来,你觉得你真的能作很多事了(事实上,你的确有了作很多事的基础了)
Y4:
网络课程被安排在大四上,不知道还有没有人有心思上,疑问?尽管很重要。实际
上如果你对网络感兴趣的话,完全可以自己在大二,大三看看,学习一些网络方面的
东西,asp,jsp(要java基础),基于winsock的编程,甚至是linux下的网络编程。
正如你看到的,大学四年还真是紧。忘了,还有软件工程,不过那门课你知道
有就行了,因为上课的内容完全过时,且太理论!
其实不要希望四年能学会多少东西,即使你很用心,离需求也有差距,毕竟这一
行发展太快,不用浮躁,大好基础。经过四年的学习,你可以对自己说,我已经进入
了计算机科学的大门,我比别人(非计算机专业)会更好更快的掌握计算机的新知识, 足矣!
大部分人是到了研究生阶段点感叹数学的重要(高等数学,离散学习)。
⑤ 是不是真有天书,你读过最难懂的书是什么
中华文化历史悠久,在我国历史上有很多的文化着作留下来,比如我们大多人都知道的《大学》《论语》《春秋》《周易》等等。根据古代历史典籍记载,在我国历史上有一本书从汉代开始就开始研究。到现在也没有读懂。所以后人将这本称为天书。
这本书没有人能够读懂的原因是因为他是用古雅语写的,这种语言形式在春秋战国时期已经流传了。这也是孟子遍读天下古籍,唯独看不懂这本书的原因。里面的文字和现在的汉字以及甲骨文都有显着的区别。在当时这种文字也用了将近两千年,后来也不知道因为什么原因就消失了。因此这本书就成为了天下第一难懂之书。所以说后人就把《虞夏书》这本书称为天书。
⑥ 【求助】编译原理就像天书
找最近的学校的计算机老师问,或者周围计算机系同学,问过一下收益匪浅的。编译原理技巧性很强,书上的方法通常不是最好的。还有建议你的是一切以最终的历年复试试卷为准,不要太浪费时间[qq:13]
⑦ 我是计算机专业的 大一刚开课程 听C语言和听天书一样 老师提问的很简单的问题都不会说 上课就像煎熬
C语言是比较晦涩难懂的。我大一的时候也是C语言,刚开始还好,后来因为生病几节课没上,就再也没跟上了,不过后来证明然并卵。我大学几年都是混过去的,最后校招到现在的公司实习培训时,努力学了几个月Java后来有个机会转.net了,做到现在快两年了,已经是项目中的主力开发了。说了那么多,只想表明一句话“世上无难事,只怕有心人”,当你真正想去做好的时候,你自己就会自动去找各种办法解决,当你只是为了敷衍了事时,再简单的东西也会搞砸。
⑧ 学习c语言需要什么基础吗 我现在买了本c语言的书,但是一点都看不懂,就像看天书一样的,
首先:C语言入门相对比较简单,但如果想成为一个优秀的C程序员,需要很艰苦的训练,多读代码,多练习,多上机操作,多思考,学习是一件辛苦的事情,要放弃很多东西,要坚持下来才可以,可以说C语言是基础,将来想学其他的C++,JAVA等,如果有C的基础,还是比较好入门的.
C语言的用处比较广泛,可以说任何精通计算机的人都掌握C语言了,我是本科计算机专业的,C被作为许多课程的先行课,没有了C语言基础,就不能学习数据结构,操作系统,编译原理,计算机网络等核心课程,所以说,想学习计算机的话无论想在哪个方向发展(软件,硬件,网络,应用,开发,设计等方向)都必须掌握C语言.
C Traps And Pitfalls 推荐读,不过要有一定基础。
如果你刚开始的话推荐C Primer Plus或者C In A Nutshell。
去书店买那种翻译版的书,红色皮的那种. 原着国外的.
如果可以直接看那种英文原版的(毕竟翻译过来的有些诧异).
<21天学通C语言>(第六版)
Bradley L. Jones, Peler Aitken 着.
信达工作室 译.
人民邮电出版社
这本书对初学者很好, 如果有点基础那就更好了.
建议选择谭浩强谭老师的书,简单易学,理论与实践结合的很好,而且如果能认真学的话,你会发现你的C语言基础非常的实。
也不是说其他的书不好,但是有些书只是为了让读者入门,没有前途呀。
先读谭浩强的《C语言程序设计》,这是公认的中文入门级教材。但是书中的代码风格不敢恭维。看完这本,推荐《21天学通C语言》,这本书比较好,个人感觉。看完这两本,你就可以进阶C++了。
C语言只要把基础打好就好,你要是想精通的话,最好是精通C++,这样比较有前途。但不要操之过急。
以下一段话是我给另一位初学编程的朋友建议的学习轨迹,你可以参考以下:
学习编程语言贵精不贵多,而且要循序渐进、有张有驰。
初学语言时,基本上都是从C语言入手。
一本谭浩强老师的《C语言程序设计》足够。
不过在学习过程中请注意不要学习他老人家的编程风格!我不知道现在改版了没有,反正我当年学这本书的时候,上面的代码风格让我极其崩溃。
良好的C语言代码风格,可以参阅《21天学通C语言》等。
学C最多也就半年,感觉差不多了,做一个像样的小项目,检验一下自己即可。然后就应该步入C++中。C++是一门值得深入研究的语言,仔细学进去你会发现它嗷嗷强大。其中也有许多经典的设计思想。入门级书籍推荐《C++大学自学教程》讲的比较透彻,但很厚。进阶级推荐《C++语言深入研究》等,就比较深奥了。高手级推荐《C++大师的沉思》等国外名着,讲的很晕,呵呵。
Java是一定要学的,但如果不想在这方面发展,可以不学得那么累。Java是发展最迅猛的语言之一,其技术更新之快,远胜于我们学习的速度。学习Java的重点要放在学习她的思想上。学习面向对象思想,以及建筑在其上的各种框架和架构的思想。学精C++之后再学Java,语法部分10天足够,但思想部分就看你的悟性了。
追加建议:学过C++、Java之后,再回头重温C语言,研究一下用C语言如何实现面向对象的四大特性(抽象、封装、继承和多态)。这时你就会发现,哦,之前显得如此神秘的东西原来是这样的啊……
当以上三门语言你都经历了一遍之后,就可以选择自己所要进一步深造的方向了。那时候你已经心里有数。而且这时的你学习任何一门其他程序设计语言都是手到擒来易如反掌。这就是基础的作用。
<编程珠玑>-中国电力出版社
<程序设计实践>-机械工程出版社
<实用c语言编程>-O'Rerly出版
<算法导论>