电脑桌面
添加盘古文库-分享文档发现价值到电脑桌面
安装后可以在桌面快捷访问

编译原理范文

来源:盘古文库作者:火烈鸟2025-09-141

编译原理范文(精选10篇)

编译原理 第1篇

因此该论文设计了一个简单的类C教学编译器。目的是使学生真正理解编译程序的构造原理和技术,学好“编译原理”课程。选择编写C编译器主要因为C是一种常用的过程式,当前对象式语言的基本上是过程式的,因此掌握类似的C等过程式语言的编译技术,不难实现对象式语言编译程序。此外,该论文最终实现的目标代码是基于一个自定义虚拟机代码,通过对些代码的解释执行来得到最终运行结果。这个技术可以保证该编译器基于平台的无关性,易于移植到不同体系结构的计算机上去。

1 系统分析

C教学编译器的设计目标是将完成从源代码到目标代码生成这一阶段的工作。由于设计该编译器目的是用于教学,所以尽量采用教学上较成熟并已广泛应用的技术和算法。此外为让学生对当前流行的虚拟技术有所了解,该编译器在生成目标代码时先生成虚拟代码,再对虚拟机代码进行解释执行得出最终运行结果。这样就便于在不同目标机器上移植了。C教学编译器采用C语言开发,通过C的编译器自编译生成。

2 总体设计

本文所实现的是一个针对教学编译的编译系统。所以在编译程序实现过程中,要体现出《编译原理》课程的基本内容:词法分析、语法分析、语义分析、中间代码及目标代码的生成及出错处理等,以帮助学生学习,此外[2],在实现过程中,不宜单纯追求运行效率而使用过于复杂的算法;而助为便于学生进一步扩充,程序规模必须适度,因此功能也不应过于复杂。所以,C教学编译器由词法分析、编译预处理、语法分析、语义分析、出错处理、符号表、中间代码生成及优化、选择和发送指令、寄存器分配、生成目标代码执行等等模块组成。在C教学编译器的实现过程中,我们尽量引用新思想、新方法,使学生在学习编译器设计和实现过程中,还会学到其他的知识。比如基于需要给标识符分配空间,对缓冲区的应用,分离哈希链表的设计。同时,在实现目标代码时,行先生成虚拟机的目标代码,再对虚拟机的目标代码指令进行解释执行,得出最终执行结果。这样,便于各种不同机器体系结构之间的移植工作。因为只需要重写将模拟机目标代码转换成机器代码的解释程序即可。整体设计(如图1所示整体设计图)

3 各模块详细设计

模块设计均采用学生比较熟悉且较新的算法,一方面避免了学生陷入算法的细节中,而忽略了对整体的把握。另一方面能帮助学生学习其他的技术。

3.1 词法分析器

词法分析器工作的第一步是接受输入的源程序,每次读入一行源程序代码进入缓冲区,每识别出一个符号,就将其转化为程序的内部约定Token记号,留给语法分析程序识别处理。

为提高扫描器工作的效率,把缓冲区模式设计为一个成对且对半互补的输入缓冲区模式。即一个缓冲区分为两个半区,每个半区的长度为n。每次,扫描器把长度为民的源程序输入到缓冲区的一个半区,如果最后一个单词恰好被截断了,则将源程序中后继长度为n的字符读入别一个半区,两个半区交替使用,达到互补的作用。

在C教学编译器的词法分析阶段,需要识别以下各类符号,并返回内部约定的记号。如关键字、标识符、常数、字符串、运算符、分隔符、注释。除了注释,其余六种符号以根据C语言里的标准定义,先写出它们的DFA,然后编程实现。因为将C语言里的注释写成DFA是非常困难,我们直接根据定义编程处理即可。

由于关键字比较少,至多有三十几个,所以在处理用户自定义标识符过程序中,为节约空间,采用的是动态分配空间,即使用realloc标准C函数。

3.2 语法分析器

C教学编译器的语法分析模块主要进行语法分析,确认输入是否符合语言的文法规则,并建立源程序的编译器内部表示形式-语法树,供进一步处理。C教学编译器的语法分析程序,选择自顶向下的方法,应有Yacc[3.6]工具和手工编写方式进行构造。一方面ANSIC语法的上下文无关描述已经存在。而且是满足自底向上的条件,可以验证是满足LALR(1)文法的。采用YACC工具,不仅一点困难都没有,还可以带来有利的一面,比如,Yacc可以生成语法树,这对下一步的语义分析非常有帮助。有利于以后在语法树上添加语义、代码生成动作。另一方面,C教学编译器主要应用于教学,故为使学生能够清楚的了解语法分析的构造过程,也要手工进行编写。

3.3 符号表构造模块

为了便于进行维护,在符号表模块中采用离链表的杂凑表这一数据结构方式实现,具体方法如下:为每个作用域建立一个新的符号表链接在一起。这样如果查找操作在当前表中没有找到名字,就自动到链接在一起。这样如果查找操作在当前表中没有找到名字,就自动链接的上一层表中查找。离开操作则非常简单,对应于作用域的整个符号表能在一步中释放,不需要每个作用域有一张符号表,由最内层向最外层链接。离开一个作用域只要重设访问(在左边有指示)指向最近的外层作用域。(如图2)所示即符号表结构图。

3.4 语义分析器

C教学编译器的语义分析包括:类型构造、类型检查、一致性检查、相关名字检查、作用域分析、还要各种运算符进行语义检查(不同的运算符对操作数的类型有不同的要求),对if,while,for等语句的条件表达式进行类型判断、优化及其它一些操作。其中,最为重要的是对C语言中特有的指针进行处理,只有把指针处理好,上述,各步骤才能顺利进行。因此,C教学编译器采用了较简单的线性链表来表示C语言中所有类型的指针表示,使复杂的指针处理得到了很好的解决,使类型的指针表示,使复杂的指针处理得到了很好解决,使类型判断、类型检查和类型提升的处理得到简化和顺利完成。

3.5 运行环境

C教学编译器采用简单的栈式运行环境。其中C中的malloc和free等自由分配空间的函数,需要堆式式方法来实现,为减轻学习编译难弃。故将这一函数从类编译器的源语言集合里面剔除了。

3.6 目标代码

虚拟机是针对于真正的计算机而言的一个概念。它是一个假想的模拟真实计算机进行工作的软件系统。它同真实计算机一样,有自己的CPU、指令系统、存储器组织、寄存器组、编制语言及高级语言编写的程序,完成计算或数据处理工作。在C教学编译器中,采用的技术是宏扩展技术,中间代码采用P-代码形式。实现思路是:先用P-代码实现一个虚拟机,然后再用代码解释执行方式,完成源程序的最终运行和得出结果。编译器的最终目的是要正确的对源程序完成任务编译和执行。从语法树过度到机器语言还有很大的距离。编译程序生成的代码可以被一个用汇编语言写的小程序解释执行。

4 未完成的任务

由于定义的C教学语言是一种用于编译原理教学的语言,为了不陷入无穷尽的细节考虑和实现中,只保留了C语言的精华部分,没有预处理部分和库函数部分。

参考文献

[1]刘平安.改革实践性教学模式加强学生工程素质培养[J]。机械工业高教研究,2002,(4):42-45。

[2]吕映芝,张素琴,蒋介石维杜.编译原理[M]。北京:清华大学生出版社,1998。

编译原理学习心得 第2篇

从联系最紧密的操作系统来说吧,你写多线程/多进程的程序就得和操作系统的知识打交道。写多线程得加锁吧,临界区、死锁的四个条件之类的标准的操作系统的内容吧(不得不吐槽一下,某国内一线电商干了三年的程序猿,写多线程居然不知道加锁,也是醉了)。进程间通信的几种方式什么管道、socket、共享内存等,这也是操作系统的内容吧。文件系统,这也是经常要打交道的东西。还有内存什么的,你做 Android 开发,这些里边有很多东西都在系统层面被封装好了,但是你要是不知道原理,一旦出了错根本无从调试,况且你该不会打算写一辈子写 Android 就是填逻辑吧。

然后,是编译原理,普通的程序猿是接触不到编译器或者虚拟机的开发的。但是这并不意味着编译原理就用不到。说个最常见的读取配置文件,只要你的配置文件有自定义的语法,你就要用编译原理的东西。还有类似于自动生成代码啦、正则表达式啦这些都算是编译原理的内容。你既然是写 Java 的不了解虚拟机怎么可以,最基本的字节码总是需要能看懂的吧,分析一些疑难杂症的时候字节码还是很有用的。

