1、编译原理课程论文一、编译原理简介 编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 编译原理是计算机专业设置的一门重要的专业课程。虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力。 二、编译原理的发展历程在 20 世纪 40 年代,由于冯诺伊曼在存储-程序计算机方面的先锋作用,编写一串代码或程序已成必要,这样计算机就可以执行所需的计算。开始时,这些程序都是用机器语言(machine l
2、anguage )编写的。 汇编语言大大提高了编程的速度和准确度,人们至今仍在使用着它,在编码需要极快的速度和极高的简洁程度时尤为如此。但是,汇编语言也有许多缺点:编写起来也不容易,阅读和理解很难;而且汇编语言的编写严格依赖于特定的机器,所以为一台计算机编写的代码在应用于另一台计算机时必须完全重写。发展编程技术的下一个重要步骤就是以一个更类似于数学定义或自然语言的简洁形式来编写程序的操作,它应与任何机器都无关,而且也可由一个程序翻译为可执行的代码。 分析问题的研究是在 20 世纪 60 年代和 70 年代,它相当完善地解决了这一问题, 现在它已是编译理论的一个标准部分。它们与乔姆斯基的 3 型
3、文法相对应。对它们的研究与乔姆斯基的研究几乎同时开始,并且引出了表示程序设计语言的单词(或称为记号)的符号方式。人们接着又深化了生成有效的目标代码的方法,这就是最初的编译器,它们被一直使用至今。人们通常将其误称为优化技术 ,但因其从未真正地得到过被优化了的目标代码而仅仅改进了它的有效性,因此实际上应称作代码改进技术 。这些程序最初被称为编译程序 -编译器,但更确切地应称为分析程序生成器 (parser generator ) ,这是因为它们仅仅能够自动处理编译的一部分。这些程序中最著名的是 Yacc ,它是由 Steve Johnson 在 1975 年为 Unix 系统编写的。类似地,有穷自
4、动机的研究也发展了另一种称为扫描程序生成器的工具,Lex 是这其中的佼佼者。在 20 世纪 70 年代后期和 80 年代早期,大量的项目都关注于编译器其他部分的生成自动化,这其中就包括代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。编译器设计最近的发展包括:首先,编译器包括了更为复杂的算法的应用程序,它用于推断或简化程序中的信息;这又与更为复杂的程序设计语言(可允许此类分析)的发展结合在一起。其中典型的有用于函数语言编译的 Hindle y - Milner 类型检查的统一算法。其次,编译器已越来越成为基于窗口的交互开发环境的一部分,它包括了编辑器、链接程序、调
5、试程序以及项目管理程序。这样的 IDE 的标准并没有多少, 但是已沿着这一方向对标准的窗口环境进行开发了。三、编译原理主要内容该门课中主要讲述的是两种分析方法,即自上而下分析的方法和自下而上分析的方法。自上而下分析法是从文法的开始符号出发,反复使用各种产生式,寻找“匹配”于输入符号串的推导。自下而上的分析方法是从输入符号串开始,逐步进行“归约”到文法的开始符号。自上而下的分析法主要的就是 LL(1)文法,首先要判断某个文法是否是LL(1)文法,如果是就可以按照 LL(1)文法分析的方法去判断某一个输入串是否为该文法的句子。LL(1)f 分析方法是,首先根据判断是否为 LL(1)文法求出每一个非
6、终结符的 SELECTE 集合来构造该文法的预测分析表,然后根据预测分析表去分析输入串得出结果;如果不是 LL(1)文法,比如说文法产生式中含有左递归和相同的因子,就要消去左递归或公共因子,再根据每一个非终结符的SELECT 集合来判断是否为 LL(1)文法。利用 LL(1)文法分析一个输入串是不是某一个文法的句子,根据预测分析表是比较直观的,而且分析的效率也是比较高的。自下而上的分析方法主要是算符优先分析方法。算符优先分析的基本思想是只规定算符之间的优先关系,也就是只考虑终结符之间的优先关系,由于算符优先分析不考虑非终结符之间的优先关系,在归约的过程中只要找到可归约串就归约,没有考虑非终结符
7、之间的优先关系,所以说算符优先归约不是规范规约。算符优先分析首先是要构造算符优先关系矩阵;然后就是分析输入串,根据关系矩阵进行移进或归约操作;最后分析得出判断的结果。算符优先分析是有缺点的,由于算符优先分析方法在分析的过程中不知道如何确定句柄。下面要说的就是 LR(0)文法,这种方法能够根据当前分析栈中的符号串就可以惟一的确定分析器的动作是移进还是归约,并且是用哪一个产生式。根据规则写出 LR(0)的分析的项目集,再由项目集构造 LR(0)的分析表,其次根据分析栈的元素和状态,查看分析表,找出相关的句柄,是归约还是移进,最后就是分析得出结果了。SLR(0)文法是以 LR(0)文法为基础的文法,
8、是为了解决程序设计语言的文法不能够满足 LR(0)文法条件的另一种文法分析的方法,大致的与 LR(0)的分析过程相似,只是在项目集的组合上有些区别。四、编译器的工作原理编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。然而,也存在从低阶语言到高阶语言的编译器,这类编译器中用来从由高阶语言生成的低阶语言代码重新生成高阶语言代码的又被叫做反编译器。也有从一种高阶语言生成另一种高阶语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联) 。典型的编译器输出是由包含入口点的名字和地址, 以及外部调用(到不在这个目标文件中的函数
9、调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的可执行程序。四、学习总结编译原理这门课程主要是向我们讲述是如何将一些语言编写的源程序翻译成计算机能够识别的机器语言的原理。编译原理课程是一门理论性比较强的课程,其中的文法,语言等概念到 LL(1)文法、算符优先文法、 LR(0 文法)以及 SLR(1)文法等的分析,基本上都是对具体问题的抽象,是需要更多的时间去理解和掌握的。通过这学期的对编译原理课程的学习,这么课程让我学会了如何去编译程序的一个理论知识,知道编译程序是通过怎样的方法把程序员编写的源程序翻译成计算机能够执行的机器语言的,我觉得主要的是大大加深了我对程序设计的理解,也对计算机的理论和软件编译有了深一步的理解。这学期的编译原理的实验使我知道了编译程序的工作的基本过程及其各阶段的基本任务,了解了 编译程序流程框图,编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,可以说这是将书本上的理论知识的应用,是对理论知识的更深一步的理解和掌握。