颜 雁,尹大力
(长春理工大学计算科学技术学院,长春 130022)
《编译原理》是计算机专业的一门非常重要的专业必修课程,课程兼有很强的理论性和实践性。它的主要任务是系统向学生介绍编译系统的结构、工作原理以及编译程序各部分的设计原理和实现技术。其实验课程的目的是使学生具有设计、实现、分析和移植编译程序等方面的初步能力,从而为今后的计算机软件开发以及理论研究工作打下坚实的基础。
1.理论性强,涉及的算法复杂。学习时需要很强的逻辑思维能力,要深入理解这些算法很困难。
2.编译程序各个部分相对独立。其内容包括词法分析、语法分析、语法制导翻译、代码生成与优化这几大部分。然而,整个编译程序的构造非常精妙,就像一部精确的时钟,很多齿轮、部件协调地运转,环环相扣,牵一发而动全身。一步出错,满盘皆输,构建一个全局的小型编译器并不容易。
一直以来,实验教学阶段以验证性实验为主,指定题目要求学生编程实现编译各阶段的功能:构建词法分析程序,构建语法分析程序,语义分析程序等;考核方式以考查程序实现情况为依据。然而在长期教学过程中,发现存在如下问题:
(1)题目设置单一,各部分联系不足,导致很多同学仅在代码层面上盲目追求程序运行,只见树木不见森林,忽略编译程序全局性,不能全面深刻理解整个编译程序实现原理。
(2)题目过于注重算法,与实际应用结合不紧密。学生兴趣不高,盲目学习,并不清楚相关原理能解决什么实际问题。
(3)组织方式上,以班级为单位,统一做一个题目,忽略学生的个体差异,难免会造成“千篇一律”的局面。这不符合新时期“以人为本,因材施教”的教育理念。
(4)考核方式上,以程序的实现情况以及报告书写是否全面做评价依据并不客观。
1.调整传统必做题目,加入源代码预习环节
长期以来,传统必做题目以验证性为主,提供给学生一种简化语言,例如C语言的子集[1],要求学生针对该语言的词法语法规则,实现其词法分析子程序、语法分析子程序、语义分析子程序的设计[2],期望使学生掌握微型语言编译程序的构造原理。但实际教学中常常事与愿违。一则学生对语言语法规则整体把握不准确;二则此类实验项目注重局部算法,较少涉及到编译程序各部分的有机结合。因此,在上机实习时,学生或没有思路,或留于表面满足于局部的程序运行,有时连各部分基本的输入输出的真正含义都不甚理解,更谈不上形成一个有机的编译程序整体。此外,程式化的题目过于注重算法,与实践脱节,枯燥无味容易使学生产生畏难情绪与厌学心态,违背实践教学的初衷。
为此我们做出调整,加一个预习环节。为了加强学生对编译程序整体的认识,我们直接提供给学生一个针对简单语言的经简化的完整的编译程序。要求学生认真阅读,在深入理解该编译程序及其源语言语法成分后对其语言的语法成分进行扩充,如扩充语句、数据类型或增加函数的说明和引用等(扩充的内容按难度分必做和选做,后面详述)。最后在实验课上完善编译程序相关功能(完善词法分析、语法分析、语义分析程序)。这样预先给定简单语言编译源码,可以让学生对理论教学相关原理充分消化,做个缓冲;同时,完善功能设计,比原先直接设计更为具体,从而解决学生“摸不着门”的问题,这样更易达到良好的教学效果。
2.扩充实践应用性题目为选做题目
一则能提高学生的学习兴趣,二则能使学生知晓编译原理技术知识不但可以用于构造和维护编译程序的工作,还可用于部分系统软件和应用软件的开发。例如,在语法分析阶段加入选做题目,利用编译程序语法分析、语义分析的原理设计一个计算器,实现表达式的分析计算。这样,可以克服以往模仿Windows系统的计算器,只有输入和结果,不能直接输入表达式;不能对好几个表达式进行计算;也不能选择表达式中的一部分进行计算;对输入错误不能确切报告表达式中的错误位置等缺点,具有很强的实用性。而且,它还能提高学生的兴趣,加深学生对编译程序应用方向的整体认识,帮助他们走出“编译无用”的认知误区。
针对不同水平的学生设定不同难度的实验题目,不同实验题目会有不同的要求,从而激发每个学生的学习兴趣,使每个学生都能通过学习而有所收获。以语法分析程序为例:预习环节给定简单C语言语法规则(其中语法变量仅包含赋值语句,表达式,项、因子),以及递归下降编译器[3]。我们制定要求如下:对基础一般的同学,要求在源语言基础上扩充说明语句的语法规则,然后实现正确的语法分析;对于基础较好的同学,除要求说明语句以外还要求扩充循环FOR,WHILE语句语法规则[4],实现语法分析;再者学有余力的同学还可以选做题目,建立面向对象环境下的计算器。这样,在内容上实现难度阶梯设计,能按照学生对知识掌握的程度因材施教,避免个别学生或“吃不了”或“吃不饱”的现象,从而最大限度发挥学生的主观能动性和学习潜质,提高学生软件开发整体能力。
对于优秀的选作实验“作品”,我们将其放到课程网站以供其他学生学习借鉴,鼓励学生找出程序不足并进行完善补充[5]。学生可以将完善后的程序以报告的形式发给实验指导教师,教师根据完成情况与学生进行网络互动,给出指导意见。如果学生即将参加编译课程设计,则该报告可以直接作为课堂实验的报告参与评分,充分体现了教育的灵活性。
传统考核以检查程序的实现情况以及报告书写做评价依据并不客观。并且极易造成千篇一律的情况。现采取课上考察程序实现占30%、课后交总结报告占30%、期末抽签答辩占40%的综合立体化考核办法。
期末答辩分必做和选做两场。必做答辩全体同学参加,每个同学采取抽签方式抽取答辩实验题目,要求答辩原理清晰,程序运行良好;选做答辩自愿参加,根据个人的选做记录,抽取题目答辩,视完成掌握情况予以加分。答辩成绩即为必答和选答两项的总和。如此立体考核办法对学生具体而客观,既能充分调动学生积极性,又能最大限度杜绝学生“蒙混过关”的思想,起到监督鞭策作用。
此外,必做题目以个人为单位,选做题目允许以小组(2~3人)为单位。改变传统的实验报告模式,教师不再硬性规定报告的格式和内容,而是要求学生将实验报告以小型科研论文的形式提交。让学生把在分组讨论时对编程结果进行的分析和自己独特的见解写进报告,避免实验报告“千人一面”的现象。这样能够培养学生实事求是的科学态度和独立的科研素质。
综上,笔者作为多年从事编译教学的一线教师,针对编译原理课程特点,以及实验教学中突显的问题展开教学改革研究,总结有4点:一是加入预习实验,给定简短编译源码,力使学生“有的放矢”。二是加强理论联系实际,扩充应用型实验题目,帮助学生走出“编译无用”的误区。三是因材施教,题目难度成阶梯状分布,实现个性化教学。四是实施全面立体化三合一考核办法,客观评价学生。
编译课程教学在新时期“因材施教,以人为本”的教育理念下仍然面临巨大挑战。如何能提高学生学习兴趣,发挥学生最大潜能,获得最优的教学效果应该是每位教师长期思考并致力解决的问题。
[1]刘铭,徐兰芳,骆婷.编译原理[M].3版.北京:电子工业出版社,2011.
[2]王雷.编译原理设计[M].北京:机械工业出版社,2010.
[3]肖军模.程序设计语言编译方法[M].3版.大连:大连理工大学出版社,2000.
[4]何炎祥.编译原理[M].武汉:华中理工大学出版社,2000.
[5]万晓枫,郝晓青.改进编译实验教学方法提升实验教学效果[J].实验科学与技术,2012(5).