编译原理实用论文(精选13篇)
1.编译原理实用论文 篇一
国际学院 0802 杨良燕 200819100227
《编译原理》课程学习心得
《编译原理》是计算机专业的一门重要课程,正如教材
第一章的引论所述,“编译程序是现代计算机系统的基本组成部分之一”。“一个编译程序就是一个语言翻译程序,语言翻译程序把一种语言(源语言)书写的程序翻译成另一种语言(目标语言)的等价程序”。
通过这一学期的学习,我觉得编译原理是一门理论性很强的课程,从文法和语言的概念到LL(1)文法和LR(0)文法的分析,几乎都是对具体问题的抽象。因而,我们需要更多的时间来理解、掌握相关的知识,当然在这一过程中也存在很多问题,比如我们后期学习具体文法的分析方法时,对于文法的概念不够清晰,影响了上课的效率,知道老师再次给我们讲解了文法等基础的知识点,我们才慢慢掌握后面所学的LL(1)文法等,也发现了知识点之间的关联。此外,这门课程的课时被安排得很少,一周只有一次,这样很不利于我们对这门重要课程的理解和掌握。但是我觉得我们很幸运,因为老师在有限的课程中尽量将知识点以比较容易接受的方式给我们讲解,教我们用简单的方法理解记忆不同的知识,对于我们提出的问题,无论课上或是课外,老师一直是不厌其烦,甚至利用课余时间为我们讲解重要的难题。
编译原理这门课程不仅仅在于其本身的理论价值,更在于为我们解决问题提供的思维方式和方法。从LL(1)到LR(0),问题不断被解决的同时,又有一个个新的问题提了出来。对计算机语言世界的知识积累,像滚雪球一样越滚越大。这个逐渐递进,逐渐解决问题的过程对我来说是收获很大的。整个过程好像踏着前人研究编译理论的路线,不断感觉他们遇到的问题,更重要的是他们解决问题的思路。编译原理的课程带给我的不只是如何去编译程序这样的理论知识,相信更重要的是一种如何“自动计算”的思路。通过对相关编译问题的具体分析,让我体会最深的是一种“自动计算”的思想,同时完成编译试验后,更是感到了一种“自动计算”的快乐。”然而我明白自己虽然对编译有了一定的了解,我懂得了文法的分析,学会了构造确定和非确定有限自动机,学会了LL(1)文法和LR(0)文法等,但是并没有完全掌握,对于这些知识点的实质性和其他方面,更是认识不深。作为一名学习计算机科学与技术的学生,我明白编译原理是软件工程的基础,课程的结束并不意味着学习的结束,只有通过以后的学习,才能更深入地了解编译原理。
2.编译原理实用论文 篇二
由于编译程序的庞大和复杂性, 编译原理课程内容包含了很多特殊的算法和思想, 如自上而下语法分析的LL (1) 分析算法、自下而上的LR (1) 语法分析算法、词法分析的NFA向DFA转化的子集法, 化简DFA的分割算法、FIRST和FOLLOW集合计算法等。该课程还高度依赖于学生在低年级所学的专业基础课程, 如程序设计语言、数据结构等, 对学生而言, 在一开始进入课程学习时就必须掌握一定程度的相关专业知识, 也要求对学习的难度有一定的思想准备及具备化解困难能力。而学生看到这样的困难往往就由于基础知识薄弱而产生畏难心理, 加上对编译知识技术学习必要性缺乏认知, 也会逐步失去学习兴趣, 走上厌学的道路。
理论教学和实践脱轨, 也是编译教学的普遍现象。因为编译理论的复杂抽象, 学生在花了很大力气理解和吸收理论知识之后, 往往感觉到用于实践更为困难。编译算法的跟踪执行过程, 无法像数据结构的算法学习一样简单, 因为很多中间结果根本无法输出。而教学课时所限, 对完整编译器的设计各个环节之间接口的介绍, 一些算法的具体编程设计, 老师无法在课内一一讲述, 学生也模模糊糊。实践内容的难度, 也让学生对无法在短期课内学习中真正融会贯通掌握编译技术。
二、教学方法改革思路
1、科学引导, 明确教学目标, 提升学习兴趣
教师通过精心备课, 针对编译程序的各个功能环节, 引导学生积极发现内在的联系和规律, 帮助学生建立起对编译程序的宏观认识, 抓住知识体系的主线, 教师再逐一将个环节的重点难点问题指出。学生在已掌握知识的基础上思考如何解决问题, 教师再提示如何改进, 从而启发学生积极思维。学生有了思考的着力点, 自然就产生了学习的兴趣。对于持有学习编译技术无用观念的学生, 教师需明确学习的目标。编译原理与技术, 涉及的操作系统、计算机指令系统等内容, 对于编程技术的提高大有裨益, 它的一些算法和实现技术同时也被某些应用软件设计采用。如:应用与文本编辑器的正规式和有限自动机, 字符串查找中使用有限自动机, 网络应用中使用必经节点算法、网络协议使用文法来定义等等。
2、教学内容优化, 提升课堂教学质量
对于知识点复杂抽象, 内容繁多的编译课程, 教师在备课过程势必要熟悉吃透教材, 对教材内容进行组合优化。
(1) 选择合适的教材与教学手段
被计算机专业人士誉为“龙书”的《Compilers Principles, Techniques and Tools》 (中文译名为《编译原理》, 机械工业出版社出版) , 虽然被很多学者推崇, 但并不适合作为本科学生学习的教材, 因其学科大全式的介绍, 涵盖过多的内容且理解难度更大。国内比较好的编译原理经典教材也有很多, 可根据教师自身教学设计的精选教材。
(2) 优化教学过程
1) 由于C语言是我们学生的基础入门编程语言, 所以授课的程序设计语言均为C语言背景。一般的编译原理教材中, 很少以某类具体程序语言为例, 而以某些字符如:A、B、C代替, 形式化语言。学生在接受知识的时候就出现了偏差, 因为编程和现在所学的符号无法统一。所以选择一门学生有较好基础的语言配合讲解很必要。
而教师也可以将C编程过程中遇到的易错、难学的问题从编译的角度加以分析, 对学生分析和解决问题也会有所启发。而对编译原理的输入了解也能让学生在编程时更注意错误的避免以及优化编程, 强化了编程能力。
2) 抽象内容形象化。对那些学生难理解的抽象概念, 讲解时可举学生最熟悉的一些实例类比, 避免学生的死记硬背。例如, 编译过程包括的词法分析、语法分析、语义分析和中间代码生成、代码优化、目标代码生成五个阶段。记忆这个知识不难, 但是如何理解划分阶段的依据, 我们就可以举翻译英文句子的过程来类比。比如, 翻译“I am a student”成中文, 首先做词法分析, 按英语构词规则, 共四个英语单词, 同时检查单词拼写是否错误。然后根据英语的语法规则做语法分析, 对上一阶段形成的单词进行分析、识别, 检查语法正确性, 判断能否组成一个符合英语语法的句子。接着是语义分析, 分析句子含义, 并用汉语表示出来。最后修饰译文, 综合考虑汉语语法的相关规则和上下文的关系, 修饰初步翻译后的句子, 形成译文“我是一名学生”。
3) 融合原理与技术, 于各个章节均穿插“PL/0语言编译程序”模型的对应实现过程讲解, 学习技术之后学习实例, 学生更容易掌握知识, 也能初步建立属于自己的知识体系模型。
4) 将大问题缩小, 分解模拟编译技术的实现如词法分析、算符优先分析程序、制导翻译等过程。通过编写一些小的例程, 对程序算法进行详解和细节演示, 学生通过庖丁解牛式的吃透程序, 就能够好的掌握编译程序的设计, 从而自己写出编译程序。
5) 实施多媒体辅助教学形式, 使用课件、SNL、PCMCAI等编译实例等编译原理教学辅助软件, 将抽象问题形象化, 便于学生理解和运用知识点, 在课下也能利用这些课件自动生成各个分析程序, 加深基本原理和实现算法的理解。
建立本课程新的课程教学理念、课程价值、教学技术等尚需时日, 其过程需要不但需要教师付出大量劳动, 与时俱进的跟进新技术的发展, 不断探索和创新, 还需要好的教材、好的课程实验设计。
摘要:编译原理的理论难度和抽象性, 导致教师与学生的教学两难, 但编译原理作为计算机专业非常重要的一门专业基础课程, 掌握和学好编译程序的基本架构、设计原理和技术, 对计算机专业学生学习和掌握软件设计技术和实现技术, 又有着非常重要的意义。如何让学生产生对该门课程的学习兴趣, 消除学生的畏难情绪, 采用何种教学手段合理组织教学过程可以提高学生对知识的吸收度和应用能力, 是本文主要的探讨内容。
关键词:编译原理,教学
参考文献
[1]何炎祥、伍春香:《现代教学理论指导下的“编译原理”教学综合改革》, 《计算机教育》, 2005, (3) :10-13。
[2]陈意云、张昱、郑启龙:《“编译原理”的教学与实际相结合的探讨》, 《教育与现代化》, 2005, (12) :32-36。
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设计报告的规范和要求
设计任务完成后写出实践报告。实践报告包括程序设计时考虑的算法和方法;调试过程中出现的问题和解决的措施;打印出程序清单和调试时所用的源程序。
2题目
词法分析器;语法分析器;
词法分析器的输出作为语法分析器的输入。
3算法
算法:选择最有代表性的语法分析方法,如算符优先法、递归子程序法和LR分析法;选择对各种常见程序语言都用的语法结构,如赋值语句,特别是表达式,作为分析对象,并且与所选语法分析方法要比较贴切。
语言:选用 C/C++ 语言的一个子集。
输出:对于所输入的算术表达式,不论对错,都应有明确的信息告诉外界。算术表达式中变量名可以是一般标识符,还可含一般常数、数组元素、函数调用等等。除算术表达式外,还可扩充分析布尔、字符、位等不同类型的各种表达式。加强语法检查,尽量多和确切地指出各种错误。
5.编译原理 形式语言题+答案 篇五
1.试分别构造产生下列语言的文法:(1){an#bn|n≥0}∪{cn#dn|n≥0};
(2)任何不是以0打头的所有奇整数所组成的集合。
答:(1)对应文法为G(S)=({S,X,Y},{a,b,c,d,#}, {S→X, S→Y, X→aXb|#, Y→cYd|# },S)
(2)G(S)=({S,A,B,I,J},{0,1,2,3,4,5,6,7,8,9}, {S→J|IBJ, B→0B|IB|ε, I→J|2|4|6|8, J→1|3|5|7|9},S)
2.对于下列的文法
S→AB|c
A→bA|a
B→aSb|c
试给出句子bbaacb的最右推导。
答:S=>AB=>AaSb=> Aacb=>bAacb=>bbAacb=>bbaacb
3.已知文法G[S]:
S->(AS)|(b)
A->(SaA)|(a)请找出符号串(a)和(A((SaA)(b)))的短语、简单短语和句柄。答:
因为S 不能 (a), 所以(a)不是文法的句型。没有短语、直接短语和句柄。
因为S (AS)(A(AS))(A((SaA)S))(A((SaA)(b))),所以(A((SaA)(b)))是文法的句型。短语:(A((SaA)(b))),((SaA)(b)),(SaA),(b)直接短语:(SaA),(b)句柄:(SaA)S
(A
S)
(A
S)
(S a A)(b)
4.试描述由下列文法所产生的语言的特点:(1)S→10S0
S→aA
A→bA
A→a(2)S→aSS
S→a
答:(1)本文法构成的语言集为:L(G)={(10)nabma0n|n,m≥0}。(2)由L(G)={a2n-1|n≥1}可知,该语言特点是:产生的句子是奇数个a。
附加题:试证明文法
S→AB|DC
A→aA|a
B→bBc|bc
C→cC|c
D→aDb|ab 为二义性文法。
答:因为存在句子:abc,它对应两个最右推导:
6.《编译原理》课程培训心得体会 篇六
天津科技大学 吴江红
首先感谢全国高校教师网络培训中心为我们这些工作在教学第一线的教师提供一个提高自己教学水平、方法和能力的机会,使得我们学习到更好的方法能更好地为学生服务。经过本次培训之后,我个人觉得可以通过以下几个方面提高教学质量。
1、认清编译原理,明确学习意义,激发学生的热情 帮助学生认清编译原理的作用和地位。给学生介绍清楚可以通过编译原理的学习,有助于学生快速理解、定位和解决在程序编译、测试与运行中出现的问题。帮助学生克服畏难心理,提高学生的兴趣。编译原理中的原理除了可以用于分析编译器以外,还对诸如人工智能、并行处理技术等课程的学习具有指导作用。本门课程学习对其它课程的学习和今后很多领域的理论研究具有深远的意义,如计算机软件技术领域、计算机系统结构领域、人工智能系统的机器学习领域、并行处理技术等领域。
2、优化教学内容,搞好课堂教学
可以采用以人本主义学习理论为基础,充分发挥学生的学习主动性,注重启发式教学,注重提高学生的素质、培养学生的创新能力。使得学生对编译原理课程的兴趣提高,能主动学习,理解、体会前辈们在解决相应问题时是如何考虑的,同学们自己又是如何考虑的。
编译系统中的一些概念很抽象,学生无法理解,就只会死记硬背,当然更无兴趣可言。在讲解的过程中,可以选用学生最熟悉的一些实例,通过类比使抽象的概念更容易被理解。我本人觉着对于工学学科的同学来说,不用在数学定义上花费太多时间,因为他们对数学符号不敏感,而应该尽量多安排例子,使得同学们能把数学符号代表的含义通过例子理解清楚,以及知道如何使用。
有效地利用教学辅助手段,增强课堂教学效果。由于本课程涉及形式语言、有穷自动机等抽象内容,学生在学习过程中接受起来较困难。为了提高学生的学习兴趣、增强课堂教学效果,可以将教学过程中一些需要教师在黑板上动态演示的过程做成CAI课件,既可在课堂上演示,也可在课后由学生自己观摩,有助于加深学生对所学知识的理解。
同时可在课堂上和习题中,多准备了一些从实际程序的编译和运行时碰到的问题中抽象出来的例子,供学生用所学的知识去分析、理解、并加以解决。通过采用这种实例教学方式,既能够对前期课程起到复习巩固的作用,又能让学生切实体会到本课程的实际价值,从而有力地激发了学生学习编译原理和技术的积极性。
3、选取合适的教材
把理论知识具体化、通俗化,教材在教学过程中起关键作用。一本好的教材不仅对老师教的过程很重要,同时在学生进行预习和复习时也是相当重要的。我们可以选择蒋宗礼教授编写的编译原理教材来达到我们的目标。
4、精心设计实验教学内容
7.《编译原理》课程教学改革探讨 篇七
编译原理课程主要介绍编译程序构造的一般原理、基本设计方法、主要实现技术和一些自动构造工具。虽然大多数的程序设计和开发人员不需要写自己的编译器, 也不一定非读懂任何编译器的代码, 但是编译程序构造的基本原理和技术广泛应用于一般软件的设计和实现。因此掌握好编译原理这门课程, 可以深层次地理解程序语言和内部机制, 对以后从事计算机项目开发, 很多思想可以借鉴, 受益匪浅。
2、编译原理课程的教学现状
我们是新建的本科院校, 学校坐落在民族地区, 学生在平时学习中与外界的实践接触较少。对计算机这类技术学科, 这些条件限制使得很多课程的教学偏重理论, 显得枯燥, 增加了难度。接触过编译原理课程的老师和学生大概都有相同的感受:这是一门“难教难学”的课程, 甚至认为这是计算机课程体系中难度系数最高的, 内容抽象、理论性强、对实践要求高。
2.1 学习兴趣和热情的严重缺乏
学生大多理解这门课程只是介绍编译程序的构造, 而自己以后很少会涉及从事编译器设计工作, 因而认为没有实际应用价值, 没有真正领会这门课程在整个计算机知识系统以及软件理论和开发方法上的潜在意义。实际上不管是国内还是国际知名高校, 从本科、硕士到博士都有关于编译原理课程的整体规划设置, 这足以说明该课程在计算机专业中的位置是不可忽略的。
没有清楚认识课程的学习意义, 不实用的思想导致了学习兴趣的大幅下降, 被动的学习加上课程本身的难度和深度使得学生的学习积极性降到了低点。较多的学生反映课堂上能听懂老师的例题讲解, 但是由于没有真正把知识点落实, 课后独立完成习题觉得很困难, 慢慢地产生畏难情绪, 如此的恶性循环滋生了对课程学习的强大障碍。
2.2 纯理论式的传统教学
在前些年编译原理课程的教学中, 理论教学比例过大甚至忽略了实践教学, 没有真正将实践和理论结合起来。在课堂上老师扮演着主要角色, 采用传统的教学模式, 以教师为中心、老师讲、学生听, 没有更好地调动学生的积极性, 因此教学效果也不是那么好。
2.3 课程实践的匮乏
编译原理的实践教学所占比例小, 教师和学生都忽视了实践教学在整个课程中的重要性, 脱离了实践的理论学习会显得更加枯燥和抽象。目前课程设置中增加了实践教学, 但是由于编译原理的实验题目偏难, 并且需要实践者有足够的理论基础和较强的编程能力做支撑, 所以大多数学生仍然觉得编译原理的实践是件棘手的事情。导致了学生对编译原理的理解往往停留在书本的理论概念上, 不明白怎样才能把理论应用到实际的编译程序设计中。
3、推进编译原理课程的教学改革
由于编译原理课程涉及的理论知识多, 可研究性强, 应根据学生的实际情况选择合适的教材、运用适当的教学模式来组织教学内容、理论实践相结合, 以更好地提高教学效果, 满足不同层次学生的需求。
3.1 教材的改进与选择
现在程序设计语言已经从过程式转向对象式, C++、C#、Java等就是目前在软件设计中流行的面向对象编程语言, 程序设计模型的变迁带来了算法描述工具的变化。在计算机应用领域几乎都使用面向对象语言, 各种电子产品的嵌入式软件广泛用到面向对象技术。在这样的背景下程序设计的一些后继课程诸如数据结构等也进行了同步的改进, 已出现了用Java或者C++描述的数据结构教材, 但是大多高校使用的编译原理教材还是没有大的变化, 教材中的编译算法和模型仍然用C语言甚至Pascal语言来描述。
这种主要关注面向过程的编译技术的教材, 会让学生觉得编译原理课程和当前的程序设计应用较为脱节。因此分析面向对象技术后台的编译系统非常有必要, 这样更贴近应用, 更利于培养学生的学习兴趣。可以选用对象式语言描述编译算法和教学模型的编译原理教材, 将面向对象的编译技术有机结合到教学中。例如目前国外以及国内某些高校选用Java语言描述的编译原理新教材, 其中像《现代编译程序实现———Java语言》 (影印版) 教材可视为典型。改进后的教材在词法分析和语法分析上变动较小, 主要增加了针对面向对象语言的语法结构及其语义特征, 着重从类及类的继承结构上讨论编译实现技术及构造面向对象编译器的思路;在语义分析、代码生成等内容上调整幅度较大, 面向对象的作用域特性、类的封装、继承以及多态的典型特征都将体现在教材中。
3.2 教学模式的转变
打破传统的以教师为中心、一味灌输式的教学方法, 采用更能激发学生兴趣和潜能的“以学生为主, 师生互动, 实例教学”的教学模式。在教学中, 教师扮演好传授、指导、组织和帮助的角色, 利用问题及情境充分发挥学生的主动性、积极性和创造性。
对某些章节教师首先提炼出核心问题, 让学生带着问题自主学习。之后由学生讲解, 展开课堂讨论, 最后教师再总结归纳。这样学生不再是只带耳朵来听课的机器, 更多的时候由他们来主导控制课堂, 由完全的被动转化为主动, 将会大大地提高教学效果。当然在这个过程中教师要有足够掌控课堂的能力, 给出恰当的涵盖相应知识面的问题, 能在适当的时候做引导者促进讨论的展开, 让大多数学生能在互动的氛围中积极掌握课程知识。
枯燥的理论转化为实例教学, 效果也是事半功倍。比如词法、语法分析中很多理论描述都比较抽象复杂, 此时教师先不分析理论, 而是借助实例的讲解, 案例完成后再总结归纳理论知识点。通过实例的引导, 既提高了教学效果又营造了轻松的课堂氛围, 师生互动得以良性地发展下去。下面通过一个具体的例子简单分析“实例教学———知识归纳———案例实践———总结”的教学模式。语法分析中有个重要的内容是项目集规范族C的构造, 这是自下而上语法分析中LR (0) 以及SLR (1) 分析表的关键, 但其构造算法描述很复杂, 我们从案例出发引导学生推导到算法规则。例:文法G为E→aA∣d, A→cA∣d, 要求给出该文法对应的项目集规范族C。教师通过讲解例子归纳出求解过程:首先引入新的开始符号S’拓广文法, 构成S’→S.作为唯一的接受态项目, 用closure ({S’→.S}得到初态项目集;计算go (I, x) 得到新状态J的项目集;重复前面两个步骤直到不出现新的项目集为止。在此基础上分析算法, 接着让学生自主完成练习领会算法思想, 这样比直接分析长篇幅的算法效果更加明显。
3.3 课程实验的深化
目前学校提倡“本科学历 (学位) +职业技能素养”的办学模式, 把实践教学提到了相当的高度。整个课程体系及人才培养方案都在强化实践, 同时编译原理课程属于技术学科, 必须注重理论与实践的有机结合, 强调课程实验的重要性, 强化对学生实践动手能力的培养。编译原理的实验难度大, 有的编译器实现程序代码多达十几万条指令, 因此我们一定要避免直接让学生分析和设计编译器, 要循序渐进, 按照高级程序语言的编译过程模块化地设计实验, 结合系统的编译原理实验教材逐步深入地进行课程实践, 真正把实践教学落到实处。
分层次制定课程的实践环节。最初借助面向对象编程语言的编译模型工具生成简单代码的词法分析和语法分析程序, 让学生理解代码的程序结构;在此基础上添加语义动作, 理解虚拟机生成代码;最后扩展教学模型, 分层次构造完整的编译程序。在综合实验部分, 教师可以设置好程序代码框架, 甚至提供源代码将关键模块挖空, 指导学生完成核心代码的编写与调试, 有方向性地指导学生完成课程设计, 以此让他们能投入更多的热情与精力去实际地开展有深度和广度的课程实践, 促进理论的进一步掌握。
4、结束语
编译原理在高校计算机专业课程体系中的地位是不可忽视的, 我们需要与时俱进, 适当调整课程教学的体系和内容, 以更好地顺应计算机技术的发展。怎样在有限的学时内让学生既能掌握扎实的理论, 又能切实提高实践的能力, 这是编译原理课程教学面临的难题。教师应通过优化教学改革、不断探讨, 采用多样的教学手段、灵活的教学方法, 不断地提高编译原理课程的教学质量。
摘要:以新建本科院校为背景, 从学生学习兴趣、教师教学、课程实践等几个方面分析了当前编译原理的教学现状, 提出了对教材、教学模式以及课程实验的基本改革思路, 用以提高编译原理教学效果。
关键词:编译原理,教学改革,面向对象,实例教学
参考文献
[1]何炎祥, 伍春香.计算机专业不需要开设编译原理课程吗[J].计算机教育, 2009年第4期
[2]Alfred V.Aho, Ravi Sethi.编译原理技术与工具 (英文版) [M].北京:人民邮电出版社, 2010
[3]胡学联.编译原理课程的调态与转型[J].计算机教育, 2006年11期
8.编译原理实用论文 篇八
《编译原理》课程设计
1.要求
完成一个简化C语言——TINY C语言的编译程序,最终能为用TINY C语言编写的源程序(后缀为.tny,已给sample.tny,用一般的文本编辑程序即可打开)生成目标代码,并在给定的虚拟机TM上运行得到运行结果。
TINY C语言中允许出现的字词: 整数、标识符;
算术运算符/关系运算符/赋值运算符/界符:+、-、*、/、=、<、:=、;、{、}、(、) 其它保留字:IF THEN ELSE END REPEAT UNTIL READ WRITE TINY C语言中允许出现的语法单位
表达式:简单整型算术表达式、关系表达式 语句:
条件语句(IF THEN ELSE END) 循环语句(REPEAT UNTIL) 赋值语句(:=) 读写语句(READ WRITE) { }中可以有注释,但不能嵌套
2.步骤
1)、词法分析
2)、语法分析
3)、语义分析
4)、生成目标代码
3.源码构成
MAIN.C 主程序
GLOBALS.H 全局类型及变量(如Token类属及语法树结点的组成) UTIL.H、UTIL.C 各步骤的实用函数。如输出Token,生成语法树结点等 SCAN.C、SCAN.H 词法分析程序及其头文件 PARSE.C、PARSE.H 语法分析程序及其头文件 ANALYZE.C、ANALYZE.H 语义检查程序及其头文件 SYMTAB.C、SYMTAB.H 符号表生成程序及其头文件
CGEN.H、CGEN.C、CODE.C、CODE.H 目标代码生成程序及其头文件
《编译原理》课程设计
TM 编译sample.tny源程序后得到目标代码,在该虚拟机上运行得到结果
步骤1——词法分析
要求:填写getToken()函数,完成词法分析器scan.c。约定:
仅允许整数类型,不允许实数类型
标识符由大小写英文字母组成,最多52个。其识别按最长匹配原则 整数后紧跟非数字,或标识符后紧跟非字母认为是一个新Token开始 由{ }括起来符号串都认为是注释部分,该部分在词法分析时被过滤掉
识别出的Token由两个变量:currentToken,tokenString识别,其中currentToken代表Token的类属,为一个名为TokenType的枚举类型,在文件globals.h中定义;tokenString代表Token在程序中出现的形式,即其本来面目。例如整数10的currentToken值为NUM,而tokenString值为‘10’;标识符i的currentToken值为ID,而tokenString值为‘i’
typedef enum
{ ENDFILE,ERROR,IF,THEN,ELSE,END,REPEAT,UNTIL,READ,WRITE,/* 保留字 */
ID,NUM, ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI :=
= <
+
*
/
()
;
} TokenType;
画识别符合TINY C语言构词规则的DFA。然后用直接编码的方法构造词法分析器
/****************************************************/ /* File: scan.c
*/ /* The scanner implementation for the TINY compiler
*/ /****************************************************/ #include “globals.h”
#include “util.h”
#include “scan.h”
typedef enum
{ START, INASSIGN, INCOMMENT, INNUM, INID, DONE } StateType;
《编译原理》课程设计
char tokenString[MAXTOKENLEN+1];static int getNextChar(void)
//获得下一字符 {实现请自己看scan.c文件} static void ungetNextChar(void)
//用于回吐字符 {实现请自己看scan.c文件}
static struct
{ char* str;
TokenType tok;
} reservedWords[MAXRESERVED]
= {{“if”,IF},{“then”,THEN},{“else”,ELSE},{“end”,END},{“repeat”,REPEAT},{“until”,UNTIL},{“read”,READ},{“write”,WRITE}};
//定义保留字表
static TokenType reservedLookup(char * s)
//进行保留字的匹配 {实现请自己看scan.c文件}
/**********************************************/ /* the primary function of the scanner
*/ /* function getToken returns the next token in source file */ /**********************************************/ TokenType getToken(void){ int tokenStringIndex = 0;
TokenType currentToken;
//保存被识别Token的类属
StateType state = START;
//初始状态为START
int save;
//标识当前字符是否保存,如空格,换行符n、TAB符t及注释中的任何字符
while(state!= DONE)
//DONE状态表示已识别出一个Token
{ int c = getNextChar();
save = TRUE;
switch(state)
{ case START:
if(isdigit(c))
state = INNUM;
else if …… //此处请自己填写(字符、:、空格/tab/换行、{、算符及界符等)
break;
case INCOMMENT:
…//此处请自己填写,仅出现‘}’或EOF(注释未完结束程序)时才改变状态。
break;
case INASSIGN: …… //此处请自己填写,‘=’或其它(出现错误)
《编译原理》课程设计
break;
case INNUM:
if(!isdigit(c))
{ /* backup in the input */
ungetNextChar();
save = FALSE;
state = DONE;
currentToken = NUM;
}
break;
case INID:
…… //此处请自己填写,不是字符则回吐,并进入DONE,且识别出一个ID
break;
case DONE: //不可能到
default: /* should never happen */
fprintf(listing,“Scanner Bug: state= %dn”,state);
state = DONE;
currentToken = ERROR;
break;
}
if((save)&&(tokenStringIndex <= MAXTOKENLEN))
tokenString[tokenStringIndex++] =(char)c;
if(state == DONE)
{ tokenString[tokenStringIndex] = ';
if(currentToken == ID)
currentToken = reservedLookup(tokenString);
}
}
---------end WHILE
if(TraceScan){
fprintf(listing,“t%d: ”,lineno);
printToken(currentToken,tokenString);
}
9.编译原理实用论文 篇九
课程编号:07114180 适用专业:计算机科学与技术系计算机应用专业(软件本科)
学时数:34(理论学时数:10 实验或讨论学时数:48)学分数:2 执笔者:周有顺 编写日期:2004年2月 执行时间:2003年以后入学的年级
一、课程的性质和目的
编译原理实践设计是计算机科学与技术专业学生的专业必修课。
系统软件是计算机系统的重要组成部分。本课程是在学习系统软件的组成、设计原理和实现方法的基础之上,设计并上机实现部分系统软件----编译程序。目的在于完成相关课程从理论到实践的推进,使学生真正掌握计算机信息处理的实质,提高其专业素质及驾驭各种系统软件和应用软件的能力。
二、课程教学内容
编译程序设计与实现的目的:
了解编译程序的组成及各部分的基本任务; 掌握编译程序各部分的设计原理和实现方法; 体会理论内容与具体实践之间的关系。
第一章 课堂教学内容要点
(1)编译过程概要:(4学时)
词法分析、语法分析、语义分析及中间代码生成、目标代码生成等各部分的具体实现算法;符号表管理、错误信息处理的具体实现方法;上述各部分之间的数据及信息的传递与交流。
(2)编译程序实现途径(6学时)
编译程序的书写语言与T型图;编译程序的自展技术;编译程序的构造工具。
第二章 实践内容概要(上机部分)(24学时)
(1)实验型语言源文法(略)。(2)编译程序的设计目标
①设计该语言的词法分析程序和语法分析及语义分析程序,词法分析程序和语法分析程序分别作为一遍编写,并生成二元式和中间代码四元式形式。
②在语法分析中,对各语句和布尔表达式的分析采用递归下降分析,对算数表达式的分析采用算符优先分析。
③程序中应包括符号表管理和简单的出错处理。词法分析出错处理包括非法字符和非法单词;语法分析出错处理包括简单的语法错误,即程序结构不符合语法规则的错误。
④将中间代码四元式生成8086/8088汇编语言的目标代码形式。(选做)(3)程序调试
用上述语言编写程序,求函数的值。(4)文档要求
①画出该语言文法的语法图。
②写出编译程序中所使用的主要数据结构(二元式表,四元式表和符号表)。③给出该语言的编译程序的各模块的结构图。
④调试上述程序,并分别给出无错误信息和有错误信息的调试结果,即二元式表和四元式表。
三、课程教学的基本要求
本课程是编译原理的后续课程,完成课程的实践部分。因此教学上应着重强调理论与实践的关系,理论内容如何付诸实践,如何利用理论知识去解决实际问题等,以达到学生实践能力的提高。
Project for Compiler System
四、本课程与其它课程的联系与分工
先修课程:汇编语言,操作系统,编译原理等
五、建议教材与教学参考书
[1]
蒋立源,《编译原理》,西北工业大学出版社,1997 [2]
10.编译原理课程实验教学改革与探索 篇十
随着网络技术的发展, 很多高校都设有计算机专业, 而编译系统是计算机系统的基本组成部分, 是计算机专业学生的必修课。作为一门理论性与实践性较强的课程, 编译原理对学生计算机水平的提高有着重要的作用。但是编译原理的学习的过程中有很多困难, 比如概念性强、逻辑性严密、内容抽象等, 对实践性要求比较高, 学生在学习的过程中不容易把握其知识要点。
1 编译原理实质
编译原理的学习主要是学习其算法, 从编译原理教材中不难发现, 编译原理的学习内容主要是词法分析、语法分析、语义分析、代码生成及优化等。其中语法分析的内容相对比较简单, 编译原理在讲解词法分析的时候, 要把自动机原理与正规表达式融合进来, 然后以较为标准的方式来分析程序的产生;语法分析相对于词法分析就没有这么简单了。目前, 语法分析算法一般有两种, LL自顶向下算法和LR自底向上算法, 特别是LR算法, 一般学生都会觉得比较困难, 甚至放弃自学, 其实LR算法的语法分析器, 一般是采用Yacc来生成的, 不需要自己来实现。而编译原理中编译器需要把程序员写的源程序转换成一种方便处理的数据结构, 这个转换过程是通过语法分析与词法分析来完成的, 只要学生了解简化语法的过程, 就能把词法分析繁琐的工作提出来, 简化学习过程。
2 编译原理课程实验教学现状
在编程原理教学中开展实验教学的内容, 学生的积极性很高, 在实验教学的课堂上学生开动脑筋, 积极发挥自己的聪明才智, 词法分析与语法分析实验完成比较好。可能会在语义分析与代码生成方面遇到一些问题, 对于学生遇到的问题, 教师要积极引导, 使学生认真思考, 强化学生对相关知识的了解。学生在实验过程中遇到的问题主要体现在以下几个方面。
2.1 对实验内容的误解
编译原理在实验教学的过程中, 学生根据实验指导书进行实验步骤的操作, 在实验操作的过程中, 有很多学生由于对基础知识理解不透, 可能会对实验内容产生误解, 从而影响实验效果。比如在测试词法分析程序时, 在实验的过程中可以按照一定的格式输出各类单词符号, 有些学生不理解就把它看做是词法分析程序本身的功能进行实验操作。这样理解的结果会使学生在完成语法分析部分时增加难度, 不能很好将词法分析与语法分析有效的衔接起来。
2.2 对编程实现要求不熟练
在实验学习的过程中, 在教室的指导下虽然有些学生能够理解实验原理和技术, 但是, 在实际实验操作时总是出现错误, 造成这种现象的原因主要是学生在学习过程中, 理论是实践的脱轨。还有些学生在学习的过程中对实验原理理解不够详细, 对原理技术的把握也不准确, 导致学生不能顺利完成实验。
2.3 缺乏规模程序能力
在编程原理的学习过程中, 按照实际完成的符合实验总体任务的编译程序估算, 学生完成的最终编译程序可能在500行左右, 这个编程量才能符合实际学习需求。但是在实际学习过程中, 学生完成的编程量往往与这个数与很大一段的距离。
2.4 利用所学知识解决问题的能力有限
在编程原理实验教学中, 比较难理解的问题一般在语义分析上, 因为它所涉及的数据结构和算法比较多。语义分析没有做好会影响代码生成部分的完成。学生的运用知识解决实际问题的能力不足是造成这种情况出现的重要原因。
3 编译原理课程实验教学改革与探索的措施
编译原理课程是一门理论性的课程, 注重理论知识的讲解, 但是计算机学科本身是一项实践性很强的学科, 只有学生能够学以致用, 才算是真正的学会。在教学的过程中不能使用传统的其他学科的教学方法进行授课, 必须有一套独特的授课方式, 提高学生的实践性。
3.1 分组实验教学
虽然编译原理是一门理论性教学课程, 但是其实验课程的项目也比较重要。通过实验课程学生会将自己在课堂上所学到的知识融会贯通, 运用到实际教学中。在实验课堂上, 首先将学生分为若干个小组, 每组成员各有分工。清晰划分小组成员中每一个人的管理范围, 制定好计划书与可行性分析报告。然后按照实验项目, 小组成员做好实验总结与实践, 这样不仅调动了学生的积极性, 而且能让每一位学生体验一次项目从开始到结束的过程, 培养学生的团队精神。
3.2 竞争式教学
竞争式教学试讲学生按照实验项目分好小组后, 进行小组间的学习竞赛。在完成一个项目的试验后, 教师进行小组评比, 评比时由每个小组的项目负责人阐述整个实验项目的内容、试验方法、实验过程、实验问题以及实验结果等然后对每个小组进行评分, 最终得出排名。这种方法具有很强的趣味性, 能有效的调动学生的学习热情, 使学生在竞争中不断完善自己。
3.3 教学实验的设计与监督
编程原理的实验教学设计要考虑两个个方面的内容:词法分析器设计、语法分析器设计, 通过本课程实验, 使学生理解编译程序设计原理, 培养学生编译程序能力, 加深学生对词法分析器的理解, 使学生熟练掌握语法分析器的设计。同时, 为了提高学生的实验质量, 教师在实验课程中要加强实验结果的监督, 严禁学生在实验中出现抄袭现象。采取先打印实验设计的源程序清单、后进行结果检查的方法。避免试验中的不公平现象。
4 结语
编译原理的实验教学质量的提高, 不仅需要运用有效的实验教学方法, 而且要建立理论联系实际的教学内容和课程体系, 抓住教学重点, 精心设计实验教学内容, 注意调动学生的积极性, 激发学生的学习热情, 使学生在实践中不断提升自我。
摘要:编译原理是计算机专业的主要课程之一, 讲述的内容是程序设计语言编译构造的基本原理以及实现方法。它是一门技术性较强的学科, 在讲课的过程中为了使学生更好的掌握课程内容, 提高学生的学习兴趣, 必须设计一套不同于其它学科的教学方法, 实现教学效果的提高。本文主要从实验教学的问题及现状方面出发, 探讨编译原理教学改革措施。
关键词:编译原理课程,实验教学
参考文献
[1]王改芳, 龚君芳, 李圣文, 张冬梅.编译原理课程实践教学改革探索[J].实验技术与管理2009, 26 (12) :130-131.
[2]吴海涛."编译原理"课程实验教学研究与探索[J].计算机教育2009 (24) :66-67.
[3]朱素英.普通本科院校编译原理教学内容改革探讨[J].电脑知识与技术2010, 6 (12) :3071-3072.
11.编译原理实用论文 篇十一
同时, 编译原理课程在普通高校本科生、重点高校本科生以及硕士研究生中均有开设, 其教学目的、教学内容以及教学方法应该有所区别。本文针对普通高校本科生, 就如何开展编译原理课程的教学展开讨论。
1 教学目的的确定
教学目的是一门课程的核心, 是开展教学工作的前提和基础。编译原理作为一门计算机及相关专业的专业核心课程, 在不同层次的学生之间均有开设。但针对学生的层次不同, 应设立不同的教学目标。
针对普通高校本科生, 未来的发展多定位在技术人员。因此, 培养方向应以“工程性”和“应用性”为主[1]。由此, 针对普通高校本科生, 可设定为以学习基本原理和方法为手段, 理论联系实际, 以培养学生计算机思维[2]、提高分析解决问题和理论联系实际的能力为目标来进行教学。下文中的学生, 如不特别说明, 均指普通高校本科生。
基本原理和方法的学习:编译原理课程中涉及到一些非常基础和重要的原理和和技术, 如正规式和正规文法以及状态自动机的等价性, LR分析法的正确性与合理性;用状态自动机 (DFA或NFA) 来进行单词的识别、用三地址代码进行中间代码的表示、基本结构的中间代码生成等。通过这些内容的学习, 可以对程序设计有深入的掌握和理解。同时, 编译原理是一门理论性和实践性都很强的课程, 如何将源语言转换成目标语言, 除了掌握其技术理论外, 还需能够将源程序 (如具体的C语言程序) , 转换成目标代码 (如汇编代码) 的形式。因此, 理论的学习必须与具体的源语言、目标语言以及目标机联系起来, 理论与实践结合的非常紧密。
分析解决问题能力的提高:在编译原理课程的学习中, 给出了多种问题的解决方法。如在语法分析问题上, 首先提出问题:如何判断一个句子是否是合规的句子。然后用自顶向下和自底向上两种方法对该问题进行了分析解决。类似地, 在中间代码生成部分, 给出递归求解中间代码的方法。这些常用和基本的问题解决方案对提高学生分析解决问题的能力有所帮助。
2 教学内容的选择
现阶段, 国内外编译原理的教材内容不断更新, 像并行编译、形式语言与自动机等内容都成为编译原理课程的一部分编写进了教材[3]。由于课时的有限性, 应根据学生的实际需求, 以通过对编译技术的学习, 提高学生编程能力为根本。具体来讲, 即通过对给定问题进行分析, 能够采用合适的结构来存储数据、运用合适的模型来描述问题, 然后提高运用语言编写代码的能力, 快速发现并纠正程序中错误的能力, 及编写高质量程序代码的能力。
在程序编写部分, 除了对程序语言的理解和掌握外, 主要就是对编译技术的掌握。其重点内容应包括:词法分析, 语法分析, 语义分析与中间代码生成, 中间代码优化及目标代码生成这几个主要的环节。其它内容, 在不影响课程进展的情况下, 可以考虑略讲或直接省略。如在自下而上语法分析中, 像算符优先分析可以不讲或略讲。在LR分析法中, 具体内容涉及到LR分析器及LR (0) 、SLR、规范LR及LALR分析表的构造方法。此处是语法分析中的难点, 如果逐一讲解必然占用大量课时。故可在LR分析器的基础上, 以LR (0) 为例来对自下而上语法分析进行讲解。然后, 在此基础上进一步引申, 如项目集中含有冲突项目 (如同时含有移进和归约项目) , 应该如何处理。这些供有兴趣的同学进一步探讨。
类似地, 对属性文件及语法制导翻译, 并行编译的内容, 以及形式语言与自动机的知识点, 采用点到为止的方式, 仅提出相应的问题, 不做细致分析讲解。
同时, 由于编译原理的先导课程较多, 如以C语言为源语言, 汇编语言为机器代码为例进行课程分析, 对涉及到的相关知识及内容应适当加以回顾, 使学生能将精力集中放到编译技术的理解上, 不因先导课程中知识点的不理解而影响对当前知识的掌握。
3 教学过程中的注意事项
编译原理课程是理论性强的课程, 也比较抽象, 如何让学生能够理解并运用其中的原理和技术, 从而来提高编程能力呢?实例引用和与实践结合就是课程讲授中非常重要的两个方面。
(1) 实例引用贯穿始终。如在编译过程概述中, 提到编译过程的各个阶段, 词法、语法及语义分析等概念, 学生一时难以接受和理解。此时可举实例进行讲解, 比如以赋值语句:area=pi*r^2为例, 讲解如何将本条语句由源程序通过词法、语法等步骤, 逐步转换成目标代码并加以执行的。从而使学生对整个编译过程有一个直观的印象。
同样, 在中间代码生成阶段, 举例说明是如何将三种基本结构的语句, 如顺序结构语句 (如赋值语句) 、控制结构语句 (如if…then, if…then…else语句) 、循环结构语句 (while和for语句) 等, 分别用具体的源语言程序来说明, 讲解是如何利用语义分析技术将其翻译成中间代码 (如三元式) 的。
(2) 与实践相结合。上面提到以实例来对相关的技术加深理解。而在实践应用方面, 只有将理论与技术真正应用于实践, 编译技术的学习才有意义。如在上机实习方面, 可通过C语言构造一个小的编译系统。可以分别利用flex和bison等工具构造词法、语法、语义分析器, 并在此基础上构造一个小的编译系统。使得词法分析可识别关键字、标识符以及各种符号, 语法分析可进行语法的判断, 语义分析器可进行一些数学运算, 而构造的编译系统可以将C语言的一个子集翻译成汇编语言的形式。
4 小结
针对普通高校计算机专业及相关专业本科生, 从教学目的、教学内容、教学中出现的问题三个方面对编译原理课程的教学进行了分析讨论。希望通过对这几个方面的讨论, 可以使学生能够对编译过程有更深入的理解, 并使其编程能力得到进一步的提高。
参考文献
[1]张昱.“编译原理”课程的教学内容选择的探讨[J].计算机教育, 2009 (18) :143-146.
12.编译原理课程和助教工作总结 篇十二
时间如流水般,转眼,一学期将至,每个人为了能交上一份满意的答卷,无时无刻不在倾注着汗水,挥洒着热泪。掩卷长思,细细品味,这学期的点点滴滴不禁又浮上心头,现在让我们一起回顾一下,希望可以对今后的教学工作有所帮助。
编译原理是我们北京师范大学信息科学与技术学院计算机专业本科生的专业必修课,它旨在介绍编译程序构造的一般原理和基本方法,其内容主要包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成等。这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,但是编译原理课程是所有计算机专业学生应该习得的一门重要课程,因为虽然在将来并不是所有人都会从事编译方面的工作,但是通过编译原理的学习之后,可从许多不同的角度来观察编译器的结构,编译器的物理结构、操作的顺序等等,会涉及到数据结构、计算机组成原理等课程,所以同学们在理论、技术和方法上都能得到系统而有效的训练,而且有利于将来希望从事软件开发的学生的相关素质和能力的进一步提高,更能够让每个学生更清楚的了解和熟悉一段程序从源代码到可执行文件之间具体的转换过程,这样能够更好的理解代码的编译和计算机内部的工作原理,对学生以后计算机相关的学习乃至工作从业都会有非常大的帮助。
编译原理这门课程是计算机专业课程中偏难的一门课,不管是在平时的课堂教学上,还是在上机实验的过程中,学生都会产生很多困惑之处,在这些方面我们的编译原理助教就承担了相当重要的工作和任务:
每周课堂随堂听课,跟进教学进度,并且上课之前做好复习工作,对每节课同学们可能会产生的问题提前做好归纳,以便更好的在课余时间跟同学们讨论,给同学们提供答疑解惑的机会;
能动手编写代码完成变异原理实验是本课程技能培养的重要一环,在每周的上机实验时,助教帮助同学们进行分组,以小组合作的方式来完成每次的实验任务,依照课程进度循序渐进的给同学们分派布置实验任务,在实验课上跟同学们随时交流,一同调试代码,一对一的解答实验疑惑等,并且协助同学们理解实验原理和内容,辅助同学们能够顺利完成上机实验,通过上机实验的手动操作,同学们也可以更直接、更具体的理解编译程序代码过程中一些具体的原理和方法;实验课我选取的是基于C++或者是基于flex和bison的实验,助教会主动和实验课本的作者老师联系沟通,获得更多实验相关的资料,比如书上给出代码的电子版和用例测试等。
助教在课后会主动收集同学们课堂上课或者实验过程中遇到的问题向我反映,这样可以及时发现同学们在课堂中理解较为模糊甚至有偏差的地方,并在课堂或者实验课上进行一个集中的讲解,更利于同学们的学习;
每次课结束之后,我会布置课后作业来让同学们对课堂教学内容进行巩固和查漏补缺,助教认真批改同学们的课后作业、所交的实验报告和运行的代码,做好每位同学的评分与登记,对课后作业、实验报告和代码中关键性的错误做出标记,并要求学生改正。登记课后成绩时,按10分制来决定,登记实验成绩时按照20分制来决定。在每次批改作业结束后,助教会及时整理,汇总学生的成绩和作业实验中出现的问题,助教通过批改课后作业和实验来了解同学们真实的学习情况,从而能够更好的辅助教学工作的进行。
平时为了同学们能获得更好的学习体验,会进行一些与国外教授的视频课程或者相关活动等,助教会组织同学们进行视频授课前的预习工作,同大家一起讨论上课形式,提出可能遇到的问题等等,在课前会负责批教室,布置桌椅场地,设置视频授课环境,调试摄像头、话筒和音响等相关的设备,为进行正常的视频授课或其他活动做准备。
对自己的要求:
一、师德方面:加强修养,塑造“师德”,我始终认为作为一名教师应把“师德”放在一个极其重要的位置上,因为这是教师的立身之本。“学高为师,身正为范”,这个道理古今皆然。从踏上讲台的第一天,我就时刻严格要求自己,力争做一个有崇高师德的人,为每一个学生“传道授业解惑”。
二、认真备课,不但备学生而且备教材备教法,根据教材内容及学生的实际,设计课的类型,拟定采用的教学方法,并对教学过程的程序及时间安排都作了详细的安排,认真写好教案。每一课都做到“有备而来”,每堂课都在课前做好充分的准备,并制作各种有利于吸引学生注意力的有趣教具,课后及时对该课作出总结,并认真搜集每课书的知识要点,归纳总结。
三、增强上课技能,提高教学质量,使讲解清晰化,条理化,准确化,生动化,做到线索清晰,言简意赅,深入浅出。在课堂上特别注意调动学生的积极性,让学生多动手,从而加深理解掌握知识。加强师生交流,充分体现学生的主动作用,让学生学得容易,学得轻松,学得愉快;注意精讲精练,在课堂上老师讲得尽量少,学生动口动手动脑尽量多;同时在每一堂课上都充分考虑每一个层次的学生学习需求和学习能力,让各个层次的学生都得到提高。
四、认真批改作业:布置作业做到精读精练。有针对性,有层次性。同时对学生的作业批改及时、认真,分析并记录学生的作业情况,将他们在作业过程中出现的问题作出分类总结,进行透切的评讲,并针对有关情况及时改进教学方法,做到有的放矢。对学生:
13.编译原理实用论文 篇十三
《编译原理》课程是高职计算机科学与技术专业的核心理论课程之一, 介绍了高级程序设计语言的原理和实现技术, 这门课程由于比较抽象且理论性较强, 教师教起来困难, 学生学起来更困难。将案例法引入《编译原理》课程的教学, 能充分发挥案例法的优势, 启发和引导学生, 通过对案例的分析和推导, 培养学生分析问题和解决问题的能力。
在编译原理中, 通常提及文法一般是特指上下文无关文法。上下文无关文法中涉及到了一些重要文法, 如递归文法、二义文法、LL (1) 文法、LR文法、SLR文法。其中, 二义文法和其它文法密切相关, 因而, 下面以二义文法为主线, 设计了一些典型案例, 讨论分析了二义文法和其它文法的关系。
1. 文法的二义性及存在的问题
案例1:对于文法G:
E→E-E|E/E| (E) |i
要求学生写出句子i-i/i、i-i-i和i-i的最左推导、最右推导和语法树。
通过此案例, 启发学生发现文法的二义性, 如果文法G所推导出的语言L (G) 中至少存在一个句子x, 如果x存在着两个不同的最左推导, 或者两个不同的最右推导, 或者两个不同的语法树, 则文法G有二义性 (ambiguous) , 简称二义文法。
进一步, 引导学生思考, 如果一个文法是二义性的, 在语法分析中存在哪些问题。引入案例2:对于文法G:
E→E-E|E/E| (E) |i
句子i-i/i有两颗不同的语法树, 语法分析中如何选择?
通过对案例的分析, 帮助学生理解, 在二义文法所描述的语言中, 必然至少存在一个句子, 当编译程序对它进行语法分析时, 就会产生两种甚至更多种不同的理解, 由于语法结构分析上的不确定性, 将必然会导致在语法制导时, 产生语义处理上的不确定性, 进而会出现对同一源程序符号串在目标代码生成上的不确定性, 因而是应当避免的。
2. 文法二义性的判定问题
在设计一个编译程序时, 应先了解所处理的语言是否由二义性文法定义的。虽然, 普遍意义上, 上下文无关文法是否具有二义性是不可判定的, 但是对于上下文无关文法中的某些特殊文法, 还是可以判定其二义性或无二义性的。
2.1 判定文法有二义性的充分条件-利用递归文法
引入案例3:对于文法G:
A→Aa
A→βA
A→γ
要求学生找出文法中的递归产生式, 并指出左递归产生式和右递归产生式的不同?进一步, 分析句子βαγ的最左推导、最右推导和语法树, 文法G是二义文法吗?
对句子βαγ来说, 由于以及, 有两个不同的最左推导, 学生可以快速的发现此文法有二义性, 是二义文法。进一步, 引导学生思考二义文法和递归文法的关系, 得出检查文法二义性的充分条件的结论, 即如果递归文法G中存在一个非终结符既有左递归产生式, 又有右递归产生式, 则此递归文法一定有二义性。
2.2 判定文法无二义性的充分条件
2.2.1 利用LL (1) 文法
引入案例4:对于文法G:
是LL (1) 文法?是二义文法?LL (1) 文法和二义文法的关系?
在此案例中, 先启发学生消除文法G中的左递归, 产生文法G’
得到文法G’的预测分析表M1, 如下图1所示:
因为分析表不含多重定义, 故此文法是LL (1) 文法, 一定不具有二义性, 不是二义文法。LL (1) 文法是判断文法无二义性的充分条件。进一步, 引导学生思考, 如果文法是二义性的, 在此文法的预测分析表中会出现至少一个多重定义条目, 因而, LL (1) 文法一定不是二义文法。
2.2.2 利用LR (0) 文法和SLR (1) 文法
引入案例5:对于文法G:
是LR (0) 文法?SLR (1) 文法?是二义文法?LR (0) 、SLR (1) 文法和二义文法的关系?
首先, 引导学生分析此案例, 得到文法G的LR (0) 分析表M2, 如图2所示, 因为分析表不含多重定义, 故此文法是LR (0) 文法, 不是二义文法。接着, 因为follow (S) ={#, ) , , }, follow (T) ={) , , }, 在LR (0) 分析表的基础上构造SLR (1) 分析表M3, 如图3所示, 同样地, 因为分析表不含多重定义, 故此文法是SLR (1) 文法, 不是二义文法。在此基础上, 引导学生审视案例, 得出结论, 如果此文法是二义性的, 则在分析表中会出现移进-规约冲突, 分析表中会出现至少一个多重定义条目, 因而, LR (0) 文法一定不是二义文法, SLR (1) 分析表是在LR (0) 分析表的基础上构造的, 因而, SLR (1) 文法也一定不是二义文法, LR (0) 文法是判断文法无二义性的充分条件, 进而SLR (1) 文法也是判断文法无二义性的充分条件。
3. 二义文法的解决
二义文法会产生语法结构分析上的不确定性, 进而会导致语义处理上及目标代码生成上的不确定性, 因而是应当避免的。有两个解决文法二义性的方法, 一种是强制将二义文法转换成等价的非二义文法, 另一种是不改变文法, 但需要设置一个消除二义性的规则, 在出现二义性时, 利用此规则找出正确的语法树。
3.1 二义文法的消除
有些类型的语法分析器希望它所处理的文法是无二义的, 因而需要将二义文法转换成等价的非二义文法, 消除其二义性。下面以二个典型的二义文法为例介绍。
3.1.1 悬挂else问题
引入案例6:对于文法G:
其中, f, t, e, a分别代表if, then, else, 其它语句。而S代表语句, C代表条件表达式, f Ct S代表if..then..语句, 而f Ct Se S代表if..then..else..语句。
找出句子fitfitaea有两个不同的最右推导的原因?如何解决?
此案例中, 首先引导学生找出句子fitfitaea有两个不同的最右推导, 发现文法的二义性。接着, 通过引导学生回顾C语言中的if语句的嵌套问题, 找出二义性的原因在于else部分既可以与第一个if结合, 也可以与第二个if结合, 这种二义性被称作悬挂else问题。进而, 消除其二义性, 将文法G改造为等价的无二义文法G’, 文法G’如下:
其中, d代表endif语句, f Ct Sd代表if..then..endi语句。因而, 当if..then..else..语句中嵌套if..then..endi语句时, 由于内层的if已经与endif匹配, else只能与外层的if匹配, 解决了悬挂else问题。
3.1.2 优先权和结合性问题
引入案例7:对于文法G:
找出句子i-i/i、i-i-i有两个不同的最右推导的原因?如何解决?
此案例中, 首先引导学生找出句子i-i/i有两个不同的最右推导, 发现文法的二义性。接着, 通过引导学生回顾算术运算的优先性, 找出此句子有两个不同的最右推导的原因在于文法中没有设定算符的优先级, 依次类推, 通过对句子i-i-i的分析, 找出此句子有两个不同的最右推导的原因在于文法中没有设定算符的结合性。进而, 将文法G改造为等价的无二义文法G’, 在文法G’中, 除法优先于减法, 同级运算服从左结合, 文法G’如下:
最后, 对于文法G’, 引导学生重新做句子i-i/i、ii-i的最右推导, 加深学生对规范规约、自下而上语法分析和语法制导的理解。
对于句子i-i/i, 其最右推导过程如下:
因而, 在语法制导翻译时, 除法优先于减法, 总是先做除法, 在句型E-T/F中规约T/F得到T后, 才能做减法, 在句型E-T中规约E-T得到E。同理, 对于句子i-i-i, 其最右推导过程如下:
因而, 在语法制导翻译时, 同级运算时, 总是先做左边的减法, 在句型E-T-i中规约E-T得到E后, 继续规约若干步后, 才能做右边的加法, 在句型E-T中规约E-T得到E。
3.2. 二义文法的利用
引入案例7:对于文法G:
和文法G’:
要求学生分别构造文法G和文法G’的SLR (1) 分析表, 并比较两个分析表的规模。
首先, 引导学生找出文法G和G’的不同, 算术表达式文法G和与其等价的无二义文法G’相比, 明显的二义文法G中非终结符和产生式较少, 相应地分析表的规模更小一些。具体地, 可以, 引导学生构造文法G的SLR (1) 分析表M4, 如图4所示, 在分析表的M4[7[-]、M4[7][/]、M4[8][-]、M4[8][/]四处出现了多重定义。如果设置消除文法二义性的规则为除法优先于减法、同级运算服从左结合, 则以句子i-i/i为例, 当语法分析过程进入到某状态时, M4[7][/]=s5r1, 符号栈为“#E-E”, 输入串为“/i#”, 因为除法优先于减法, 应该做移进, 所以M4[7][/]=s5。以句子i-i-i为例, 当语法分析过程进入到某状态时, M4[7][-]=s4r1, 符号栈为“#E-E”, 输入串为“-i#”, 因为同级运算服从左结合, 应该做规约, 所以M4[7][-]=r1。同理, M4[8][-]=r2, M4[8][/]=r2。消除了多重定义的SLR (1) 分析表分析表如图5所示。同理, 构造无二义文法G’的SLR (1) 分析表M6如图6所示。对比两个分析表, 在图5中, 二义文法G的分析表规模为10×7, 而在图6中, 文法G’的分析表规模为12×9, 因而, 二义文法G的分析表更简洁。
进而, 引导学生得出结论, 有些语法分析器允许二义文法的存在, 二义文法相对于等价的无二义文法, 能提供更简洁的规约, 但是要附加一个消除二义性的规则[1,3]。在此基础上, 重新审视此案例, 找出此方法的优缺点。此方法的优点一方面是无需修改文法, 因为寻找等价的无二义文法的过程有时很复杂, 另一方面是因为某些二义文法在语言的实现中很有用, 尤其是对于表达式这样的语言结构, 二义文法相对于等价的无二义文法, 能提供更简洁的规约[2];此方法的缺点是语言的语法结构要由文法和规则同时定义, 而不能由文法单独提供。
4. 小结
在计算机课程的教学中, 尤其是理论性较强的课程教学中, 案例教学法相对于传统的教学方法, 更生动, 更具有启发性。在编译原理课程的教学中, 巧用案例法, 不仅能激发学生的学习兴趣, 更能启发学生, 加深学生对理论的理解。此外, 在编译原理课程中, 除了二义文法, 还有很多知识点也可以利用此方法来达到更好的教学效果。
参考文献
[1]陈意云, 张昱.编译原理[M].高等教育出版社, 2008:14-15.
[2]赵建华, 郑滔.编译原理[M].机械工业出版社, 2009:142-143.
【编译原理实用论文】推荐阅读:
有关编译原理的论文06-22
编译原理课程06-15
编译原理期末总结08-06
《编译原理》课程设计要求08-08
编译原理实验二(设计一个词法分析器)09-20
教育原理相关论文10-31
erp原理论文11-21
室内设计原理论文12-10
数据库原理课程论文10-29
红外热像仪的测温原理论文07-22