“编译原理”课程的教学研究与探索

  • 格式:doc
  • 大小:94.50 KB
  • 文档页数:5

“编译原理”课程的教学研究与探索

1“编译原理”课程教学现状

编译原理作为计算机专业的一门核心课程,在教学中占据十分重要的地位。但由于其内容具有较强的理论性和实践性,学生在学习过程中感到内容抽象、算法复杂、难于理解,因此“编译原理”被普遍看作是计算机本科教学中最难讲解、最难学习的课程。总结起来理由如下。

(1) 本课程涉及不少理论知识,如形式语言和自动机理论、语法制导的理论等。这些理论的学习有一定的难度,特别是语法制导定义(或翻译方案)的设计,因为它本质上是一种事件驱动的程序设计,这对于三、四年级的本科生来说还是较难掌握的。

(2) 本课程包含了很多算法,大的有LL(1)分析算法和各种LR(1)分析算法等,小的有DFA化简算法、计算开始符号集合和后继符号集合的算法、各种数据流方程的迭代求解算法。这些算法要比数据结构中接触的算法复杂得多,学生在学习数据结构的时候,接触过很多算法,对于不理解的算法可以跟踪算法的执行过程,而跟踪编译程序中的算法则要麻烦得多,想深刻理解算法的思想很困难。

(3) 编译程序规模大,不可能在一门课的时间内把所有的细节都讲清楚,这使学生对编译程序各逻辑部分之间的接口和一些算法的实现是模糊的。

针对这种情况,如何提高这门课程的教学效果,是一个值得探讨的问题。笔者多年来一直从事“编译原理”课程的教学,对如何改进教学方法和提高教学效果做了一些研究和探索,并取得了良好的效果。

2明确教学目标,提高学生学习兴趣

很多学生认为“编译原理”只能应用在写程序语言的编译器上,而他们以后可能不会在编译器及其相关领域方面钻研,所以学习兴趣不高,其实这是一种误解。编译技术是计算机语言发展的支柱,也是计算机科学中发展最迅速、最成熟的一个分支。通过学习编译程序的构造原理和技术,将有助于深刻理解和正确使用程序设计语言。编译内容涉及到计算机的组织结构、指令系统以及操作系统,掌握编译技术有助于加深对整个计算机系统的理解。另外,由于编译程序作为系统软件在性能上具有严格的要求,这使得它所使用的算法经典、高效,而这些算法、思想和实现技术也可广泛地应用于一般软件的设计实现。如正规式和有穷自动机在文本编辑器中的广泛应用,有穷自动机在字符串查找中的运用,必经节点算法在网络中的运用,由文法来定义网络协议等。在教学中,可以鼓励学生尝试将编译程序中的各种算法和技术应用到各个应用领域,从而激发学生的创造性思维,培养学生的创新能力,为今后的学习打下坚实的基础。

3优化教学内容,搞好课堂教学

由于这门课程理论性强,内容丰富且抽象,具有严密的逻辑性,应用其他课程知识比较多,要在有限课时内很好地完成本课程的教学。教师首先必须吃透教学内容、把握课堂教学环节。这就要求教师对教材非常熟悉,掌握编译原理的主要内容及基本框架,对教材及教学内容作一定的优化。

3.1选取合适的教材

某些“编译原理”教材并不是完全面向学生的,可能是作为这门学科的大全来编写的。例如由美国著名计算机科学家编著的“龙书”《Compilers Principles,

Techniques and Tools》,中文译名为《编译原理》,由机械工业出版社出版,这本书是最经典权威的编译教材,应该是教师教学的必备参考用书,但如果将其作为授课的教材,对大部分学生来说都不太适合,因为内容过多,难度过大。

笔者总结了多年的教学经验,编写了一本《编译原理》教材,已由人民邮电出版社出版,我们在教学中采用这本教材。结合教材的特点,我们在教学中力求做到以下几点。

(1) 考虑到学生对C语言较为熟悉,所讲授的主要算法、例题和习题均以C语言为背景。

(2) 把编译原理和编译技术两方面有机地结合起来。将“PL/0语言编译程序”模型的实现过程贯穿于各个章节,这样使学生在掌握相关的编译原理之后,通过阅读理解和扩充此编译程序,加深对所学内容的理解,使所学内容融会贯通,能够建立一个较为完整的编译系统模型。

(3) 对常用分析器的自动生成工具(LEX和YACC)的功能和使用方法做了详细的介绍,并给出了使用LEX和YACC实现的PL/0语言编译器的源程序,从而使学生真正掌握如何借助LEX和YACC实现一个编译器。

3.2抽象内容形象化

