彭源,张安勤,孙超超,田秀霞
(上海电力学院计算机科学与技术学院,上海 200090)
《编译原理》课程主要讲授编译器构造的一般原理和基本方法。该课程具有很强的原理性和实践性。实验教学是《编译原理》课程教学的重要内容,学生通过完成设定的实验,可深入理解编译器的基本原理和技术、掌握编译原理中涉及的基本算法、结构和主要技术;在系统级的层次上理解高级程序设计语言源程序翻译成计算机能处理的目标代码语言的整个过程。通过实验,培养学生的计算思维,训练抽象问题、分析问题、解决问题的能力,巩固数据结构应用,增强编程水平,从而达到学会知识和提升能力的效果。
《编译原理》课程理论性较强,使用的描述工具,如正规式、有限自动机、正规文法、属性文法等较为抽象。且整个课程实际上在解决一件事情:如何构造编译器?知识综合性高,学生感到理解困难和掌握算法困难。
在编程实现算法的时候,学生经常会不知如何着手。原因在于实验对学生分析、抽象和解决问题的能力要求较高,学生的计算思维在前续的课程中并未经过系统的训练,而本课程常规的教学方式不能完全覆盖到这些方面。
编译器的构造遵循模块化设计的思路,每个模块完成不同的任务,相对较为独立。但模块前后又紧密相连,前一个模块的输出是后一个模块的输入。例如:语法分析在词法分析出一个个具体单词的基础上进行,而语义分析与中间代码的生成则是在语法分析的基础上,对文法配备了相关的语义子程序来实现的。
实验的目的是掌握编译器构造的整个过程,这就要求各个实验间不能是割裂的,而应该是一个渐进的统一的整体。但出于学生实践的角度考虑,又希望各个实验间具有较好的独立性,一个实验项目的失败不会影响到其他实验项目的进行。
每个编译原理的实验项目都是一个完整的编译模块。以往的实验对所有学生提出了统一要求,注重对基础的强训练。但班级中学生的能力水平是参差不齐的,统一的实验要求只能满足中等水平学生的能力培养需求。能力较弱的学生会觉得太难,不知从何做起,造成他们没有编程实现的动力,进而影响学习的气氛;而少数动手能力很强的学生会觉得实验偏简单,不利于其创新意识的培养。
以最常用的语法规则表示工具“文法”为例,在默认的写法中,均以大写字母表示非终结符(语法范畴),小写字符表示终结符(不可再分割的语法单位)。这种形式表示的产生式不容易和实际的语法概念对应起来,学生在做实验时不知道究竟在分析什么,造成了认知上的困难。
在掌握了算法的理论基础后,学生仍然会出现上手困难的问题,经多年实验教学实践发现,原因主要在于以下两个方面:
大量的细节问题。例如:词法分析实验中关键字是在识别为标志符的基础上匹配关键字表来实现、递归下降分析时需将读入的单词设置为全局量、语法分析时需加入特殊的符号以表达已读到源程序结尾等。
学生没有见过实际的运行代码,理论与程序联系不上,心理上有畏难情绪。
但随着教学条件的改善,提供了大量上机实践的机会,学生实际上对自己动手实现算法,甚至是一个完整的编译器是很有兴趣。在课后遇到问题时,虽可借助QQ、微信等网络通讯工具与教师沟通,但效果上不如课堂上的面对面沟通。
课程以贴近学生熟悉的编程语言的词法、语法、语义规则的实际案例为引导开展算法的讲解,即对于每个算法搭配实际可执行的程序。在讲解算法的过程中,兼顾理论知识和算法实现,使得学生在理解算法理论的同时,能建立起用树、栈、表等数据结构描述问题的计算思维。
“案例教学”模式好处有两个:一是增强了学生实现的信心,学生能看到算法是实实在在可以实现和运行的,并不是仅飘在空中的抽象理论;二是代码实现中有许多细节处理,可以帮助解决实现时的困惑,以及引导学生开拓思路,培养创新意识。
对表示工具较为抽象、和实际有脱离的问题,采用的办法是在相对较为简单的递归下降分析程序中,给出一个简单语言的完整的、用文字形式表示语法范畴的语法描述规则:
通过此种方式,在仍旧采用了文法作为描述工具的同时,尽量使用自然语言和学生较为熟悉的编程语言语法结构来设计语法规则,从而贴近学生的认知,搭建起语法规则和实际应用间的关联。
在实验内容体系设计时,遵循了两条主线:一是实验项目间的渐进式一体化,二是实验项目内的多层次教学。实验内容体系如图1所示。
本课程设计了五个实验:词法分析器、语法分析器之递归下降分析器、语法分析器之LL(1)分析器、语义分析器、中间代码生成器。每个实验围绕编译系统中一个独立的模块进行安排,每个实验在保持独立性的同时前后承接,建立了渐进式一体化的实验内容,以逐步深入培养学生设计和实现一个小型编译系统的能力。
图1 编译原理多层次、渐进式一体化的实验内容体系
在语法分析的递归下降分析器和LL(1)分析器两个实验中均给出了一个不依赖于词法分析的版本和一个依赖于词法分析器的版本;而在语义分析器和中间代码生成器中,给出了YACC语法分析器自动生成工具的使用说明,这为学生是在上一个实验的基础上开展,或是独立的开展这两个实验提供了选择。使得一些动手能力较弱的学生尽量不受之前实验的影响。
传统的实验题目设计得较为单一,也未考虑差异化的需求。学生们的水平参差不齐,导致动手能力较弱的学生做不出,而动手能力较强的学生则感觉过于简单。我们在每个功能模块都提出了一个以能力导向的“基础目标—进阶目标—拓展视野—自我探索”由易到难的多层次教学目标。基础目标是最低的教学要求,一般情况的同学应能达到进阶目标的层次。鼓励学生扩展视野,如对于词法分析和语法分析有自动生成工具LEX和YACC。实验中给出了关于这些自动生成工具的可选实验内容,以供学有余力的学生熟悉这些工具的部署和使用。实验中还给出了一些探索型的研究内容,如设计对HTML代码进行分析的词法规则和语法规则,从而实现编写网络爬虫软件,引导学生将课内的知识应用到其他相关领域。
协作式学习[1]是一种以小组或团队的形式组织学生进行学习的一种策略。我们将其引入到实验教学中。实验项目的开展以团队的形式组织,组内成员共同学习、讨论和编程解决问题以达到实验教学的目标。每个团队包括3-4名队员,学生可以自由组队。组内各个成员需分工协作,每人均承担一定的任务,最终成绩的评定以团队为单位给出,个体的努力程度会影响到团队每个人的成绩,从而强调了个体的责任心。该模式的好处在于组内成员可以将个人的学习心得、实现思路等在组内共享,使得每个人的学习收益最大化,同时促进了团队合作精神。并更进一步,在翻转课堂汇报时与全班同学共享与讨论,达到相互学习,激发创新思维的目的。
传统实验开展的形式是首先布置实验任务,然后讲解相关实现细节,接着留给学生编程实现,最后上交实验程序和报告。学生在接收任务的时候并未开始建立自己的实现逻辑,对于实现细节不能完全吸收内化,课后仍旧会碰到各种问题,且没有足够的时间和机会与教师互动。从以往实验的情况来看,班级上交的实验代码较为雷同,说明学生遇到困难时无法自我解决,又缺少与教师的大量沟通,导致实验效果不好。
近年来提出的翻转课堂[2-3]改变了实验展开的前后顺序。实验在理论课程之前已布置,学生在理论课上熟悉算法原理,课下通过教师提供的微视频和实验指导手册来建立计算思维,并试着编程实现。实验课堂上学生通过演讲报告,阐述自己对问题的描述方法、算法实现的思路、实验环境搭建的过程,及演示程序代码和运行结果。教师(包括其他组同学)与报告的同学通过互动方式讨论实验中存在的困惑,针对学生自学过程中无法自己解决的问题由教师进行讲解。课后学生进一步完善实验程序,最终上交实验报告和程序。
实践表明,该种方式调动了积极性和创造力,学生经常会有一些创新性的想法出现;演示和汇报激发了学生的表现力,也给学生施加了一定的压力,使其能以更加认真的态度对待实验;课堂上的集中讨论有助于形成活跃的学习氛围,突显了实验中的重点和难点,通过教师的讲解,能以较高的效率解决实际中的困难。
本文对编译原理实验教学的特点和存在的问题进行了总结,从改革课堂教学、更新实验内容体系、更新实验组织形式、引入翻转课堂等方面进行了实验改革和探索。从对近几届学生的实施情况来看,学生的主动学习能力和主动探索能力得到有效提高,以往照抄照搬的现象大大减少,取而代之的是亲自编程实现;期末成绩反映出学生对算法的掌握程度有较大提高,说明改革是合理有效的。未来我们在日常教学中将进一步研究创新和改革,以期达到更好的教学效果。
参考文献:
[1]张水波.分组协作式学习在计算机教学中的实践与思考[J].宁德师专学报(自然科学版),2006,18(3):307-309
[2]Bergmann J,Overmyer J,Wilie B.The Flipped Class:Myths Versus Reality[OL].The Daily Riff,http://www.thedailyriff.com/articles/the-flipped-class-conversation-689.php.
[3]Davies R S,Dean D L,BallN.Flipping the Classroom and Instructional Technology Integration in a College-Level Information Systems Spreadsheet Course[J].Educational Technology Research and Development,2013(4):563-580.
[4]彭源,田秀霞,张安勤,等.基于ACM竞赛理念的C++程序设计教学模式改革[J].计算机教育,2013(7):70-73.
[5]田秀霞,彭源,孙超超,等.创新实践项目驱动的信息安全专业教学改革[J].计算机教育,2015,No.251(23):30-33.
[6]田玲,余盛季,王晓斌,等.《编译原理》实验教学改革及探索[J].实验科学与技术,2013,11(6):297-299.
[7]夏斌,张慧,闾素红.编译原理课程实验教学改革与探索[J].网络安全技术与应用,2014(10):135-135.