最后,是计算机原理,如果只是做应用开发的话计算机原理其实不必要掌握的多深入,但是一些基本的概念还是要清楚的。比如 寄存器、缓存、中断什么的,关键的时候可以帮助你调试。在一些对性能要求非常高的场合,也是很有作用的。此外,学了计算机组成基本上汇编差不多能够看懂了吧,这个对于优化代码、查错、反汇编还是很有用的。

编译原理 第3篇

【关键词】编译原理 教学内容 课程实验

【中图分类号】H191【文献标识码】A【文章编号】1673-8209(2010)05-0-01

1 引言

编译原理课程是计算机科学与技术专业的重要专业课,它不仅能帮助学生更深入地了解计算机以及计算机程序的本质,还能提高学生进行问题求解的能力。本课程的理论性和实践性都很强。国外和国内分别从二十世纪六十和八十年代开始设置“编译原理”课程,从文献[1,2]两本专著的内容可以看出,几十年来,“编译原理”课程可以讲授的内容越来越多。设置该课程的目的在于系统地向学生讲叙编译程序设计的基本理论、编译系统的结构及编译程序各部分的设计原理和实现技术。通过对这些知识的学习,使学生既能掌握编译理论和编译方法等方面的基本知识,又具有设计、分析、实现和维护编译程序等各方面的综合能力。该课程一般包括理论教学和实验教学两部分。编译原理理论知识包括形式语言、有穷自动机等抽象内容及大量的算法,较难理解和掌握,因此“编译原理”的实验教学对于深化学生对所学理论知识的理解,提高学生的理论联系实践的能力和编程水平具有重要的作用。

本文根据编译原理课程的特点,结合自己的教学经验与我院的实际情况,探讨了普通本科院校编译原理的实践教学内容的设置。

2 课程实验的重要性

编译原理是集理论与实践于一体的一门课程,在理论课中所介绍的基本概念、原理、方法和算法,一定要通过实验加以理解和吸收,才能能够达到真正的理解、吸收和掌握。编译原理课程实验的内容主要放在对词法分析、语法分析和语义分析、中间代码生成、中间代码优化和目标代码生成的方法上。由于编译原理课程有很强的理论性与实践性,在学习时普遍感到内容抽象,不易理解,掌握起来难度很大。因此通过教学实践和对学生所做的调查表明,设计一组与理论内容相配套的实验是十分必要的。

3 课程实验的设计

针对编译原理课程的特点及要求,共设置了五个实验项目。这组实验既和理论课内容相辅相承,同时相互之间又互相关联,构成了一个实验整体。

实验一

题目:消去C、C++程序中的注释(2学时,必做)

实验目的: 掌握C语言文件的基本操作,消除源C语言程序中的注释,为以后的编译提供方便。

实验要求:对给定的带注释的C语言源程序,利用该程序去掉注释,输出去除注释的源程序。

实验二

题目:词法分析(必做,4学时)

目的:通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。

要求:编写程序对输入的源程序字符串进行词法分析,对符合下述文法描述的字符串,建立单词符号表,不符合的字符串给出错误信息。

内容:用扩充的BNF表示如下:

<标识符>→<字母>{<字母> <数字>}

<整型常数>→<数字>{<数字>}

<算符>→+ - * / ( ) =

<字母>→a b c … y A B C … Y

<数字>→1 2 3 4 5 6 7 8 9 0

实验三

题目:递归下降分析法(4学时,选做)

目的:根据给定的文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。

要求:对给定的文法,利用递归下降分析法对任意输入的符号串进行分析语法分析,对符合下述文法描述的字符串(表达式或赋值语句),给出中间代码,不符合的字符串给出错误信息。

内容:用扩充的BNF表示如下:

<赋值语句>→<标识符>=<表达式>

<表达式>→<表达式>{+<项> -<项>} <项>

<项>→<项>{*<因子> /<因子>} <因子>

<因子>→<标识符> (<表达式>)

即:S→i=E

E→E+T E-T T

T→T*F T/F F

F→i (E)

实验四

题目:语法分析程序LL(1) (4学时,必做)

目的:通过该实验使学生掌握描述语法规则的文法,以及加深对语法分析中自顶向下分析法中的预测分析法的理解。

要求:对给定的文法建立预测分析表,利用预分析法对实验一中词法分析产生的符号进行语法分析,对符合下述文法描述的字符串(表达式或赋值语句),给出中间代码,不符合的字符串给出错误信息。

内容:用扩充的BNF表示(同实验三)。

实验五

题目:语法分析程序LR(1) (4学时,必做)

目的:通过该实验使学生加深对语法分析中自下而上分析法中的LR分析法的理解。

要求:对给定的文法手工建立LR(1)分析表;利用LR分析法对实验二中词法分析产生的符号进行语法分析,对符合实验中文法描述的字符串(表达式或赋值语句)给出中间代码;不符合的字符串给出错误信息。

内容:用扩充的BNF表示(同实验三)

4 小结

编译原理课程在计算机课程体系中的重要地位,决定了其课程建设和改革的长期性,对培养计算机专业的人才也有着重要的作用,探索该课程的教学方法,提高教学质量是从事计算机教育工作者的必须重视的问题,也是一个永远值得探讨的问题,我们根据我系的实际情况合理的运用现代手段,综合考虑多种因素,将该课程的教学改革推向更科学的发展道路。

参考文献

[1] Alfred V.Aho,Ravi Sethi,Jeffrey D.Ullman. Compilers:principles,techniques,and tools[M]. New York:Addison Wesley,1986.

[2] Alfred V.Aho,Monica S.Lam,Ravi Sethi,Jeffrey D.Ullman..Compilers: principles, techniques, and tools[M]. 2nd edition.New York:Addison-Wesley,2007.

[3] 孟亚辉.关于《编译原理》课程教学的思考.科技信息,2008年第16期.

编译原理教学方法初探 第4篇

编译原理是一门研究设计和构造编译程序原理和方法的课程, 是计算机专业的一门重要的专业基础课。同时编译程序也是复杂的系统软件, 因而就给这门课程的教学和学习带来了非常大的困难和困惑。笔者结合当前编译原理教学现状和本人的一些教学经验对该课程的教学提出几点设想。

编译原理的教学现状

编译原理这门课程的内容太抽象, 理论性较强[1], 对于学生来说是难于理解与学习;对于教师而言是难教。根据笔者的调查研究发现, “编译原理”这门课程在教与学上之所以会出现这种问题, 主要的原因由以下几个方面:

首先, “编译原理”课程作为是计算机专业学生的一门专业课程, 内容抽象, 理论性强, 而且对前面所学的相关计算机基础课依赖性大, 需要学习者有一定的基础和学习积极性, 而课程本身的理解困难和抽象, 也使得学生对这门课程产生了畏惧心理, 尤其是学生掌握这门课程感到很吃力, 产生所学的内容与他们实际的需要有较大的距离。认识上的偏差, 使学生极易产生厌学情绪, 同时也会失去学习的兴趣。其次, 编译原理实验环节比较薄弱。由于缺少实践过程, 学生的学习仅局限于书本, 碰到不理解的问题虽经过老师的讲解, 但对知识的理解仍是一知半解, 缺少去验证书本上的知识和自己动手去实验的过程。最后, 教学手段单一、理论与实际脱节。由于课程自身技术的原因, 使得许多现代教学手段很难在教学过程中得到应用。

关于编译原理课程理论教学的几点建议

(1) 鼓励学生打好基础, 掌握好与该课程相关的前期课程的知识。这些课程中最主要的有:《C语言》、《汇编语言和程序设计》、《数据结构》、《程序设计方法》等。如果这些基础的计算机知识都没有掌握好, 就要学好编译原理是不可能的。

(2) 根据学生的实际情况, 合理选用教材和参考书, 尽量保持教学内容的实践性和先进性。国内外编译原理教材多种多样, 比较著名的有由美国Kenneth编著, 机械工业出版社出版的《编译原理及实践》以及由张素琴编著, 清华大学出版社出版的《编译原理 (第2版) 》, 这些教材都可作为面向计算机科学研究方向的综合性大学教材和面向计算机应用方向的工科院校教材。教材的多种多样为学习提供了多种选择机会, 但教师必须根据学生的实际情况来选择教材, 同时注意编译原理的及时更新性和发展性。一本切合实际好的教材会直接影响教学的效果。

