⑴ 为什么要学习编译原理(转)
大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。在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)都作了十分详细的说明。这些东西都是我们编写平常程序的时候经常要做的事情,但是我们却少去探求其内部是如何完成。 关于中间代码生成,代码生成,代码优化部分的内容就实在不好说了。国内很多教材到了这部分都会很简单地走马观花讲过去,学生听了也只是作为了解,不知道如何运用。不过这部分内容的东西如果要认真讲,单独开一学期的课程都讲不完。在《编译原理及实践》的书上,对于这部分的讲解就恰到好处。作者主要讲解的还是一种以堆栈为基础的指令代码,十分通俗易懂,让人看了后,很容易模仿,自己下来后就可以写自己的代码生成。当然,对于其它代码生成技术,代码优化技术的讲解就十分简单了。如果要仔细研究代码生成技术,其实另外还有本叫做《》,那本书现在由机械工业出版社引进的,十分厚重,而且是英文原版。不过这本书我没有把它列为推荐书给大家,毕竟能把龙书的内容搞清楚,在中国已经就算很不错的高手了,到那个时候再看这本《》也不迟。代码优化部分在大学本科教学中还是一个不太重要的部分,就是算是实践过程中,相信大家也不太运用得到。毕竟,自己做的编译器能正确生成执行代码已经很不错了,还谈什么优化呢? 编译原理的课程毕竟还只是讲解原理的课程,不是专门的编译技术课程。这两门课程是有很大的区别的。编译技术更关注实际的编写编译器过程中运用到的技术,而原理的课
⑵ 编译原理的教材
这个很难, 缺数学背景的人会读不下去.
主要是因为compiler的制作会用到Automata Theory的前半部.
包括regular expression, pushdown automata, contex free language.
建议楼主找个大学听课.
⑶ 小白求助,编译是什么,为什么需要编译
人与机器交流(即人让计算机按照人的意愿做事)依赖于语言
语言的层次是:自然语言->高级编程语言->汇编语言->机器码
人最熟悉的肯定是自然语言(就是你平时说的话)。
而计算机的cpu只认识二进制的机器码,机器码指导计算机做什么操作(如逻辑运算)。
高级编程语言跟自然语言的关系更近些,对人来说相当于自然语言的白痴版,如java中的对象与类的概念可能对应于现实世界的某种事物,如C语言中的函数可能对应了一个功能,比如打印文件,经过简单的训练,人也能大概的读懂。
汇编语言和机器码更接近些,每个汇编指令一般都会对应一条机器码,而高级编程语言中的一个语句(如if else什么的)可能会对应多条汇编指令,汇编指令一般就是算术运算(如add)、逻辑运算(如and)、数据传送(如mov)、条件判断、跳转等,只能用这些简单功能的汇编指令组合来完成一个复杂的功能。人看懂汇编就很吃力了,更别提用汇编来完成想要的功能,太吃力,这个过程还是交个编译器比较好。
而机器码对于一般的程序员来说,就是天书,也基本没人愿意去看。
自然语言最容易表述人们的要求,当用户用自然语言表述了需要的功能后,从自然语言到高级语言的转换过程由程序员来完成,而由高级编程语言到汇编、由汇编到机器码的过程都由编译器来完成,由编译器完成的这个过程也就是编译了。
高级编程语言的代码经过编译阶段成为汇编代码,汇编代码经过汇编阶段变成机器码,机器码文件经过链接阶段变成可执行文件(.exe)。一般编译是指的编译阶段和汇编阶段的组合,编译器的工作一般是编译和链接。
这就是我的理解,希望你帮到你。
⑷ 什么是自编译版本的ROM
答案: 25、男人通常不喜欢吵架,也不主动吵架,但他们擅长令女人忍无可忍找他们吵架。
⑸ 什么是编译程序
编译程序指将某一种程序设计语言写的程序翻译成等价的另一种语言的程序的程序, 称之为编译程序
编译程序也称为编译器,是指把用高级程序设计语言书写的源程序,翻译成等价的机器语言格式目标程序的翻译程序。编译程序属于采用生成性实现途径实现的翻译程序。
它以高级程序设计语言书写的源程序作为输入,而以汇编语言或机器语言表示的目标程序作为输出。编译出的目标程序通常还要经历运行阶段,以便在运行程序的支持下运行,加工初始数据,算出所需的计算结果。
编译程序的实现算法较为复杂,这是因为它所翻译的语句与目标语言的指令不是一一对应关系,而是一多对应关系,同时也因为它要处理递归调用、动态存储分配、多种数据类型,以及语句间的紧密依赖关系。
由于高级程序设计语言书写的程序具有易读、易移植和表达能力强等特点,编译程序广泛地用于翻译规模较大、复杂性较高、且需要高效运行的高级语言书写的源程序。
(5)什么是自编译教材扩展阅读:
编译流程分为了四个步骤:
1.预处理,生成预编译文件(.文件)
2.编译,生成汇编代码(.s文件)
3.汇编,生成目标文件(.o文件)
4.链接,生成可执行文件
⑹ 什么是教育部统编教材
教育部统编教材亦称“通用教材”、“部编教材”,是由国家教育行政部门统一组织编辑,通用于全国各地学校的教材。
从2017年秋季学期起,全国数百万就读于起始年级的小学生和初中生,语文、历史、道德与法治3个科目将统一使用“教育部编义务教育教科书”,现行的人教版、粤教版、苏教版、北京版等版本教材将逐步被取代。
根据中央对三科教材统编统用、三年实现全覆盖的要求,教育部历时五年,统一组织新编了义务教育道德与法治、语文、历史教材,2017年秋季学期起,全国所有地区小学一年级和初中一年级使用统编教材,2018年覆盖小学初中一、二年级,2019年所有年级全部使用统编教材。
(6)什么是自编译教材扩展阅读
1902年中国政府颁布《京师大学堂编书处章程》,始正式筹划统一编辑教科书。三十二年学部设编译图书局,有部编教材面世。以后数十年间,教材兼采国定制和审定制。
中华人民共和国成立后到 80年代初,教育部先后委托人民教育出版社编辑出版 7 套中小学各学科的通用教材。1987年 10月,国家教育委员会颁发《全国中小学教材审定委员会工作章程》,规定在统一教学基本要求的前提下,有领导、有计划地实现教材的多样化;教材实行审定制。
党中央、国务院历来高度重视教材建设,特别是党的十八大以来,党中央对教材建设作出一系列重要指示,明确提出教材建设是国家事权,要健全国家教材制度,成立国家教材委员会,要重点编好中小学三科教材,实行国家统编、统审、统用。
⑺ 请问谁知道清华大学的 编译原理 课程用的是什么教材谢谢
张素琴 清华大学出版社《编译原理》,建议参考
作者: (美)阿霍 等着,李建中 等译 机械工业出版社《编译原理》俗称“龙书”
⑻ 专着、编着、编书、教材如何来区分和界定
一、专着、编着、编书、教材的区别和界定
1、含义:专着指的是针对某一专门研究题材的,是着作的别称;编着,一种着作方式,基本上属于编写;编书是指对一门科目进行的论述;教材是依据课程标准编制的、系统反映学科内容的教学用书。
2、对象:专着的对象是某一专门研究的题材;编着的对象是独自见解的陈述,或补充有部分个人研究、发现的成果;编书的对象是某一科目,某一知识编辑成册;教材的对象是目录,课文、习题、实验、图表、注释和附录等部分构成,课文是教材的主体。
3、形式:专着可以分为单篇学术论文、系列学术论文和学术专着三种;编着、教材、编书大致是以书的形式展现出来。
二、专着、学术专着、个人学术专着的区别和界定
1、含义:专着指的是针对某一专门研究题材的,是着作的别称;学术专着是指作者根据在某一学科领域内科学研究的成果撰写成的理论着作,该着作应对学科的发展或建设有重大贡献和推动作用,并得到国内外公认;个人专着是指由个人完成的一项研究成书的专着。
2、范围:,专着的范围包含学术专着,也就是学术专着是专着中的一种,同时个人学术专着有是学术专着中的一种。
3、完成人数:专着和学术专着都可以由多人完成,个人专着只能由一个人完成。
(8)什么是自编译教材扩展阅读
专着深层解析
1、学术论文
学术论文,学术通常是指专深而系统的学问,而论文则是指研究、讨论问题的文章。因此,所谓学术论文就是在科学领域内表达科学研究成果的文章。从这一意义上理解,学术论文一般也可以称为科学论文。
其一,学术论文的范围限制在科学研究领域,非此领域的文章,不能算学术论文,如新闻报道、报告文李、散文和杂文等就不能算学术论文。
其二,我们说学术论文限制在学术领域,但并非说,科学领域的所有的文章都是学术论文,而只有表达科学研究新成果的文章才是学术论文。照这样理解,科幻和科普作品就应被排除于学术论文之外了。
2、投稿论文
研究人员写给学术期刊、杂志或学术出版社要求发表的文章。
3、命题论文
上级领导部门根据社会的需要提交给科研人员的研究项目文章,或者由指导教师提交给研究生、大学生的研究课题文章。
4、毕业论文
大学生毕业时编撰的论文。
5、学位论文
授予学位的人(硕士或博士)撰写的论文。
6、计算机软件论文
⑼ 自学编译原理什么书最好
我们学校用的是《编译原理》与《编译原理与实践》这两本书,这两本书都是国外的教材。我觉得《编译原理与实践》这本书不错,自学应该能看懂,而且代码比较多,书最后还有整个小型编译器的源代码。
编译不好学,你就慢慢学吧。
下面的资料请作参考:
当代编译技术三大圣经级别的教材
1.龙书(Dragon book)
书名是Compilers: Principles,Techniques,and Tools
作者是:Alfred V.Aho,Ravi Sethi,Jeffrey D.Ullman
内容简介
《编译原理》作者Alfred V.Aho、Ravi Sethi和Jeffrey D.Ullman是世界着名的计算机 科学家,他们在计算机科学理论、数据库等很多领域都做出了杰出贡献。《编译原理》 是编译领域无可替代的经典着作,被广大计算机专业人士誉为“龙书”。《编译原理》一 直被世界各地的着名高等院校和科研机构(如贝尔实验室、哥伦比亚大学、普 林斯顿大学和斯坦福大学等)广泛用作本科生和研究生编译原理与技术课程的 教材,《编译原理》对我国计算机教育界也具有重大影响。 书中深入讨论了编译器设计的重要主题,包括词法分析、语法分析、语法制 导分析、类型检查、运行环境、中间代码生成、代码生成、代码优化等,并在 最后两章中讨论了实现编译器的一些编程问题和几个编译器实例,而且每章都 提供了大量的练习和参考文献。
⑽ 自学编程需要哪些教材
这个看您想学习哪方面的编程了
最开始学习的时候看视频的效果可能会更好一些,自己看书不明白的地方,别人几句话就讲明白了,会更加高效
以前自学编程是在如鹏网上学习的,有好多免费的视频教程可供学习,下载,讲的挺不错的,听起来一点都不枯燥,没想到编程还可以这么学