提高“编译原理”课程教学效果的探索与实践
2009-02-04吴清许智宏
吴 清 许智宏
摘要:本文针对“编译原理”在理论及实验教学中存在难度的现状,探讨了如何提高该课程教学效果的有效途径,主要研究了课堂教学、实验教学及教学方法,并从中总结出规律性的策略,在有效帮助学生掌握扎实的基础理论和技术的同时提高学生实际动手能力,培养他们开发大型软件的工程意识、独立思考和团队合作的精神。
关键词:编译原理;教学研究;教学效果
中图分类号:G642 文献标识码:B
编译系统是计算机系统的基本组成部分,对它的研制是一项高难度的工程。作为一门理论性、实践性均很强的课程,“编译原理”对学生提高计算机软件素质,拓宽思维方式,理解信息处理实质,综合运用所学知识分析问题等具有重要作用。但由于这门课程的概念性强,具有严密的逻辑性,内容丰富且抽象,应用其他课程的知识较多,容易使学生望而生畏,是公认的计算机专业中既难教又难学的课程之一。同时由于编译系统大而复杂,理论多而深奥,而且目前课时又被压缩,课堂学习时间相对短暂,因此怎样收到理想的教学效果是一个亟待解决的问题。
作者曾调查了往届毕业生的学习情况,大部分学生表示在校期间没有真正学好这门课。笔者根据多年的教学经验,对该课程的教学进行了研究,逐步完善了课堂教学、实验教学及其教学方法,通过改进教学实施环节,协调计算机课程的合理衔接,锻炼了学生的系统分析设计能力。加强实验教学,使课程实验不再只是单纯地实现编译理论中的某些算法。我校学生在前续课程中从未开发过大型软件系统,因此我们也对学生亲身经历大型系统软件开发的全过程进行了研究。
1完善的教学内容
1.1理清课程的联系,建立课程的有机衔接
课堂授课中,应让学生体会本课程是如何建立在前续课程——高级语言、汇编语言的基础上的,运用数据结构、离散数学、计算机组成等课程的相关知识来解决编译问题,否则这门课就是孤立的,考完试就忘掉了。例如,以课堂讨论的方式教学,用编译理论分析C语言中的语法现象,培养学生灵活运用知识的能力。在课程设计方面,与同时开设的“软件工程”课程结合,用软件工程的思想规范指导学生完成一个小型编译器的开发。课程快结束时,引导学生思考编译理论对今后学习内容的指导意义。
为了跟上计算机技术的发展,教师还应加强课外阅读指导。例如,让学生从C到C++语言的分析中体会程序设计思想的不断发展和由此带来的编程语言从过程式到对象式的演变。鉴于教材对编译算法和模型的描述仍沿用C这类结构化程序设计语言的编译过程,所以教师除应在课堂授课时有重点地结合对象式思想讲解外,还应向学生推荐文献资料,引导学生思考在过程式语言基础上引入对象式语言的编译原理和特点,鼓励学生探讨面向对象编译器对编译前端(词法、语法分析)和后端(语义分析)的影响。
另外,由于编译程序使用的算法是较经典的,其思想和实现技术可广泛应用于一般软件的设计实现中,因此可鼓励学生将学到的算法应用到实际问题中。这样既对前期课程起到复习巩固的作用,又能让学生切实体会到本课程的实际应用价值。
1.2抓住各章节重点,注意各章节的联系
一个典型的编译程序的8个逻辑组成部分是相辅相成,互有联系,紧密相关的,像一条锁链,一环扣一环。教师要帮助学生触类旁通,充分体会编译程序体系的优美性与和谐性,注意概念间的联系,达到事半功倍的教学效果。
编译程序是大型复杂的软件系统,在教学中要拆成各个部分,分阶段讲解,以使学习难度减低,但这却往往导致学生到最后也不清楚各个部分是怎样在整个系统中协调工作的。就像自然语言的翻译工作,初学外语时,即使认识一个句子中所有的单词,也不一定能译出句子的正确意思;即使能译出一个个句子的正确含义,若不会修辞加工,也得不到一篇优质的译文——这实际就相当于割裂了编译系统各章节之间的联系。因此教师应帮助学生从宏观和整体把握编译技术,而不应使学生的注意力分散到局部算法上。
在讲授各个章节时,教师所用实例应具有延伸性和完整性,以便容易把对此例的整个编译过程分解后融入到各个开发阶段,使学生体验不同编译阶段成果的联系与衔接。例如,将算术表达式赋值语句这一示例作为主线讲解,不同章节各有侧重。通过文法定义不同的算符优先级和结合性,向学生传授问题抽象、形式化描述和句型分析等基本概念。通过将运算数扩展为数组,使学生理解不同语句语法制导翻译及生成8086系列汇编代码等。另外,示例只是授课载体,最重要的是要通过示例引导学生建立起对系统构建、模块化、逐步求精、算法设计与实现等计算机学科常用的、经典的分析解决问题的思想。
1.3教学方法的研究与学生能力的培养
课堂教学的实施与教师紧密相关,要在传授知识的同时讲述问题求解的典型思路和方法,使课堂真正成为训练学生科研方法和思路的重要场所,构建民主和谐、积极活泼的教学环境是至关重要的。这需要教师转变教学方式,从权威到和学生平等对话。教师在认真备课,激情讲课的同时,还应讲究授课的艺术性,通过循循善诱,使学生在融洽宽松的气氛中愉快学习。教师应充分肯定学生的探究成果,激发学生学习兴趣和热情,培养学生思维的批判性和创新性,引导他们从“这是什么”的学习心态转变到“这是为什么”。
2行之有效的实验教学方法
设计和组织良好的实践教学环节可以使“编译原理”课程获得良好的教学效果。2007年起,我们将授课学时压缩为48,实验学时增加到30,且实验成绩单独计算。我们在借鉴其他院校和专家优秀经验的基础上,不盲目追求与名校看齐,而是找准自己的定位。相对一流名校的学生,我校学生有的认真刻苦,但较为被动,缺乏主动思考、发现问题的能力和质疑精神,习惯于在引领之下按部就班地学习;也有的学生思想活跃,兴趣广泛,活动能力强,但学习自觉性不高,单纯凭兴趣,更缺乏自信心和持之以恒的耐力,需要外界的督促和鼓励。鉴于以上实际情况,本着“以学生为本”的原则,我们采用验证性实验和综合设计实验相结合的两阶段实践教学模式,认真设计实验项目,划分好各个实验环节,并制定分阶段的多指标评价体系,实施严格的过程考核和管理。
2.1优化验证性实验内容,制定前后衔接的任务链式实验题目
为了配合课堂授课内容,使学练互动,教师需要选取合适工作量的、与授课同步的若干验证性实验题目,按照编译原理的授课顺序细化任务,使每个学生都逐个完成与授课内容相关的子模块,使每次上机实验的编译程序逐步完善长大。由于每次实践内容比较简单,大部分学生都能完成,这就增加了他们的成就感和自信心,使他们养成一步一个脚印的扎实作风,循序渐进地完成实验题目。教师在此过程中把自己摆在一个组织者和监督者的位置上,而不是一个和学生一起完成任务的执行者,避免了学生的依赖心理,激发其积极主动的学习态度。
这些与教学同步完成的小规模验证性实验只是帮助学生解决对编译系统主要技术、算法的理解和设计,实验内容还要让学生掌握由这些理论和方法构造的编译程序的各个部件是如何在整个系统中协调运行的。所以教师应引导学生从整体上把握编译系统的结构,再将其分解,使之能够相互协调地工作在一个统一体中。
这一阶段的训练使学生提高了对复杂问题求解和数据表达的程序设计能力,他们不仅关注方法本身,更注重方法的实现;不再拘泥于细节的记忆,而是转到怎样进行整体设计和程序实现上来,为完成一个完整的编译过程打下了基础。
2.2增加课程设计环节,培养学生开发大型系统软件的能力
为了保证实践环节的教学效果,一定规模的综合训练的课程设计不可缺少。学生在综合训练中亲身经历一个大型软件开发的全过程,提高理论联系实际的能力。该课程的教学安排采用灵活的组织方式,部分学生可以结合软件工程课程的实践环节完成一个规模适当的编译程序的开发;或采用课内外一体化的教学模式,教师布置利用课外时间必须完成的工作。
设计内容要具有实用性和系统性,公布不同要求的题目,学生根据兴趣选择。学生组成4~5人的小组,选择或自定设计题目,再由教师根据上一阶段的表现和个体差异等平衡小组间实力,合理组织不同能力层次的学生分组开发,并就题目的难易程度和工作量与小组成员交流,最终确定要完成的主要工作。每组遵循完整的编译器开发方式,融入软件工程的思想,细化课程设计内容,分配角色和任务,推举组长、分析员、设计员、程序员和测试员等,并在课程设计中进行角色互换。每个学生都体验从分析设计、编码测试到交付维护的软件开发全过程,提高工程意识和开发大型软件的系统结构设计能力。
2.3精心组织实践过程,严格监督实验结果
课程设计之初,教师要进行必要的辅导,鼓励学生相互探讨,调动学生共同参与的热情,培养他们良好严谨的开发风格,从一开始就坚决杜绝抄袭现象。每次上机时注意抽查,并就其工作进行点评。如对运行当前获得的编译程序进行检验,成功后才能进行下一步实践。加强过程管理,解决学习动力不足的问题。考察学生对所开发软件的理解,有针对性地对系统中关键问题提出疑问。
实验结束后,学生要提交完整的软件开发文档和源代码。最终的成绩评定包括教师对阶段性成果和实验报告等文档的评分,还包括系统演示、答辩以及学生的自评和他评成绩,按不同的比例构成。具体考核内容要细化,并在设计之初就向学生公布。例如小组成员依据参与热情、努力程度、合作精神和贡献大小等为每位学生评分。这种多项评价指标方式全方位锻炼学生能力,重点考核学生的工作态度、是否独立完成和自身收获。
3必要的课程教学及实验平台
“工欲善其事,必先利其器”。为提高“编译原理”这门抽象、难学、难懂课程的教学效果,教师要事先做大量工作,形成一套行之有效的教学保障体系。因此我们利用丰富的教学资源,结合毕业设计,指导学生开发建立了一个编译系统的教学及实验平台。
要取得理想的教学效果,课程讲授离不开传统的板书,但多媒体辅助教学可以把抽象的概念和算法生动形象地演示出来,也是一种良好的教学手段。作为一种辅助教学手段,教师可在上课时演示部分关键算法和难点,使抽象的理论具体化,便于学生理解和记忆。配合综合教学网站,学生也可在课下使用。
任何一个功能完整齐全的高级语言编译程序的体积都很大,而且编程技巧高,学生感到阅读理解困难。因此我们还利用毕业设计开发了一个教学用编译程序及详细的说明文档,设计了若干合适的实验题目和案例资料,有兴趣的学生可以在参考前辈作品的基础上自行开发构造编译器,帮助学生融会贯通。
4结论
总之,每一位教师对教学效果的改善、教学质量的提高都是责无旁贷的。建立便于理论联系实际的教学内容和课程体系;理清课程之间的有机衔接,整合本课程与其他课程的知识;抓住各章节重点,捋顺每堂课之间的联系;精心设计实验内容,注意调动学生的积极性,培养学生独立思考和分析解决问题的能力;加强实验结果的监督;增加编译系统课程设计,使学生亲历一个大型系统软件开发的全过程;针对教学内容研制一个编译原理课程教学及实验的平台;在传授知识的同时,加强学生能力的培养,激发学生的学习兴趣和创造精神等探索性的尝试,需在实践中不断丰富、提高。
参考文献:
[1] 陈火旺. 程序设计语言编译原理[M]. 3版. 北京:国防工业出版社,2001.
[2] 蒋立源. 编译原理[M]. 西安:西北工业大学出版社,2005.
[3] 陈意云,张昱,郑启龙. 编译原理的教学与实际相结合的探讨[J]. 教育与现代化,2005(4):32-36.
[4] 何炎祥,伍香春. 现代教学理论指导下的编译原理教学综合改革[J]. 计算机教育,2005(3):10-13.