(3) 帮助学生克服畏惧心理。根据“编译原理”这门专业课程的特点, 首要任务是帮助学生克服畏惧心理, 才能发挥他们的学习主动性[2]。在上课之前先了解学生以往所学的计算机相关课程, 帮助他们分析已经掌握的知识和知识的体系结构, 让学生对自己所掌握的知识有足够的了解, 肯定他们自己所具有的能力。让学生明白“编译原理”课程的专业特点, 知道以他们已经掌握的计算机知识, 有足够的能力学习掌握“编译原理”这门课程的知识和技能。通过课堂和实

冯向萍

验, 不断灌输上述观念, 帮助学生克服畏惧心理, 建立信心, 变被动地接受知识为主动地去学习。

(4) 利用现代化教学设施, 精心制作电子课件, 开展多媒体教学。“编译原理”课程的内容抽象, 知识点多, 信息量大。文中有大量分析表和关系表的文字叙述, 理解起来有一定的难度。如果采用传统的教学形式, 必将耗费大量的时间在图表的绘制和文字的书写上, 从而影响到教学的效率和效果。因此, 教师应精心编排和制作教学用电子幻灯片。对于学生难于理解的内容, 比如像词法分析, 语法分析的相关内容应将分析过程和思路通过动画的形式表示出来, 以便于学生的理解与记忆。同时, 结合板书灵活、可以随机应变, 的特点, 在教学中将多媒体教学与传统教学的结合, 以达到最好的教学效果。

关于编译原理实验教学几点看法

编译原理实验是大多数学校教学的薄弱环节。其原因: (1) 学生、教师不重视实验; (2) 教师、学生对编译程序的代码不熟悉。

(1) 独立设立实验课。编译原理是实践性很强的课程, 通过实践学习编译原理的知识应该是最佳途径。独立设实验课, 就是实验教学不再依附于理论教学。它独立开课, 独立考核, 形成标准的编译原理实验教学体系。建立一套完整的实验教学计划、实验教学大纲、实验教材, 单独设定学分, 规定计划实验学时。按照大纲, 根据现有的实验条件, 制定出切实可行的实验教学内容。将验证性实验和设计性实验以及综合性实验科学分配。学生可以通过验证性实验, 掌握编译程序的基本原理。设计性实验和综合性实验可以培养学生的动手能力和综合应用知识的能力, 充分发挥学生的主观能动性, 激发学生的学习编译原理的兴趣和热情。

(2) 加强实验教学的组织与管理。学生是主体, 教师是主导。教师简明扼要地讲授实验理论知识、实验目的、实验内容、重点和难点、注意事项, 然后让学生进行实验, 实验过程中, 出现问题一般由学生自主研究解决, 教师仅作启发性提示和引导。在实验课程性质上分必做实验与选做实验, 在方式上变定时封闭式教学为灵活开放式教学, 并建立BBS互动教学平台或提供优秀论坛网址, 增强与学生的交流。

编译原理课程教学的优化改进应适应课程教学改革和专业发展的实际需要, 切实贯彻该课程的本科教学大纲和基本要求, 不断地完善教学活动的各个环节。在传授学生编译原理理论的同时, 真正培养学生在系统软件开发方面的综合能力。

参考文献

[1]吕映芝, 张素琴, 蒋维杜.编译原理[M].北京:清华大学出版社, 2002.1-3.

编译原理学习论文(推荐) 第5篇

班级:09应用(2)班姓名:彭文阳学号:2009081215

大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。在20世纪50年代,编译器的编写一直被认为是十分困难的事情,第一Fortran的编译器据说花了18年的时间才完成。在人们尝试编写编译器的同时,诞生了许多跟编译相关的理论和技术,而这些理论和技术比一个实际的编译器本身价值更大。就犹如数学家们在解决著名的哥德巴赫猜想一样,虽然没有最终解决问题,但是其间诞生不少名著的相关数论。

推荐参考书

虽然编译理论发展到今天,已经有了比较成熟的部分,但是作为一个大学生来说,要自己写出一个像Turboc C,Java那样的编译器来说还是太难了。不仅写编译器困难,学习编译原理这门课程也比较困难。

正是因为编译原理学习相对困难,那么就要求有好的教师和好的教材。教师方面不是我们能自己更改的,而在教材方面我们却可以按自己的意愿来阅读。我下面推荐几本好的编译原理的教材。我推荐的书籍都是国外的经典教材,因为在国内的教材中,确实还没发现什么让人满意的。

第一本书的原名叫《Compilers Principles,Techniques,and Tools》,另外一个响亮的名字就是龙书。原因是这本书的封面上有条红色的龙,也因为獗臼樵诒嘁朐?砘?×煊蛉肥堤?忻???所以很多国外的学者都直接取名为龙书。最近机械工业出版社已经出版了此书的中文版,名字就叫《编译原理》。该书出的比较早,大概是在85或86年编写完成的,作者之一还是著名的贝尔实验室的科学家。里面讲解的核心编译原理至今都没有变过,所以一直到今天,它的价值都非凡。这本书最大的特点就是一开始就通过一个实际的小例子,把编译原理的大致内容罗列出来,让很多编译原理的初学者很快心里有了个底,也知道为什么会有这些理论,怎么运用这些理论。而这一点是我感觉国内的教材缺乏的东西,所以国内的教材都不是写给愿意自学的读者,总之让人看了半天,却不知道里面的东西有什么用。第二本书的原名叫《Modern Compiler Design》,中文名字叫做《现代编译程序设计》。该书由人民邮电出版社所出。此书比较关注的是编译原理的实践,书中给出了不少的实际程序代码,还有很多实际的编译技术问题等等。此书另外一个特点就是其“现代”而字。在传统的编译原理教材中,你是不可能看到如同Java中的“垃圾回收”等算法的。因为Java这样的解释执行语言是在近几年才流行起来的东西。如果你想深入学习编译原理的理论知识,那

么你肯定得看前面那本龙书,如果你想自己动手做一个先进的编译器,那么你得看这本《现代编译程序设计》。

第三本书就是很多国内的编译原理学者都推荐的那本《编译原理及实践》。或许是这本书引入国内比较早吧,我记得我是在高中就买了这本书,不过也是在前段时间才把整本书看完。此书作为入门教程也的确是个不错的选择。书中给出的编译原理讲解也相当细致,虽然不如前面的龙书那么深入,但是很多地方都是点到为止,作为大学本科教学已经是十分深入了。该书的特点就是注重实践,不过感觉还不如前面那本《现代编译程序设计》的实践味道更重。此书的重点还是在原理上的实践,而非前面那本那样的技术实践。《编译原理及实践》在讲解编译原理的各个部分的同时,也在逐步实践一个现代的编译器Tiny C.等你把整本书看完,差不多自己也可以写一个Tiny C了。作者还对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)都作了十分详细的说明。这些东西都是我们编写平常程序的时候经常要做的事情,但是我们却少去探求其内部是如何完成。

关于中间代码生成,代码生成,代码优化部分的内容就实在不好说了。国内很多教材到了这部分都会很简单地走马观花讲过去,学生听了也只是作为了解,不知道如何运用。不过这部分内容的东西如果要认真讲,单独开一学期的课程都讲不完。在《编译原理及实践》的书上,对于这部分的讲解就恰到好处。作者主要讲解的还是一种以堆栈为基础的指令代码,十分通俗易懂,让人看了后,很容易模仿,自己下来后就可以写自己的代码生成。当然,对于其它代码生成技术,代码优化技术的讲解就十分简单了。如果要仔细研究代码生成技术,其实另外还有本叫做《Advance Compiler Desgin and Implement》,那本书现在由机械工业出版社引进的,十分厚重,而且是英文原版。不过这本书我没有把它列为推荐书给大家,毕竟能把龙书的内容搞清楚,在中国已经就算很不错的高手了,到那个时候再看这本《Advance Compiler Desgin and Implement》也不迟。代码优化部分在大学本科教学中还是一个不太重要的部分,就是算是实践过程中,相信大家也不太运用得到。毕竟,自己做的编译器能正确生成执行代码已经很不错了,还谈什么优化呢?

关于实践

编译原理的课程毕竟还只是讲解原理的课程,不是专门的编译技术课程。这两门课程是有很大的区别的。编译技术更关注实际的编写编译器过程中运用到的技术,而原理的课关注讲解其基本理论。但是计算机科学本身就是一门实践性很强的课程,如果能够学以致用,那才叫真正的学会。李阳在讲解疯狂英语的时候就说到,只要当你会实际中运用一个单词一个词组的时候你才能叫学会了这个单词或者词组,而不是只是知道了它的拼写和意思。其实任何学习都是一样的,如果缺少了实践的结合,你不能算学会。