编译系统中的一些概念很抽象,学生无法理解,就只会死记硬背,当然更无兴趣可言。在讲解的过程中,可以选用学生最熟悉的一些实例,通过类比使抽象的概念更容易被理解。例如,从理论上来说,编译过程一般包括词法分析、语法分析、语义分析和中间代码生成、代码优化、目标代码生成这五个阶段。学生记住这五个阶段并不难,但理解阶段划分的依据有一定的难度。编译程序的功能是将用高级语言编写的源程序翻译成等价的用机器语言或汇编语言表示的目标程序。既然编译过程是一种语言的翻译过程,那么它的工作过程就类似于外文的翻译过程,不同之处仅在于由哪种语言翻译成另外哪种语言,但其原理是类似的。两者的翻译过程对比如表1所示。

例如,我们要将英文句子“I wish you success”翻译成中文,首先进行词法分析,根据英语的词法规则,识别出四个英语单词,并检查是否有单词的拼写错误。其次是语法分析,根据英语的语法规则,对词法分析后的单词串进行分析、识别,并做出语法正确性检查,看其是否能组成一个符合英语语法的句子。再次进行语义分析,即对语法正确的英文句子分析其含义,并用汉语表示出来。然后对译文进行修饰,根据上下文的关系及汉语语法的相关规则进行综合考虑,对初步翻译后的句子进行必要的修饰。最后翻译成中文,“祝你成功”。学生经常做这种翻译,对翻译过程非常熟悉。将它与编译过程进行类比,既加深了学生的印象,又有助于理解为什么将编译过程划分成这几个阶段。

3.3运用实例教学

以课堂讨论的方式,结合某种高级语言(如C语言),从其难以掌握、容易出错的语法难点入手,用编译原理的理论加以分析。培养学生灵活运用所学理论知识分析问题、解决问题的能力,提高他们思维的活跃性。我们在课堂上和习题中,准备了很多从实际程序的编译和运行时碰到的问题中抽象出来的例子,供学生用所学的知识去分析、理解,并加以解决。采用这种实例教学方式,使学生明白通过“编译原理”课程的学习,可以深入理解高级语言的工作原理,做到知其然更知其所以然,从而能够更准确地运用各种高级程序设计语言。这样,既能够对前期课程起到复习巩固的作用,又能让学生切实体会到本课程的实际价值,从而有力地激发了学生学习编译原理和技术的积极性。

例如,在讲解词法分析器扫描源程序时,对源程序采取局部处理的观点,并不会瞻前顾后。为了让学生体会这一点,我们可以运用以下实例进行说明。

一个C语言编译器编译下面的函数时,报告parse error before ‘else’,这是因为else的前面少了一个分号。

long gcd(p,q)

long p,q;

{

if (p%q == 0)

/* then part */

return q

else

/* else part */

return gcd(q, p%q);

}

但是如果第一个注释

/* then part */

误写成

/* then part

那么该编译器发现不了遗漏分号的错误。这是为什么?

因为此时编译器认为

/* then part

return q

else

/* else part */

是程序的注释,因此它不可能再发现else 前面的语法错误。

3.4灵活运用多种形象化的教学手段

“编译原理”课程具有很多概念和定理,再加上大量复杂的算法,抽象程度很高,因此要想获得良好的教学效果,必须借助形象化教学手段,使抽象的理论具体化。为此我们编制了一些多媒体课件,把抽象概念和算法生动形象地演示出来。同时向学生推荐网上优秀的“编译原理”课程教学网站、电子书、算法等资源,拓宽学生视野。

4加强实践教学环节,激发学生主体意识

“编译原理”是一门对实践要求较高的课程。本课程的课程设计,要充分考虑编译理论与实际应用的结合,突出开创性和实用性。如:完整编译器的分析设计,利用有穷自动机设计字符串查找程序,与软件工程、数据库的结合等。在这样一些小型系统的开发中,可以引入软件工程理论,注入结构化程序设计思想,将整个系统模块化,合理组织不同能力层次的学生分组开发各个功能模块,让所有学生共同参与,协作完成。鼓励学生间相互探讨,共同提高。对学生的设计,要特别要求严格控制系统开发各环节的实现,以培养良好的严谨的软件开发风格。这样既使学生巩固了所学的理论知识,并融会贯通,又培养了学生理论联系实际和综合运用各门课程理论的能力,为以后的实际工作打下坚实的基础。

参考文献

[1] 李冬梅,施海虎. 编译原理[M]. 北京:人民邮电出版社,2006.

[2] 陈意云,张昱,郑启龙. “编译原理”的教学与实际相结合的探讨[J]. 教育与现代化,2005,(12):32-36.

[3] 张昱,陈意云,郑启龙. 编译原理课程的教学方法和教材建设[J]. 中国大学教学,2005,(7):61-62.

[4] 何炎祥,伍春香. 现代教学理论指导下的“编译原理”教学综合改革[J]. 计算机教育,2005,(3):10-13.

[5] 胡作进,胡林生. “编译原理”课程教学改革刍议[J]. 安徽广播电视大学学报,2006,(4):55-57.