




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译原理心得编译原理是计算机及相关专业的一门重要专业课程,在计算机科学中有很重要的地位和作用,已被国内外高校列为计算机专业的主要课程。它主要介绍了高级程序设计语言编译程序构造的一般原理、基本设计方法、主要实现技术和一些自动构造工具。通过该课程的学习,对提高学生计算机软件素质,使学生真正认识计算机信息处理实质并综合运用所学的软件设计技术来分析问题等具有很大作用。该课程理论性与实践性都很强,我们在学习 是普遍感到内容非常抽象,不易理解,内容多且繁琐,难以完整、全面地掌握编译原理的有关知识,更不用说灵活运用编译原理知识从事相关设计或应用于其他领域。虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对我们提供了系统而有效的训练,有利于提高软件人员的素质和能力。采用有用的资助手段增强课堂教学效果。基于Internet网络和多媒体技能,资助手段有种种千般的情势,可以借用有:讨论学习模式、探索学习模式、提供种种资源库的网上资助教学应用模式。在Internet上实现讨论学习的要领有多种,最简略实用的是使用现有的电子通告牌体系(BBS),这种体系具有用户管理、讨论管理、文章讨论、实时讨论,用户留言、电子信件等诸多功效。编译原理在学习历程,门生题目难点不能逐一与老师举行面临面举行,那末议决网络,可以题目果然,老师创建相应的主题,门生可以在自己学习的特定地域发言,门生之间可以举行交换,全部的题目都果然化。 探索学习模式。这种模式一样平常都是由某些教诲机构设立一些适当特定门生工具的题目,议决Internet向门生公布,要求门生解答;同时提供大量的、与题目相干的信息资源供门生在解决题目历程中查阅。这种模式彻底转变了传统教学历程中门生被动继承的状态,而使门生处于积极自动的职位地方,因而能有用地引发门生的学习兴趣和创造性。在我们学习编译原理以前,都认为编译原理只能应用在写程序语言的编译器上,觉得用处不大,学习兴趣不高。而在后来的学习中,我们逐渐认识到计算机专业的学生,除了要会编写程序语言之外,还应该了解它是如何被计算机所识别,这才是真正并且透彻地学习软件。另外,编译器中每一个模块的编写,都能对我们的编程能力的提高有很大帮助。在今后若从事软件工程,这门课程也能够对编写程序有所帮助。为了能够系统掌握这门专业课,我们把编译原理分为以下几个模块:(1)语言和文法;(2)词法分析;(3)语法分析;(4)语义分析和中间代码生成;(5)代码优化和目标代码生成;(6)关于实践。在学习的开始,我们需要掌握什么是编译,编译分为哪些阶段,编译程序和解释程序的区别等等。在做好了这些方面的准备后,开始了系统的学习。语言和文法语言和文法部分的知识包括文法基本概念及文法的二义性。基本概念有文法定义、推导、句型、句子等等。二义性文法是通过画语法树的方法来证明。词法分析词法分析相对来说比较简单。可能是词法分析程序本身实现起来很简单吧,很多没有学过编译原理的人也同样可以写出各种各样的词法分析程序。不过编译原理在讲解词法分析的时候,重点把正则表达式和自动机原理加了进来,然后以一种十分标准的方式来讲解词法分析程序的产生。这样的做法道理很明显,就是要让词法分析从程序上升到理论的地步。词法分析中的重点是有穷自动机DFA的生成以及DFA和正规式与正规文法的关系。还要熟练掌握NFA转换为DFA的方法及DFA的化简。词法分析的核心应该是构建DFA,最后维护一个状态转移表。通过转态转移的结果来识别词性。DFA的思想和字典树很像。NFA通过求每个状态的闭包后构造出的自动机与DFA等价。正则表达式闭包,连接,或三种操作都有相应的NFA与其等价。所以正则表达式=NFA=DFA。DFA状态最小化算法化简DFA。LL(1)文法主要就是根据FIRST集 判断向哪条路径走,来避免回溯;LR(0)文法构造项集闭包构成的自动机,通过有穷自动机的状态转换来判断该规约还是该移进来做出相应的操作并且更改堆栈和Buffer的状态,注意此时有可能发生移进规约冲突,并且如果不运用FOLLOW集的话有些出错状态无法识别,只能当规约处理。 SLR(0)文法是再LR(0)的基础上运用FOLLOW集来判断出错状态 SLR(0)文法的无法处理移近规约冲突。 LR(1)文法是在LR(0)文法的基础上构建LR(0)的增广项集,其他与LR(0)相似,通过增广项集可以解决移近规约冲突问题,但无法解决部分规约规约冲突问题。 LALR貌似只是将LR文法中的一些等价状态合并构成一个更小的自动机,有点像DFA状态最小化方法。 算符优先文法 构造语法树的结构找到相应的优先级构成一个优先级表,两个栈,一个用来存OP一个用来存操作数,当两个算符相遇时判断两个算符的优先级,做出相应的操作:进栈或计算。语法分析语法分析包括自上而下和自下而上分析。自上而下分析着重掌握LL(1)文法,自下而上分析重点掌握算符优先文法和LR(0)、SLR(1)文法。语法分析部分就比较麻烦一点了。现在一般有两种语法分析算法,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,可以说就是这中基于堆栈的指令代码的。在学习文法时,对文法的组成,用法都较为明了,而在真正做题时却感到十分吃力。例如给出了一个语言,要求写出它的上下文无关文法,就感到十分棘手,所以今后在这方面要加大练习量,以熟练掌握。而在之后的词法分析和语法分析中,我感到在看基本原理时十分困难,通常要长时间钻研才能够有所了解,而一旦掌握了基本原理,做题时就感到十分顺畅了。例如,在刚接触到LR(0)文法时,我用了大量的时间去学习它的原理,掌握之后,在列LR(0)分析表和写分析过程时,只要思路清晰,就会比较顺畅,而且不会犯错。语义分析和中间代码生成关于语义分析,语法制导翻译,类型检查等等部分,其实都是一种完善前面得到的抽象语法树的过程。比如说,我们写C语言程序的时候,都知道,如果把一个浮点数直接赋值给一个整数,就会出现类型不匹配,那么C语言的编译器是怎么知道的呢?就是通过这一步的类型检查。像C+语言这中支持多态函数的语言,这部分要处理的问题就更多更复杂了。大部编译原理的教材在这部分都是讲解一些比较好的处理策略而已。因为新的问题总是在发生,旧的办法不见得足够解决。程序的语义就是它的“意思”,它与语法或结构不同。程序的语义确定程序的运行,但是大多数的程序设计语言都具有在执行之前被确定而不易由语法表示和由分析程序分析的特征。 这些特征被称作静态语义(static semantic),而语义分析程序的任务就是分析这样的语义(程序的“动态”语义具有只有在程序执行时才能确定的特性,由于编译器不能执行程序,所以它不能由编译器来确定)。一般的程序设计语言的典型静态语义包括声明和类型检查。由语义分析程序计算的额外信息(诸如数据类型)被称为属性(attribute),它们通常是作为注释或“装 饰”增加到树中(还可将属性添加到符号表中)。 在正运行的C表达式 a index = 4 + 2 中,该行分析之前收集的典型类型信息可能是:a是一个整型值的数组,它带有来自整型子范围的下标;index则是一个整型变量。接着,语义分析程序将用所有的子表达式类型来标注语法树,并检查赋值是否使这些类型有意义了,如若没有,则声明一个类型匹配错误。在上例中, 所有的类型均有意义,有关语法树的语义分析结果可用以下注释了的树来表示。语义分析重点是其功能,中间代码生成和语法制导翻译定义与方法。关于中间代码生成,代码生成,代码优化部分的内容就实在不好说了。国内很多教材到了这部分都会很简单地走马观花讲过去,学生听了也只是作为了解,不知道如何运用。不过这部分内容的东西如果要认真讲,单独开一学期的课程都讲不完。在编译原理及实践的书上,对于这部分的讲解就恰到好处。作者主要讲解的还是一种以堆栈为基础的指令代码,十分通俗易懂,让人看了后,很容易模仿,自己下来后就可以写自己的代码生成。当然,对于其它代码生成技术,代码优化技术的讲解就十分简单了。如果要仔细研究代码生成技术,其实另外还有本叫做Advance Compiler Desgin and Implement,那本书现在由机械工业出版社引进的,十分厚重,而且是英文原版。不过这本书我没有把它列为推荐书给大家,毕竟能把龙书的内容搞清楚,在中国已经就算很不错的高手了,到那个时候再看这本Advance Compiler Desgin and Implement也不迟。代码优化部分在大学本科教学中还是一个不太重要的部分,就是算是实践过程中,相信大家也不太运用得到。毕竟,自己做的编译器能正确生成执行代码已经很不错了,还谈什么优化呢?代码优化和目标代码生成最后,优化分为局部优化和循环优化,重点理解一些关键词,如基本块、流图等,要学会自己画出程序流图。用DAG图进行局部优化是重点。 编译原理课程的学习是学生可以对程序设计语言的设计和实现有深刻的理解,还可以有助于学生快速理解定位和解决在程序编译、测试与运行中出现的问题。由于涉及形式语言、有穷自动机等抽象内容,在“以教师为中心,教师讲、学生听”的传统教学模式下,学生在学习中普遍感觉内容太过抽象、缺乏学习积极性。在教学过程中,学生理解和掌握这门课有一定难度,出现这种情况的原因存在以下几个方面: (1)编译程序规模大。由于编译原理是一个极其复杂的系统,程序规模大,导致不可能在一节课或一段时间讲述完,只好将它肢解开来一部分一部分地研究,但是这样容易造成知识体系断裂。不可能在短时间让学生对整个编译系统各部分融会贯通,理清各部分逻辑关系的顺序。学生学习过程中应该注意前后联系,切忌由静止的、孤立的观点看待问题。 (2)理论知识抽象。要完整地构造一个编译系统并不是一件容易的事情,它不仅需要具有较完备的软件知识,并需要掌握现有的软件工具的使用,而且更重要的是要有丰富的实践经验,了解硬件系统结构和操作系统的功能。这些对于刚学完基础知识的学生来讲,简直如同“天书”,理解难度系数相当大。 (3)算法的理解和实现。编译原理这门课包含许多理论知识和算法,这些理论的学习和理解都存在着一定的难度。其中理论知识包括:词法分析器的构造,语法中各种分析器(LR, LL,SLR,LALR等)实现与完成。关于实践 编译原理的课程毕竟还只是讲解原理的课程,不是专门的编译技术课程。这两门课程是有很大的区别的。编译技术更关注实际的编写编译器过程中运用到的技术,而原理的课关注讲解其基本理论。但是计算机科学本身就是一门实践性很强的课程,如果能够学以致用,那才叫真正的学会。李阳在讲解疯狂英语的时候就说到,只要当你会实际中运用一个单词一个词组的时候你才能叫学会了这个单词或者词组,而不是只是知道了它的拼写和意思。其实任何学习都是一样的,如果缺少了实践的结合,你不能算学会。 编译原理的课程主要就是讲解编译器产生的理论和原理,那么很简单,自己写个编译器就是最好的实践过程了。下面是一个实例:1. Lex和Yacc. 这两工具是作为词法分析很语法分析的工具。如果你自己写一个编译器,我十分不建议你连词法分析这种事情都亲手来写。Lex和Yacc应该是作为每本编译原理的教材的必备内容,可是在国内的教材中缺很少看到。这两个工具是Unix系统下的小东西,如果你要在Windows中运用,那么你最好去下在cygwin这个软件。它是个在Windows下模拟Unix的东东,里面就包含了flex.exe和bison.exe(yacc)这两个工具.这两个工具使用起来还挺麻烦的(其实unix 下的很多十分有用的工具都是这样), 不过在编译原理与实践这本书上对于这两个工具的讲解十分详细,还列举了不少实际的例子。2. 做解释型语言比做生成机器代码的编译器简单。虽然说,做解释型的编译器,像Java那样的,你还得自己去写解释器,不过这样你就不必去查找机器代码的资料了。如果你做生成的最终机器代码编译器可能会遇到问题还有就是寄存器为基础的代码生成方法。前面说过,如果你生成的是以堆栈为基础的代码,那么其代码生成过程十分简单,需要考虑的东西也不多,如果你考虑最终的机器代码生成的话,你必须考虑机器的寄存器如何分配等麻烦的问题。3. 考虑用别人已经生成的语法文件,尽量不要自己动手写词法文件和语法文件.以前一个朋友曾经说过,写出一个好的程序语言的语法定义,就几乎完成了一个编译器的一半.确实是这样,语法文件的编写是个很难的事情.现在网上到处都可以
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年新型环保材料国际贸易代理服务合同
- 二零二五年安防产品销售与售后维护服务合同
- 二零二五代购代销合同家居建材批发销售协议
- 2025版木地板产品售后服务合同
- 二零二五年度环保材料销售合同格式
- 二零二五年度建筑工程合同风险管理补充协议书范本
- 二零二五年度水利工程单项劳务分包合同样本
- 安徽二零二五年度劳动合同范本及员工关系管理
- 二零二五年度生态修复工程进度管理合同
- 二零二五年度家政服务居间服务合同样本
- 《小儿高热惊厥讲解》课件
- 绿化设施设备管理制度
- 2025年甘肃白银有色集团股份有限公司专业技术人员招聘计划(200人)笔试核心备考题库及答案解析
- 专题03词语梳理与辨析-2023年三年级语文暑假专项
- 自愿放弃景点协议书(2篇)
- 2022-2023年铁矿粉购销合同协议书范本
- 信息检索课件 第2章 文献检索方法(1)-2
- 学校网络与信息安全检查表
- CTF信息安全竞赛理论知识考试题及答案
- 石油化工劳务分包合同
- 2024-2030年中国热电行业运营模式及盈利前景预测报告
评论
0/150
提交评论