编译原理的课程主要就是讲解编译器产生的理论和原理,那么很简单,自己写个编译器就是最好的实践过程了。不过你得小心,编译系统可能是所有软件系统中最复杂的系统之一,不然为什么大学里面还会把编译器的编写开成一门叫做编译原理的课程来讲?我很佩服那些学了操作系统原理就开始自己写操作系统,学了编译原理就开始自己写编译器的人们,确实,在中国,敢这么做的学生太少了。且不管你这样做能不能做成功,至少有了这个尝试,会让你的程序设计,系统规划安排的功底增进不少。我下面给出一些关于实践过程中可能会遇到的困难,希望能够在你陷入困境的前帮你一把。

1.Lex和Yacc.这两工具是作为词法分析很语法分析的工具。如果你自己写一个编译器,我十分不建议你连词法分析这种事情都亲手来写。Lex和Yacc应该是作为每本编译原理的教材的必备内容,可是在国内的教材中缺很少看到。这两个工具是Unix系统下的小东西,如果你要在Windows中运用,那么你最好去下在cygwin这个软件。它是个在Windows下模拟Unix的东东,里面就包含了flex.exe和bison.exe(yacc)这两个工具.这两个工具使用起来还挺麻烦的(其实unix 下的很多十分有用的工具都是这样), 不过在《编译原理与实践》这本书上对于这两个工具的讲解十分详细,还列举了不少实际的例子。

2.做解释型语言比做生成机器代码的编译器简单。虽然说,做解释型的编译器,像Java那样的,你还得自己去写解释器,不过这样你就不必去查找机器代码的资料了。如果你做生

成的最终机器代码编译器可能会遇到问题还有就是寄存器为基础的代码生成方法。前面说过,如果你生成的是以堆栈为基础的代码,那么其代码生成过程十分简单,需要考虑的东西也不多,如果你考虑最终的机器代码生成的话,你必须考虑机器的寄存器如何分配等麻烦的问题。

编译原理课程建设的探讨 第6篇

本课程系统介绍编译程序设计,词法分析,语法分析,符号表,声明和存储管理,代码生成以及优化技术。通过本课程的学习,能够使学生掌握编译原理中所涉及算法的基本原理和运用方法,对程序设计语言的设计和实现有较深刻的理解;知道将高级程序设计语言源程序翻译成计算机能处理的目标语言代码的整个过程;同时具备设计、实现、分析和移植编译程序的初步能力,为从事计算机软件开发及理论研究打下坚实的基础。

由于编译原理课程本身理论性强、教学内容枯燥无味,实践内容过程繁琐、实验结果理想,学生普遍存在畏难情绪,教学效果不佳。本文就编译原理课程教学方法的改革,结合我校课程建设的要求,就如何提高编译原理的教学效果进行了深入的探讨。

1 理论知识教学方法的探讨

1.1 教学内容体系的设计

编译原理是程序设计语言的编译程序构造的基本原理和实现技术,是计算机软件的核心技术之一。课程的内容包括编译程序设计,词法分析,语法分析,符号表,声明和存储管理,代码生成以及优化技术等。通过我们课程教研小组的多年的教学经验和学术讨论,我们将课程教学内容划分为如下的知识模块:编译程序设计、文法和形式语言基础、词法分析语法分析、LR分析、语法制导翻译和中间代码的生成、符号表、目标程序运行时的存储组织、代码优化和代码生成10大模块。在每个模块中,进一步划分为子模块,如语法分析模块进一步分为语法的形式化定义、自底向上语法分析和自顶向下语法分析、预测分析和递归下降分析程序、错误处理、预测分析程序的自动生成、LR分析和LR分析程序的自动生成、符号表管理和支持翻译过程的工具的使用子模块。这样,能够从上到下,逐步细化的思想,把握编译原理的教学内容。

各个模块以案例带动知识点基本原理、算法和技巧,逐层深入地进行教学。

1.2 多媒体教学手段与传统教学方法相结合

多媒体教学是通过多媒体以声、形、景并茂的形式展现教学内容,能够使学生在大脑中形成清晰、稳定的抽象概念,使教与学的语言在传递过程中由浅入深、有序分层地展开。利用多媒体教学方法可以改进教学情境,激发学生的学习兴趣,增强学生的参与意识,优秀的教学情境能唤起学生强烈的求知欲望,使他们能够保持长久的学习热情,从而获得最佳的教学效果。利用多媒体教学方法,能有效利用有限的教学时间,加大教学内容的密度,提高课堂教学的效果。

多媒体教学方法新颖别致,多媒体教学改变了传统教学教学中粉笔加黑板的单一的形式,能够将抽象、深奥的知识直观化、形象化,取到了激发学生学习兴趣,调动学生学习主动性。对于课程教学中的突现灵感、临场发挥的内容,无法及时用多媒体展现,则可以用传统教学教学方法,如板书进行教学。又如,在多媒体教学过程中,教学课件演示节奏较快,有时学生来不及思考,就一闪而过,这样并没有达到教学的目的。传统教学中教师和学生有良好的互动性,可以根据学生的基础及掌握的程度来灵活地调控课堂教学速度及方法。因此,在多媒体教学中可以适当地运用传统教学的调控作用。这样,既能发挥多媒体教学生动形象、信息量大而宽的优势,又保留传统教学方法节奏可控、交流自如等特点,取得比单一教学方法更佳的教学效果。

1.3 案例教学法作为教学方法的重点

案例教学是在学生具备一定的知识与技术的基础上,为了更加深入理解学习内容,在教师的组织和指导下,运用典型案例,将学生带入事先准备好的情景进行案例分析,通过学生的独立思考或团队合作,进一步提高识别、分析和解决某一具体问题的能力,同时培养正确的独立思考能力、沟通能力和协作精神的教学方式。

例如,我们在讲述上下文无关文法时,采用的案例为“写一个上下文无关文法,使其语言能被5整除且不以0开头的无符号整数集合(如{5,10,15})”。

开始,要求学生,按照任何开发语言实现器其功能。接着,讨论能被5整除的数的问题,从形式上看,是以0,5结尾的数字串。题目要求不以0开头,注意0不是该语言的句子。句子的结构分为三种,如图1所示。

其中,A代表可以出现在个位上的数字,只能是0或5;B代表可以出现在开始位上的数字,除了0以外,其他数字都可以;C代表可以出现在中间位上的数字。0-9所有数字都可以。

于是,A→0|5

写文法时,先描述一位数结构,于是有产生式S→5。对于两位数和多位数,都是以B开头和以A结尾,于是有产生式S→DA。用非终结符D推导出两位数和多位数中除个位数字以外的数字。对与多位数,由于中间位可以是许多位,必须使用递归技术来描述其结构。于是有产生式:

因此,所求文法为G[S]:

这种教学方法能增强学生感性认识,直接激发学生求知欲,深受学生欢迎。

1.4 网络资料的充分利用,实现资源共享

现在的Internet为网络教学提供了另一片施展教学的天地。做为精品课程,应该充分利用网络资源,让学生在课余时间,也能享受学习的环境和乐趣,我们构建了编译原理课程网站,将课程教学目标、大纲、电子教案、教学CAI、经典案例等教学资源放入课程网站上,向学生免费开放,实行教学资源共享。学生可在课余时间,在寝室、家中,通过课程网站随时进行学习,通过课程网站上的BBS进行学习交流,发表自己的见解,深入理解教学内容,培养学生的求知欲望。

2 实践知识教学方法的探讨

编译原理是集理论很强的一门专业课程,需要通过课程设计实现知识点,才能达到真正的理解、吸收和掌握。因此,课程设计是一个重要的教学环节,要求学生能将所学课程知识能够应用到实际的问题中,其目的是培养学生综合运用所学理论知识和技能分析问题、解决问题的能力和初步进行科学研究的能力,培养学生创新能力。

为此,我们课程组在课程设计上,撰写课程设计指导书,内容涵盖了词法分析、语法分析和语义分析、中间代码生成、中间代码优化和目标代码生成的方法等。课程设计采用分组的形式,每小组根据自己的兴趣,完成部分的设计,从题目的确定到设计过程、设计技巧等等,教师都鼓励学生在设计过程中提出自己的新观点。评定课程设计成绩时,对创新性能力的考核权重加大,必要时,给予一定的物质和精神奖励。重视课程设计实践环节,不但提高实践教学的质量,而且能够培养学生的创新能力。

3 课程考核方法的设计

