学编译怎么样
⑴ 为什么要学习编译原理
大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。在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)都作了十分详细的说明。这些东西都是我们编写平常程序的时候经常要做的事情,但是我们却少去探求其内部是如何完成。
关于中间代码生成,代码生成,代码优化部分的内容就实在不好说了。国内很多教材到了这部分都会很简单地走马观花讲过去,学生听了也只是作为了解,不知道如何运用。不过这部分内容的东西如果要认真讲,单独开一学期的课程都讲不完。在《编译原理及实践》的书上,对于这部分的讲解就恰到好处。作者主要讲解的还是一种以堆栈为基础的指令代码,十分通俗易懂,让人看了后,很容易模仿,自己下来后就可以写自己的代码生成。当然,对于其它代码生成技术,代码优化技术的讲解就十分简单了。如果要仔细研究代码生成技术,其实另外还有本叫做《》,那本书现在由机械工业出版社引进的,十分厚重,而且是英文原版。不过这本书我没有把它列为推荐书给大家,毕竟能把龙书的内容搞清楚,在中国已经就算很不错的高手了,到那个时候再看这本《》也不迟。代码优化部分在大学本科教学中还是一个不太重要的部分,就是算是实践过程中,相信大家也不太运用得到。毕竟,自己做的编译器能正确生成执行代码已经很不错了,还谈什么优化呢?
编译原理的课程毕竟还只是讲解原理的课程,不是专门的编译技术课程。这两门课程是有很大的区别的。编译技术更关注实际的编写编译器过程中运用到的技术,而原理的课
⑵ 编译原理学了有什么用
对大多数人来说,学过编译原理,应该可以知道对于很多代码的优化,编译器其实可以做好,不需要自己写代码的时候杞人忧天。在通用、局部的优化上,甚至编译器往往做得比程序员好。
大概率会意识到编译原理背后的故事,也许会沉迷在某个方向,也许还会乐于看一些奇妙的parser构建方式。
大概还可能会去学习类型系统,发现形式化的故事似乎在很多方面都有对应的版本,而后,他们也许会尝试走向研究,去挑战目前都没有好好解决的代码优化问题,也许会走向应用,用起LLVM,在上面加个target,支持一些新硬件,做个新语言的前端等。
编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 编译原理是计算机专业设置的一门重要的专业课程。
编译原理课程是计算机相关专业学生的必修课程和高等学校培养计算机专业人才的基础及核心课程,同时也是计算机专业课程中最难及最挑战学习能力的课程之一。编译原理课程内容主要是原理性质,高度抽象。
编译可以分为五个基本步骤:词法分析、语法分析、语义分析及中间代码的生成、优化、目标代码的生成。这是每个编译器都必须的基本步骤和流程, 从源头输入高级语言源程序输出目标语言代码。
1、词法分析
词法分析器是通过词法分析程序对构成源程序的字符串从左到右的扫描, 逐个字符地读, 识别出每个单词符号, 识别出的符号一般以二元式形式输出, 即包含符号种类的编码和该符号的值。
词法分析器一般以函数的形式存在, 供语法分析器调用。当然也可以一个独立的词法分析器程序存在。完成词法分析任务的程序称为词法分析程序或词法分析器或扫描器。
2、语法分析
语法分析是编译过程的第二个阶段。这阶段的任务是在词法分析的基础上将识别出的单词符号序列组合成各类语法短语, 如“语句”, “表达式”等.语法分析程序的主要步骤是判断源程序语句是否符合定义的语法规则, 在语法结构上是否正确。
而一个语法规则又称为文法, 乔姆斯基将文法根据施加不同的限制分为0型、1型、2型、3型文法, 0型文法又称短语文法, 1型称为上下文有关文法, 2型称为上下文无关文法, 3型文法称为正规文法, 限制条件依次递增。
3、语义分析
词法分析注重的是每个单词是否合法, 以及这个单词属于语言中的哪些部分。语法分析的上下文无关文法注重的是输入语句是否可以依据文法匹配产生式。
那么, 语义分析就是要了解各个语法单位之间的关系是否合法。实际应用中就是对结构上正确的源程序进行上下文有关性质的审查, 进行类型审查等。
4、中间代码生成与优化
在进行了语法分析和语义分析阶段的工作之后, 有的编译程序将源程序变成一种内部表示形式, 这种内部表示形式叫做中间语言或中间表示或中间代码。
所谓“中间代码”是一种结构简单、含义明确的记号系统, 这种记号系统复杂性介于源程序语言和机器语言之间, 容易将它翻译成目标代码。另外, 还可以在中间代码一级进行与机器无关的优化。
5、目标代码的生成
根据优化后的中间代码, 可生成有效的目标代码。而通常编译器将其翻译为汇编代码, 此时还需要将汇编代码经汇编器汇编为目标机器的机器语言。
6、出错处理
编译的各个阶段都有可能发现源码中的错误, 尤其是语法分析阶段可能会发现大量的错误, 因此编译器需要做出错处理, 报告错误类型及错误位置等信息。
⑶ 学编程前景怎么样
随着大数据,云计算,物联网,人工智能的火热发展,需要大量的从业人员,软件编程薪资待遇一直比较高,而且刚过完年,京东,阿里又要招聘相关从业人员,而且凡是进入这个行业的开发人员工资都是水涨船高,有个几年年的工作经验的反而会更好找工作,薪资会越来越高
编程算是一个门槛比较高的职业了,长期以来都是供不应求的,而且从这么多年看来,需求量始终不减,工资一直都是比较高的,即使之后学编程的人越来越多,只要是属于前20%的,何愁应聘时工资会降低呢
从个人角度来看,编程从现在以及随后几十年间都是一个非常有前景的行业,除非到了市场非常饱和,程序员遍地都是的情况,但目前显然不是,去任何一个公司招聘人员上看,互联网行业都算是比较火爆的行业,招录程序员的不在少数,工资比一般水平要高很多,即使像文科出身的,都想要在业余时间学编程,但可惜自学难度太高,又没有系统的时间去报班学习,实在是一大遗憾
那么,我们来聊聊编程难吗?
很多时候,做的事情其实没有我们想象的那么难,只是我们把他想难了,举个例子,我们都知道要学好一个技术做好一件事,必须要掌握一万小时定律,其实这个观点说对也对,说错也对,怎么讲呢?一万小时定律是需要成为专家级别的人语言奋斗的时间,而真正学习一门技术,如果只是入门,其实仅仅只需要二十小时,如果每天花两小时来建议,那么入门也就十天就可以搞定,编程也是如此,如果我们仅仅只是入门,其实真的在我看来找准方法,十天半个月足够了,当然如果说要找到工作,那估计要四个月到半个月的每天学习努力
怎么学习?
重视基础,这个不是喊口号,很多人学习编程眼高手低,觉得自己能看懂,能随便写点东西就算学会了,问了一些基础东西一问三不知,还不服气说会编程就好,要懂那些做什么,这是最大的错误,基础很重要,例如,你不知道面向对象的编程语言特点,你如何去做方法的封装?如何去做类的继承和如何能明白别人写这段代码的时候为什么要这么处理?这些都是基础能告诉你的
编程是个手脑并用的活,光看懂明白是没有用的,如果不用手去敲一下代码永远不知道自己会饭什么错,我曾经因为一个空指针问题排查了一个小时,也因为一个地方没写分号找了半天,这些都不是看书就能得来的经验,在我烦了这些错误之后我会总结,记下来,作为我自己的经验,然后下次再遇到就知道自己曾经在这里犯错了,就会小心不在犯错
⑷ 大家觉得,学编程的怎么样
因为我本人是学习计算机软件专业的,根据我的亲身体会就是:从近期看,学习编程专业还是挺好的。但是从长远来看:其实该专业本身也是吃青春饭的,所以说如果从长远来看,学习编程如果只是停留在编写程序源代码的层次上的话,那么随着自己年龄的增长,总会有一天到了自己已经无法编写程序了,那个时候,就会感觉到计算机这个行业更新得太快了,自己已经落伍了;但是如果自己除了掌握计算机编程技能之外,还能够具有坚实的理论基础(例如:掌握数据结构及其算法、高等数学、概率统计、离散数学等)的话,那么今后随着自己年龄的增长,即使自己不能够编写程序源代码了,但是此时就可以依靠自己具备的计算机坚实的理论基础,承担公司、或者是国家的重大科研项目,然后再带领一个软件研发团队搞开发。
这样的话,依靠以前学习的编程技能、及其计算机理论就是非常容易赚钱的了。例如:计算机界的教授、博导、专家就是属于这类人物,虽然自己的年龄大了、变老了,不能够坐在电脑前敲程序代码了,但是他们可以带领学生搞科研任务,并且他们的收入要远远高于只会做编程工作、不懂计算机理论的人员。
⑸ 学习编译原理和操作系统对编程能力有什么作用
学习编译原理和操作系统对编程能力对编程能力的作用在于:
1、学好了编译原理,才可能编写出高效,稳健,占用内存少的程序。
2、学习操作系统对windows相关的编程很有帮助。如果是对操作系统关系不大的C/C++/c#,java之类的编程,关系不大。
编译原理是计算机专业的一门重要专业稿歼源课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法键态分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 编译原理是计算机专业设置的一门重要的专业课程。虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力。
操作系统(Operating System,简称OS)是管理和控制改吵计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行。
⑹ 学编程前景怎么样
挣得多+学得会
Part.1
自从“互联网+”这一概念普及以来,拥抱互联网就成为新常态,互联网从业人员的薪资也水涨船高,技术岗位更是分分钟过万,其中佼佼者年薪百万也很常见。
而且就现在来讲,我国每年的IT人才缺口在 20 万左右,且实际需求还远远大于这个数字,在可预计的将来,IT人才都将处于供小于求的状态。所以就职业“钱”景来讲,学习编程是非常优质的选择。
Part.2
也许有的同学还会有这样的顾虑,前景是有了,可我不是科班出身,也不是英语、数学专业的,那一行行代码看都看不懂,到底能不能学会啊?
其实,英语和编程之间并不存在必然联系,说直白一点,英语不能决定你学习编程的好坏。
就拿c++和python来看看。实际上C语言和C++语言本身需要的英文单词,学名关键词或者保留字,也就几十个。根据ISOC++的标准,一共有63个关键词,而初学者用的比较多的单词,也就20多个,即使英文再不好,20多个单词还是能记住的。
再来看看python的关键词,python的关键词一共也就30多个。换句话说,只需要你记住这几十个单词就可以写程序了。
所以,其实编程能用到的英文是有限的,更重要的是要不断的去练习和实践。
在这里呢,我也给你些学习小建议,大家可以了解下;
1、有明确的目标
正所谓业精于专,相较于科班生,非科班转行的在基础方面确实比较薄弱,因此必须要有明确的目标。譬如是想学Java、Python还是PHP等等,每种编程语言都有自己的优势和市场,结合多方面因素选择一种最适合的编程语言。
2、兴趣是最好的老师
学习编程的过程难免枯燥,如果没有兴趣,是很难坚持下去的。所以,在选择转行之前,一定要明确自己是否真的对编程感兴趣,至少应该是不反感,否则是很难坚持下去的。
3、不要急于求成
必须承认,编程作为一门技术工种,还是有一定门槛的,不是随便简单培训一两个月就可以成功,需要有长时间的坚持,而且现在技术更迭速度越来越快,即使工作以后,也还要继续坚持学习。
⑺ 学习编译原理有作用
在毕业多年后我又翻出了当年的编译原理书,然后又买了一本类似的书,真是太有用了。
无论是工作上还是业余中如果想编一点稍微有一些智能的程序,必然要用到。目前大家都在用的正则表达式是用编译原理做的,那只是一个很小的应用例子。
大一点的应用可以做到一定的技术先进性,从而让你在本行业站稳脚跟。
比如
可以用语法分析来分析出一段用户上传是否含有代码,从而让你的网站更健壮。
分析和分解用户输入的SQL语句,理解是否有害和是否有SQL注入。
在业务软件中结算方面允许用户输入条件表达式和四则运算,允许用户自定义结算公式或条件,使软件上一个档次。
甚至可以实现自己创造的编程语言,以后编程全用自语言来做,然后编译成老板要的那种语言。有的公司要JAVA,有的公司要C#,C++,VB等等你都不必每样都费心了。这样做还有一个好处,你的源程序其实是自语言,目标代码则是社会上公认的源程序,所以是可以公开的。如果以这种技术为核心技术开公司的话,则有着技术上更高一层的先进性,这种核心竞争力是很值钱的。
试想,你公司的员工只会用自语言,他们跳槽的机会就少了。而你公司的用户总是可以得到全套的他们认为的源程序,则市场机会就大了。别的一般软件公司可不敢给出全套源程序,总要多少保留一点的。
⑻ 学编程的好处和坏处
好处:
1、掌握一门技能。
2、培养意志。
3、解决数学运算,记录档案数据,查询数据等问题。
4、锻炼逻辑思维。
坏处:
身体不好。
电脑辐射对身体不好,而且长时间地坐在电脑前容易导致近视,眼疲劳。
编程是编定程序的简称,就是让计算机代为解决某个问题,对某个计算体系规定一定的运算方式,使计算体系按照该计算方式运行,并最终得到相应结果的过程。
为了使计算机能够理解人的意图,人类就必须将需解决的问题的思路、方法和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算体系之间交流的过程就是编程。
(8)学编译怎么样扩展阅读:
编程的执行原理
1、计算机对除机器语言以外的源程序不能直接识别、理解和执行,都必须通过某种方式转换为计算机能够直接执行的。
2、这种将高级程序设计语言编写的源程序转换到机器目标程序的方式有两种:解释方式和编译方式。
3、解释方式下,计算机对高级语言书写的源程序一边解释一边执行,不能形成目标文件和执行文件。
4、编译方式下,首先通过一个对应于所用程序设计语言的编译程序对源程序进行处理,经过对源程序的词法分析、语法分析、语意分析、代码生成和代码优化等阶段将所处理的源程序转换为用二进制代码表示的目标程序。
然后通过连接程序处理将程序中所用的函数调用、系统功能调用等嵌入到目标程序中,构成一个可以连续执行的二进制执行文件。调用这个执行文件就可以实现程序员在对应源程序文件中所指定的相应功能。