考核是对学生学习课程结果的检验,是学生劳动成果的鉴定方法之一,对教学目标的实现具有至关重要的作用。在本课程的考核中,结合我校的实际,采用平时成绩占30%、理论考试成绩占30%考核和课程设计40%量化方式进行考核。平时成绩通过课堂出勤、平时作业和上课提问等形式作为评定平时成绩的重要依据。考试成绩采用试题库组卷进行考试。我们课程组建立了编译原理试题库。试题库以教学大纲为蓝本。题目制作的原则是侧重考核学生分析问题和解决问题能力,每个题目都附有参考答案和评分标准。考试试卷采用一定的算法组卷,保证试卷科学性、全面性和公正性。试题库的使用能够克服任课教师自己制卷、自己阅卷评分的主观随意性,使得考核具有公平合理的评价机制,实现了教考分离,明显提高了教学反馈信息的可信度。课程设计考核按照学生课程设计的完成情况、创新点等进行评定打分。这种考核方式公平合理,强调同学们的动手能力,得到了学生和专家的认可。

4 结束语

编译原理在计算机科学技术中的重要地位,决定了其课程建设和改革的长期性,对培养学生的思维能力和专业能力有着重要的作用。编译原理作为我校一门示范精品课,经过几年的的改革和探索,编译原理理论教学与实践教学的效果得到了显著改善,学生学习编译原理的兴趣和创新能力得到了明显提高。

摘要:编译原理是本科院校计算机类专业的核心课程,是专业必修课程之一。探讨编译原理在理论教学、实践环节的操作、课程考核等方面的教学过程。结合我校编译原理课程建设的实际经验,就如何提高课程教学质量、激发学生的学习兴趣,提出了一些行之有效的教学改革方法,这些方法对本科院校深入教学改革和创新人才的培养具有一定指导性意义。

关键词:探讨,理论教学,实践教学,考核方法,课程

参考文献

[1]王顺晔.“编译原理”课程教学方法的研究与实践[J].计算机教育,2010(3):36-38.

[2]朱素英.普通本科院校编译原理实践教学改革探讨[J].教育教学研究,2010(5):166.

[3]张素琴,吕映芝,蒋维杜,等.编译原理[M].2版.北京:清华大学出版社,2007.

关于《编译原理》课程的教学思考 第7篇

从1946年第一台计算机产生至今, 计算机的发展仅仅过去了不到70年的时间, 从最初单一的仅由0和1组成的机器语言发展到现在的多种高级语言, 编译技术起了决定性的作用, 正是编译技术迅速、成熟的发展, 人们才能摆脱繁琐的机器语言, 走进和自然语言相近的高级语言时代。

《编译原理》课程主要是研究基于形式语言理论的编译技术, 是计算机专业的专业核心课程之一, 课程主要介绍编译程序是如何将高级语言程序翻译成机器能够执行的低级语言程序的工作原理和方法, 编译程序经历的各个阶段, 以及这些阶段的功能和构造。《编译原理》课程的先行课程主要有数据结构、离散数学、计算机组成原理、线性代数和程序设计基础等, 该课程的目的是在于系统地向学生讲述编译系统的结构、工作流程以及编译程序各组成部分的设计原理和实现技术, 使学生通过本课程的学习, 既掌握编译理论和方法方面的基本知识, 同时也获得设计、分析和移植编译程序方面的初步能力, 进而提高学生设计多种软件的素质。[1]

《编译原理》课程是计算机专业中公认的难教难学课, 课程的理论性强, 抽象性高, 但是鉴于其在计算机中起的决定性作用, 各个高校的计算机专业都将其列为非常重要的专业课, 而且在研究生期间还继续开设该课程。课程不但涉及了形式语言理论、自动机、编译技术等抽象的内容, 而且也是程序设计、算法、数据结构、离散数学等知识的综合体现。课程帮助学生了解计算机的工作过程, 认识计算机信息处理的实质, 而且其中的一些算法也很经典, 通过《编译原理》课程的学习, 可以提高学生对计算机系统的总体认识, 对理解算法、程序设计思想和编写更高效的代码具有重要的影响。

2 采用多种方式, 注重理论教学

《编译原理》课程是一门理论性和技术性都非常强的课程, 内容丰富而且抽象, 而且不像一些应用类课程, 除非是专业从事编译技术的人员, 否则对于学生而言无实际应用价值, 缺乏学习的积极性, 而且学生在学习的过程中, 容易忽略各章之间的连贯性, 仅仅是掌握了一些独立的算法, 分离的知识点, 抓不住重点, 分不清主次。要想取得良好的教学效果, 首先要让学生认识到课程的重要性, 再配合以合理的教学方法和手段。因此, 在《编译原理》课程的教学中, 可以采取多种教学方式和教学模式, 较好的完成教学效果。

(1) 讲授式教学法:课程理论性很强很多多, 讲授法就是首选的最直观的的方法。但编译技术中涉及了大量的抽象概念, 所以填鸭式的讲授法不能取得好的教学效果。对于抽象的理论, 要尽量采用形象、生动、直观、具体的讲授方式, 充分调动学生的积极性和兴趣, 注重知识点的连贯和系统性, 引导学生的思维, 注重学生信息反馈, 教学相长。比如说, 讲到编译系统的组成和功能, 为了将之后的词法分析、语法分析、语义分析、代码优化、目标代码生成等阶段连贯起来, 可以在讲授的过程中制作一些动画, 将各个阶段连贯起来。或者将编译过程和英翻汉的过程做对比讲解, 英翻汉首先要搞清楚各个单词的含义, 也就是词法分析过程, 然后将句子的结构划分清楚, 就是语法分析, 接下来给出句子的意思, 即语义分析, 然后注意前后顺序, 将句子的中文含义给的更贴合中文习惯, 即代码优化, 最后给出完整、准确的中文, 就是目标代码生成了。这样的讲授方式, 学生更能够接受, 而且通过例子, 学生充分理解了什么是编译过程。

(2) 启发式教学法:这种教学方法主要是教师根据教学任务和学生的实际情况, 以启发学生思考为核心, 调动学生的主动性和积极性, 促进学生主动学习。对于课程中出现的大量算法, 可以采用这种教学方式, 比如讲到文法的二义性, 可以不要直接讲授定义, 可以给出一个二义性文法, 一个同样的句型, 让学生自己推导, 画出语法树, 由于推导习惯和分析角度的问题, 肯定会有不同结果, 让学生自己分析, 为什么会产生不同结果, 产生不同结果会对句型分析造成的影响等等, 然后再引出二义性的概念, 通过学生自己的分析, 得出了和二义性相关的结论, 不但提高了学生的积极性, 还加深了对抽象理论的理解。

(3) 案例教学法:采用具体的案例, 在讲解案例的过程中, 将知识点贯穿其中, 将抽象的问题具体化。案例教学主要是鼓励学生主动思考, 变注重知识为注重能力, 重视学生和老师、学生和学生之间的双向交流。在编译原理的学习过程中, 预测分析是一种很重要的分析技术, 但是学生常常将理论和应用联系不起来。因此, 在教学过程中, 可以先给出一个具体的预测分析表, 根据这个分析表做相应的语法分析, 也就是先给出预测分析表的应用。然后根据文法, 讨论如何产生该分析表。通过选择和教学内容相符的案例, 配以形象、直观、生动的授课形式, 易于学生接受和理解理论基础, 并将理论应用与实践中, 进一步深化和巩固专业知识。

(4) 对比教学法:通过对一些知识点的比较, 寻找知识点间的异同。这种方法促使学生多元化解读, 多角度思考, 激发讨论, 区分异同, 知识结构清晰, 学生就能更好的理解和掌握, 不会造成知识点混乱。比如讲到有穷状态自动机中, 确定 (DFA) 和非确定 (NFA) 两种时, 先讲DFA的生成和运行, 然后给一个NFA的文法, 让学生构造FA, 然后运行, 查看结果, 总结两种FA的不同, 阐述不同的FA运行时不同的结果, 然后在文法中查找根源, 总结为何文法会产生两种不同的FA, 从而, 掌握什么样的文法会产生什么样的FA, 以及两种FA的异同。通过对比教学, 学生能够充分理解两个相近的知识点, 而且不会产生混淆。

3 积极推进实验改革

《编译原理》课程不但要求学生掌握编译系统的结构和工作流程, 还要培养学生设计编译程序的基本能力, 而且其中还有许多的经典算法, 通过实践, 不但能够加深学生对抽象理论的理解, 还能提高学生分析、设计软件的能力, 培养学生的专业能力, 提高学生的专业素质。

在实践过程中, 大部分学校的实践环节都存在或多或少的问题。一些学校不重视实践课程, 甚至没有实践环节, 认为现有的编译系统很成熟, 不存在再开发的问题, 而且以后从事专业的编译技术的人很少, 没必要开设。还有一些实验设计不合理, 只是将一个一个独立的算法给出, 让学生编写一些小型的程序, 不能够体现知识的系统性和连贯性。

针对以上的情况, 要进行实践改革, 首先要重视实践环节的教学, 认清通过实践不但可以加深学生对理论的理解, 还可以让学生更深层次的了解编译程序的构造和设计, 关键是培养和提高了学生的编程能力, 培养了学生分析软件和设计软件的能力。其次要合理的设计实验内容和实验方案。在设计实验的过程中, 要注重知识的连贯性, 好多学生反映不能将编译原理中的各个模块统一在一起, 掌握的知识仍然是分离的。在实验中注重连贯性, 就可以解决这一问题。例如在词法分析模块, 第一部分是先将文法以合理的结构存放在计算机内, 然后根据文法生成相应的FA, 如果是NFA要将其确定化, 转为DFA。第二部分就可以运行FA了, 根据运行的结果, 识别出一个一个的单词。第三部分, 将识别出的单词构造成属性字序列。通过这三部分的实验, 不但完成了词法分析程序的构造, 也将理论中讲解的各个部分联系起来, 形成知识体系, 帮助学生理解和掌握了词法分析的功能和程序构造。还要注意合理的安排实验时间, 编译原理不是每节课都有实践部分, 有些学校统一的将实践安排在课程最后, 这样可能会造成理论和实践的脱节。最好是能够在一个模块结束后, 该模块的相关实践随之完成。这样能够让实践和理论相互促进, 强调知识点之间的逻辑联系, 帮助学生更好的掌握知识。最后要有合理的评价机制, 将实践部分放入考核, 每次实践要求学生给出实现的代码, 并提交相应的文档, 教师根据代码、结果和文档给出实践成绩, 将其列入最后的总评成绩, 从而激发学生的主动性和积极性。通过实验教学改革, 不但巩固了学生的理论知识, 而且引导他们将理论应用于实践, 同时也有助于学生自身编程水平和算法设计能力的提高, 为下一步的专业学习打下坚实的基础。[2]

4 总结

《编译原理》课程在培养学生的抽象思维、逻辑思维和编程能力方面都起着积极促进的作用, 要抓住该课程的重点, 分清主次, 将知识点连贯起来, 充分采用多种教学模式和方法将抽象的内容形式化, 通过实践再将理论知识应用于实践, 激发学生的积极性, 促进学生自主学习, 让学生掌握知识和技能, 学会思考, 培养创新精神, 提高对计算机系统的总体认识。

摘要:《编译原理》课程是计算机专业的核心课程之一, 该课程主要讲解编译程序的构造和功能。本文主要探讨通过多种教学方法, 激发学生的积极性, 形象化抽象理论, 改善课程的课堂教学效果, 积极探讨实践改革, 以实践促理论, 在掌握理论知识的同时, 通过实践, 培养学生的软件开发、设计能力, 提高学生的综合素质。

关键词:编译技术,教学方法,实践改革

参考文献

[1]吴其林.“编译原理”课程的教学探讨[J].电脑知识与技术, 2012, 1.

[2]孟丹.编译原理实验教学分层案例化改革探索[C]//北京高教学会实验室工作研究会, 2010年学术研讨会论文集.2010, 12.

[3]崔少国.“编译原理”课程教学方法的探索与实践[J].福建电脑, 2012, 1.

编译原理课程教学改革研究综述 第8篇

一、编译原理课程教学的现存问题

在计算机专业课程中, 编译原理普遍被认为是最难学习的课程。由于编译原理课程的理论性与实践性较强, 学生在学习过程中难免会出现抵触心理, 该课程在教学过程中也存在着以下几大问题。

(一) 对编译课程不够重视

大多数学生都认为, 编译原理课程的学习是为了编写构造编译器, 与其今后的工作选择的关联并不大。并且就目前计算机领域的发展现状而言, 各大软件公司已经能够独立开发优秀的高级语言编译器, 并不需要重复编写构造编译器。这也就导致了学生在学习过程中未能树立正确的学习目标。

(二) 教学内容难度较大

编译原理课程内容繁杂又抽象, 理论性和实践性都很强。该课程具有严密的逻辑性特征, 不仅拥有独立的理论体系, 其中的内容还涉及到了其他的理论知识, 如图论、集合论、形式语言论等等, 这些理论在学习过程中原本就具有一定的难度, 再加上编译原理课程在教学中占据比例大, 对于本科生来说还是具有相当难度的。

(三) 编译原理算法繁杂

编译原理课程中包含了很多算法, 如DFA最小化、LR分析算法以及NFA的确定化等十几种, 这些算法需要用到很多的知识, 计算过程也较为复杂, 并不像学生之前学习阶段所接触的数据结构算法, 因此在学习过程中难免觉得有困难

(四) 学生缺乏学习动力

课程难度大, 学生就容易丧失学习兴趣和学习热情。由于在学习时存在困难, 学生对于知识点的理解就会出现偏差。不少学生反映, 在课堂上教师所讲的知识能够理解, 但在课后进行复习时却往往想不起来。长期如此学生将会跟不上学习进度, 并对课程产生抗拒心理。

二、编译原理课程教学改革研究

(一) 明确课程学习目标及其重要性

由于编译原理课程内容多以理论化为主, 这些理论向来是编译原理课程的重难点教学, 学生往往会对产生抗拒的心理。因此, 教师要在教学过程中让学生明确学习编译原理课程的意义, 让学生懂得该课程存在的重要性。编译原理课程能够提高学生计算机思维能力, 所谓计算机思维能力指的是具有抽象化与形式化思维的能力, 编译器在设计过程中就运用了计算机思维的思想与方法, 对学生进行计算机思维能力能培养将有助于其更好地把握编译原理课程的目标。此外, 编译原理在很多领域理论的研究中都具有十分深远的意义, 如计算机系统结构领域、计算机软件技术领域、人工智能系统的机器学习领域等。

(二) 以学生为主建立互动教学模式

教师要善于引导学生对知识进讨论与交流, 并建立起学习群体, 以此共同对课程进行探讨和研究。在教学中, 教师要摒弃传统教学方式, 将枯燥单一的讲解模式变为问题解决式教学模式, 将课堂的主体地位还给学生, 让学生成为教学活动中的参与者, 从而激发学生的学习兴趣与学习积极性。对于课程中较为简单的章节, 教师可以在课堂上提出具有启发式意义的问题, 让学生通过学习相关知识来解决问题, 并理解和掌握相关的理论概念, 以此建立其独立的知识架构。对于学生在课堂所提出的问题, 教师可以就问题让学生展开讨论, 并在讨论过程中做好结论总结, 从而进一步提高学生对编译原理课程知识的认知与理解。

(三) 运用编译器进行实例教学

编译器的工作原理及编译原理, 编译原理课程的教材中侧重于编译理论的介绍, 实际编译器的内容只占据了小部分, 教师在讲解的过程中, 就要结合现代C语言编译器来进行教学, 如TC、GCC和VC++等, 让学生在掌握理论知识的同时, 又能够加深对于编译原理的理解, 提高自身编程水平。如在讲解存储组织这一部分内容, 教师可以通过VC++编译器进行程序的编写, 并通过VC++编译器对CL.exe下达指令, 让其对程序进行编译, 再生成汇编代码。这样一来, 学生不仅能够迅速的吸收课堂所学知识, 还能够进一步了解和把握C语言的子程序调用方法, 从而避免今后在编写程序时的错误。

(四) 加强编译课程实验环节

在编译原理课程中, 实验环节也是颇为重要的。实验环节一共有两个层次, 第一层是在课堂理论学习的教学环节中, 教师提前设计一些相互独立的实验, 如语法分析、词法分析和语义分析等, 让学生通过所学的编译知识进行相应的程序编写, 使其能够整理和归纳已学知识并深入掌握相关算法。第二层是在编译课程讲解完成后, 教师设计一个综合性的实验交给学生去完成, 如C语言子集的编译器, 这就需要学生对编译原理有一个整体的把握, 并能够将相关的知识进行串接, 形成整体概念进行编译。之所以要在实验环节进行从基础分析到代码生成的环节, 主要目的就是为了提高学生对编译原理的整体把握能力。

结语

综上所述, 编译原理课程尽管具有一定的学习难度, 但教师在教学过程还是要坚持以激发学生学习兴趣为主, 使学生明确编译课程的教学意义及其重要性, 并在课堂教学上将主体还给学生, 与学生进行相互沟通与交流, 同时加强实验环节, 全面提高学生的编译能力。

摘要:编译原理课程是高校计算机专业的重要课程之一, 由于便于原理课程理论性与实践性较强, 具有一定的学习难度, 学生普遍对该课程缺乏学习兴趣。本文将针对编译原理课程教学的现存问题进行分析, 并就如何做好编译原理课程教学提出相关的策略。

关键词:编译原理,课程教学,改革,综述

参考文献

[1]刘赛.提高《编译原理》教学效果的探索[J].现代计算机, 2011 (22) :25-27.

编译原理辅助教学系统的设计 第9篇

编译原理课程是一门重要的计算机专业基础课, 在计算机专业的教学中占有很重要的地位。由于这门课的内容理论和逻辑性都很强, 学生普遍对这门课程的学习感到枯燥无味, 仅仅依靠在课堂上以语言、文字为主的讲解, 对于编译技术中的基本概念和基本原理很难收到良好的教学效果。比如说有穷自动机及其状态图、文法的左递归和回溯现象, 语言的语义分析和处理等等, 这些内容很难在有限的课堂教学过程中被透彻地理解, 开发一个辅助教学系统, 可以帮助改进编译原理课程的教学, 提高教学效果。一个良好的辅助教学系统不仅需要合理组织好课程的知识内容, 而且应该具有良好的交互功能, 利用网络在信息交流方面的优势为教师与学生搭建一个沟通的平台, 达到教与学的统一。本系统具有资源合理共享、内容及时更新、师生实时交流、时空不受限制以及人机优势互补等特点。

二、系统的应用对象及需求

编译原理辅助教学系统的应用对象包括管理员、教师和学生三种用户, 他们对该系统有各自不同的需求。

1、管理员用户

管理员用户是辅助教学系统的管理员, 处于系统的服务器端, 拥有系统的所有管理权限, 可以对课程资源及交流信息进行直接管理, 为其他应用对象授予权限, 负责系统的完善和维护工作。

2、教师用户

教师用户拥有较高的权限, 可以管理课程资源的全部内容, 可以管理自身发布的交流内容, 与学习者在线交流, 可以对进行实时交流的学生和交流的内容进行管理, 有权为比自身权限低的用户授予部分权利。

3、学生用户

学生用户可以浏览学习课程资源, 有权接受以及发布实时交流信息, 有权行使权限较高的用户所授予的权利。

三、系统设计

本系统的功能结构包括三个组成部分:编译原理课程资源、在线实时交流功能、问题讨论功能。如图1所示。

编译原理课程资源部分以多媒体的形式展示编译原理课程的内容, 是编译原理教学的基础。教师可以管理这部分内容, 提示学生进行学习, 在此基础上与学生展开在线交流, 进行课程内容的课外讲授和辅导。

在线实时交流功能是系统的最重要组成部分。在教学过程中, 教师与学生的交流至关重要, 没有交流, 就谈不上教学。该功能提供一个实时信息交流平台, 权限相对较高的用户可以对低权限应用对象进行一系列管理, 可以对该模块事务进行一系列管理。

问题讨论区是为了满足教师与学生不同时在线的交流需求而设计的。编译原理课程的在线教学是在一定时间段内进行的, 在学生进行自学产生的疑惑需要向教师请教时, 若教师不在线, 就要借助这一功能。该功能为师生提供一个信息交流平台, 在此发布的信息在应用对象离线情况下可以继续存在, 高级权限的用户可以对该模块事务进行一系列管理。

1. 编译原理课程资源功能的设计

编译原理课程资源模块包括各章节的多媒体的形式的课程内容, 每章的内容包括基础知识、练习、编程练习、注意与参考。其结构如图2所示。

2.在线交流功能的设计

在线交流模块包括三个主要的组成部分:登录、实时信息交流、信息管理。

(1) 登录功能用来确定访问者是否具有使用该系统的实时交流功能的权限, 可以为用户提供一部分用户账号自我管理功能。

登录功能的设计功能包括:用户名密码验证、用户名注册、用户密码修改、用户删除、用户来访信息记录。

(2) 在线交流功能是整个在线实时交流模块的核心, 它主要用来实现信息的发布, 并为实时信息的发布提供一系列辅助工具。

在线交流模块设计的功能包括:实时交流信息发布、隐秘信息交流、设置实时信息发布组件主题、设置信息文字颜色、设置信息发布者名称颜色、在线人员列表、刷新在线人员列表、刷新实时交流信息发布区、退出。

(3) 信息管理提供对整个在线实时交流模块的管理手段。该模块提供四个方面的管理功能:用户信息管理、用户权限管理、用户账号管理、以及系统重置。

3. 问题讨论区的设计

这一功能采用网络留言板的形式为教师和学生不能同时在线时提供一种交流的方式。这一模块包括三个功能:信息发布、信息管理与信息搜索。

(1) 信息发布

信息发布者提供自己的名称、联系方式、信息内容, 信息发布组件会把这些显示在信息发布区, 其内容会一直保留, 直至管理员将其删除。

(2) 信息管理

信息管理由具有高级权限的用户来执行, 可以对信息进行浏览, 对过期及无效信息进行删除。对信息进行处理后, 信息管理组件会提示用户此次操作的信息, 包括:操作内容、操作时间、成功与否。这些操作信息还会保留在问题讨论区模块中便于管理。

(3) 信息搜索

在问题讨论区模块, 将有大量信息出现在信息发布区中, 信息搜索功能帮助用户在最短的时间内找到自己需要的内容。该功能以用户提出的搜索关键词为依据, 以整个信息发布区为搜索范围, 以列表的形式将符合条件的所有信息以列表的形式显示在用户的浏览器上。

四、结束语

系统基于ASP技术开发并投入运行, 在辅助教学过程中取得了良好的效果, 为教师和学生提供了课下学习和交流的平台。该系统的使用是教学过程的有力补充, 成为编译原理精品课网站的重要组成部分。

参考文献

[1]邵国明.多媒体辅助教学在课堂教学中的合理应用[J].现代教育, 2011, 3.

[2]夏艳东, 管廷昭.网络辅助教学系统的设计与实现[J].中国科技信息, 2011, 14.

[3]张永梅, 李华玲, 梁志剑.基于WWW的编译原理课件设计[J].计算机与现代化, 2003, 12.

[4]陈火旺, 刘春林等.程序设计语言编译原理 (第3版) [M].北京:国防工业出版社, 2000.

编译原理实验课程教学设计的改进 第10篇

1 编译课程实验的问题

1.1 学生对课程实验定位存在认知误区

在教学实践中发现很多学生对编译原理实验课程的认识上存在很多误区,这些认识误区如果不加以及时纠正,加上课程内容抽象、逻辑性强等特点,很容易加重学生的畏难情绪,产生一系列不利于课程学习的消极负面影响。

一种认识误区是简单地认为编译原理的学习目的就是设计和开发编译器,认为毕业后很少有从事编译器研发的机会,所以得出课程学了没用的错误结论。实际上编译原理包括的形式语言、自动机理论等语言定义、翻译与实现的基础知识,可以让学生领悟到计算机理论的精髓,可以让学生从程序编译的角度重新审视软件的开发,有助于提高学生对软件设计开发的认识,对于今后从事应用软件、语言开发平台甚至系统软件的开发等都是非常有好处的。

另一种认识误区是将编译的实验混淆于普通的程序设计实验,将实验重点没有放在算法的设计、原理的理解上,而是迷失在具体代码实现的细节上。编译原理课程是一个综合性的专业课,编译程序使用的一些数据结构和算法是“数据结构”、“离散数学”以及“算法设计与分析”等课程相关知识的典型应用,能够进一步加深了学生对相关课程知识的综合运用和专业素质的提升。

1.2 实验内容设计缺少层次性

通常的编译原理实验课的教学设计,是将学生已经学过的一种高级语言的词法和语法进行简化,作为实验的模型语言。针对编译过程的词法分析、语法分析、语义分析与中间代码生成、目标代码生成的四个重要阶段,每个阶段分别设计一个或多个实验题目,最终合成一个完整的编译程序。这样设计实验的好处是与授课内容紧密结合,模块分解清晰。但存在的问题是尽管对高级语言进行了简化,每个实验仍然存在着一系列的“难度阶梯”需要学生跨越,如果在实验的设计上仅从学科的理论体系上考虑,忽视了学生知识和能力水平的不同层次,只是一种理想化的设计,执行起来势必难以达到预期的实验效果。

以词法分析的实验设计为例:实验要求是给出某模型语言的文法规范,要求编写该语言的词法分析程序。输入源程序文件,输出关键词、专用符号以及其它标记。实验过程是编写主函数getToken,通过从文件中读取字符到缓冲区中并由C语言字符的状态转换图流程判断返回一个字符(Token)。分析出来的单词主要分为关键词,专用符号,标记符号等。

这个实验是编译阶段的第一个实验,在学生对编译程序理解不深,很多思维方式和知识框架还没有建立起来的情况下,给很多学生设置了一系列障碍,如形式化语言、有穷自动机的理论等,每一个障碍对于初学者都难度不小,这些问题同时出现在一个实验中,会使相当大一部分学生因难度过大而失去学习兴趣。实际教学中学生对编译程序的认知是循序渐进的,很多概念和原理的理解不可能一步到位。而且学生的知识结构、能力水平参差不齐,有的学生的先导课程如《数据结构》、《高级程序设计语言》等知识学得不牢固,有些甚至已经淡忘,因此在设计实验时需要首先弄清楚学生的情况,然后再“对症下药”有侧重点地进行实验内容的设计。

1.3 实验的组织形式比较单一

编译原理的实验组织形式通常是在机房每个学生一台计算机,实验课程开始后教师介绍实验内容、实验目的和实验要求等,然后每人独立完成,从设计到实现都由学生自己进行,教师在实验过程中随时解答学生的疑问,最后学生调试完成程序后撰写实验报告,教师根据学生的程序和实验报告给出分数。这样的实验组织和成绩的评判形式比较单一,整个过程由教师主导,能够训练学生个体的独立思考能力和动手能力,但学生之间的交流不够,实验课的大部分时间都是学生埋头写程序,实验课气氛比较枯燥沉闷,对学生团队协作能力的训练不够。

2 实验教学设计的改进

2.1 消除学生的认识误区

针对学生简单地把编译原理课程局限在编译器设计上的认识误区,教师在授课和实验过程中需要注意结合实际中运用编译技术的实例,比如常用的文本编辑工具中,很多带有字词的检查和校验功能,这就是编译原理技术中词法分析技术的具体应用;很多应用系统中对用户输入的字符串进行规则检查时常用正则表达式;网络搜索引擎对文档资源进行特征分析、提取与描述等工作中都用到编译的相关知识……通过各种现实生活中的实例让学生明确编译原理所学习的知识不仅是计算机专业理论知识的重要组成,而且编译程序所使用的一些原理、方法和技术在非编译系统的实际应用中也发挥了很大作用。

在进行实验设计时,除了原理性实验,可以根据学生的兴趣,安排一些应用型的实验,如简单的智能输入法的实现、识别某些单词的简单聊天机器人程序等,这样的小实验可以激发学生的学习兴趣,学生在这些应用性趣味实验中遇到了困难,自然会进一步深入学习教材中的原理,这样对基础理论的掌握也会更加牢固。

2.2 实验内容的改进

国内外的一些经典教材中,通常会采用一种模型语言的编译程序作为实例,如吕映芝等人编著的《编译原理》是以PL/0语言的编译程序为范例,Alfred V.Aho等人编著的《编译原理》先通过一个小的编译程序范例给学生带来对编译程序的直观感受。通过实例的学习,可以降低学生的学习难度,也可以辅助学生对原理加深理解。在设计实验时,可以更大地发挥这些实例的作用,事先让学生阅读这些实例的源代码,然后增加一个准备性的实验,要求学生结合已经学习过C、C++或JAVA等高级程序设计语言,自行对词法规则和语法规则的简化和裁减,设计出适合自己实验难度的模型语言,并给出文档描述。通过安排这个准备实验,促使学生复习必须的基础知识,增加学生查阅资料的能力和阅读源代码的能力,在学生的认知结构上起一个铺垫的作用。

词法分析、语法分析试验是编译原理实验的重点。在实验内容上,对一些比较复杂的实验进行拆解。词法分析实验可以拆分成三个小实验:设计源程序扫描器,去除空格和注释及其他无关字符后得到单词的集合;用自动机识别无符号数或某类单词;设计识别关键词、标识符等其他类型单词的识别程序。对语法分析实验,可以首先以典型的算术表达式文法为例,设计一个算术表达式文法的递归子程序分析实验,然后在此基础上安排其他的语法分析实验。这样在内容上也分成了若干层次,更加符合由简单到复杂、由特殊到一般的认知规律,也能够满足不同知识结构和能力水平的学生在实验中都能得到锻炼提高的目的。

实验难度的设计上应该体现出层次性,形成“阶梯状”的难度层次。每个实验要求分为基本要求、较高要求和探索性实验要求三个层次,基本要求即最低要求,所有学生都能完成的难度,鼓励成绩中上的学生完成较高要求,采用成绩加分、表扬等一些激励机制,提高兴趣,为一些学有余力的同学准备探索性实验。既能让优秀的学生“吃得饱”,也保证让所有学生“吃得了”,避免一部分学生因缺乏难度挑战失去兴趣而另一部分学生因门槛太高而无从下手的情况发生。比如在“利用自动机识别无符号数”的实验设计上,基本要求是能够识别整数,较高要求是识别带小数的无符号数,更高要求是能识别带指数形式的无符号数,将这一实验题目分成三个层次后,不同学习水平的学生都能够在一个学时内完成实验,对自动机这一重要工具也有了初步认识,达到了实验目的。

2.3 实验组织形式的改进

在实验的组织上可以采用协同式学习,以小组为单位,通过教师所提供的实验任务进行分析、讨论,明确需要解决问题的方法,经过一系列的协同学习活动,完成既定的任务,加深对所学知识的理解。这种组织形式可以培养学生的团队协作能力和学生之间的相互交流和相互学习。因为学生之间的年龄相仿、认知水平相似,交流起来会更加顺畅和有效。在这个过程中能够提高学生的参与感,而且通过团队协作解决困难,会给学生更多的积极反馈和成就感。

在实验内容的设计上,要便于学生进行协同工作,具有可操作性和合作性,确保小组中每个成员的任务饱满。在小组分配上,根据学生的兴趣让其自由结合小组,再根据学生的学习能力做适当调整,根据学生的性格特质等不同特点让其在小组中承担不同角色,如设计人员、开发人员、文档撰写人员以及兼任的汇报答辩人员等。实验实施阶段是协同模式中最重要的一个阶段,在这个阶段小组要对下达的实验任务进行分析,明确任务的基本要求,掌握解决问题的方法及需要具备的知识,在教师的帮助指导下进行小组的内部分工及职责的落实,进行协同学习,同时教师要对学生实验完成情况进行及时的检查和指导,直到最终共同完成小组的任务。

传统的独立模式的实验中对学生的评定比较简单,根据个人的完成情况给出成绩。采用分组式协同模式后,实验成绩的评判要做相应的调整,不仅要考核每个学生自己承担的任务完成情况,还要考核小组共同完成情况。考核的内容仍然包括程序和实验报告,但除了对每个学生独立完成的程序模块进行检查外,还需要对小组共同完成的整个任务情况进行验收,可以采用汇报和答辩的形式进行,每个小组推选答辩人在面对所有学生进行汇报,然后接受教师和其他小组的提问并进行答辩,最终成绩的评定除了个人评定之外还有小组评定,对小组成绩进行排序以鼓励小组间的竞争。

3 总结

为了在编译原理实验课中达到教学目标,根据发现的问题对实验课教学设计进行改进:采用应用型实验激发学生的兴趣,消除对课程的认识误区;重新设计和组织实验内容,更加符合学生的学习规律;采用协同方式组织实验培养学生的团队合作能力。这些改进措施已经在教学实践中采用,结果表明有助于降低学生学习过程中的困难,增强学习兴趣,提高实验教学的质量。

摘要:目前,编译原理实验课程中存在的一些问题影响了教学效果。主要原因是:学生的认识存在误区,实验内容和要求层次性不够明显,实验的组织形式比较单一。提出了改进方法:设计应用型实验提高学生的学习兴趣;重新设计实验内容和实验难度,更好地符合学生的认知规律;通过协同学习,提高学生的团队协作能力。

关键词:编译原理,实验课程,教学设计,协同学习

参考文献

[1]张素琴,吕映芝,蒋维杜,等.编译原理[M].第2版.北京:清华大学出版社,2005.

[2]Alfred VAho,Ravi Sethi,Jeffrey D.Ullman.Compilers:Principles,Techniques,and Tools[M].北京:人民邮电出版社,2002.

编译原理范文

编译原理范文(精选10篇)编译原理 第1篇因此该论文设计了一个简单的类C教学编译器。目的是使学生真正理解编译程序的构造原理和技术,学好...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

确认删除?
回到顶部