“编译技术”实践环节的质量管理体系及实践

时间:2022-10-03 06:14:17

“编译技术”实践环节的质量管理体系及实践

摘 要:“编译技术”作为一门核心专业必修课,其实践环节对本科学生培养动手能力有重要作用。但在教学过程中,笔者发现对于这种软件类课程的实践环节而言,通常的题目设置和考核方案并不能真正确保学生独立完成、学有所获,在过程中加强监督和控制才是有效的办法。本文给出在教学实践中采用的质量管理体系,并通过两年来的应用情况分析了该体系的效果。

关键词:编译技术;实践环节;质量管理体系

中图分类号:G642 文献标识码:B

1 引言

“编译器的原理和技术具有十分普遍的意义,在每一个计算机科学家的研究生涯中,这些原理和技术都会反复用到”。为了让学生了解“编译技术”这个推动了计算机学科发展的重要研究领域,北京航空航天大学计算机学院将“编译技术”课程作为一门核心专业必修课。这门课不仅要求学生掌握有关编译的经典基础理论,还要其学会运用先进的软件开发技术构造实际编译系统的方法,是一门理论和实践要求都很高的课程,是学生在本科学习阶段培养动手能力的一个非常重要的环节,在教学中具有重要地位。

在教学中,“编译技术”课分为两个部分:理论部分和实践环节(课程设计)。学生学习了编译程序的基本概念、原理、方法和技术之后,要完成一个小型语言的编译系统。在教材[2]中,提供了由国际著名计算机科学家N.Wirth编写的“PL/0语言编译程序”和“Pascal-S编译系统”这两个经典教学编译系统实例作为参考,目的是通过对编译系统实例“小麻雀”的剖析,使学生较快地对一个高级语言编译的全过程建立起完整的概念。

但是在实践环节的教学过程中,笔者发现,虽然编译系统的构造在理论上已形成完整的体系,实现技术也相当完善,但要使学生从学习基本理论、理解原理、掌握编译器的构造技术到实现一个完整的编译系统却是十分困难的,是一门公认的难教难学的课程。对于一些学生来说,难度太大导致的后果就是完全放弃自己的努力,转而向其他学生寻求“舶来品”。另外,课程设计的题目大都是基于PL/0和Pascal-S两个教学编译系统的,这两个系统的源代码是完成课程设计的基础,因此,即便是自己独立完成的作业,在源代码上也有一些相似性,从源代码相似性的角度来甄别两份作业是否抄袭未免有些偏颇。这种现象在其他软件类课程的实践环节中也是类似的。笔者认为,要让学生在这类课程的实践环节中真正做到独立完成、学有所获,在题目的设置上不能“一概而论”,既要满足基本的教学要求,又要考虑各种不同程度学生的实际情况;同时,不能仅对最终提交的作业进行考量,还需要在实践环节的整个过程进行质量监控,才能达到预期的目的和效果。

从2005年开始,笔者在教学过程中设计了一套用于保证实践环节质量的管理体系,让学生在完成课程设计的过程中,自始至终受到督促和监控,帮助并促使学生在实践环节中真正独立完成。下面对质量管理体系及两年来的实践效果进行介绍。

2 质量管理体系

在“编译技术”课程的实践环节中,从布置题目到提交作业的时间跨度通常有3个月。为了让学生在这段时间内有计划、按步骤、保质量地完成作业,笔者从题目设置、题目分配和考核方案等方面考虑,多方位、多角度促进学生提高作业的质量。这套办法,本文称之为质量管理体系,如图1所示。

(1) 题目设置

设置不同难度的题目,让学生按需选取。为了避免因题目难度过大而让学生放弃自己的努力,将题目设计为五个不同的难度等级,每个等级有不同的难度系数(即最高分数),让学生根据自身的情况进行选取。在“编译技术”课程设计中,题目的总体要求为实现一个小型语言的编译器,难度的不同主要在于文法和生成的目标代码的不同。

(2) 题目分配

随机分配文法。同一难度的题目有多个不同的文法,这些文法是语法成分有所不同的类Pascal、类C语言的文法。借助于教学辅助平台,学生能够在选取难度等级后,获得一个随机分配的文法。

(3) 考核方案

区别于通常只对学生提交的最终作业进行考核,本质量管理体系中,在四个不同时间设置了考核点,规定了每次考核的内容和方式。

① 对教学示例系统的源代码阅读情况进行考核。教材上提供的PL/0、Pascal-S编译系统的源代码是学生完成课程设计的主要参考资料,对它们的深入理解和分析是学生完成课程设计的重要基础。这部分内容是让学生自学,为了不让自学的要求流于形式,本体系对此环节采用面试的方式进行考核,师生一对一让学生回答与示例系统源代码有关的问题。

② 要求学生提交详细设计文档,进行中期检查。为了让学生的课程设计有规划、有进展地进行,本体系要求学生在课程设计的中期提交详细设计文档作为考核内容。

③ 最终成果进行现场考核。当学生在完成课程设计后,通过教学辅助平台提交包括源代码、可执行文件和文档的最终成果。教师安排统一的时间对每个学生逐一进行现场考核,具体方案如下:

 在指定的计算机上编译、运行、演示自己的作业(用自备的测试程序),并回答老师提出的问题;

 用老师指定的测试程序对作业进行检测,并对运行的结果进行解释;

 对测试程序进行修改,以获得老师要求运行结果(含出错信息)。

④ 组织申优答辩。对于申优(即希望成绩在90分以上)的学生,除了要求选择难度等级为“高”的题目外,还要在通过了现场考核之后,进行10~15分钟的申优答辩。

(4) 文档规范化

让学生按软件工程的要求完成课程设计,在开发过程中形成规范的文档。在教学平台上给学生提供了文档模板,教师对学生提交的文档逐一进行检查。

(5) 评分精细化

制定了精细的评分规则。每次考核有若干考核项,每个考核项有相应的评分标准。评分规则在布置作业时就公布给学生,让学生有明确的努力方向。在每次考核时,记录下各个考核项得到的分数,最终借助Excel表的公式计算出一个总成绩。

3 实践效果分析

通过对上述质量管理体系的应用,笔者发现,在教学中产生的作用是显著的:

(1) 设置不同难度的题目,有助于对学生因材施教。在这样的安排下,即便是程度稍差的学生也能够完成一个完整的编译程序,让他们对编译系统从理论到实践都有明确、直观的认识。而对于学有余力的优秀学生,鼓励他们对文法进行扩充或自选题目,将编译原理应用到实际遇到的问题中,这样极大地调动了他们的积极性和主动性,也培养和发扬了创新精神。

(2) 对于同一难度的题目,借助于教学辅助平台随机分配文法,这能够有效地杜绝学生的抄袭。文法之间差别不大,但却各不相同,学生必须踏踏实实地按自己获得的文法构造编译程序,才能顺序通过检测。从别人那里拿过来的程序一经测试程序检测,立即会“露馅”。

(3) 通过考核的方式确保学生对教学示例系统的源代码进行阅读,不仅有利于让学生深入了解编译程序的组织结构和构造方法,也让学生对课程设计题目的难度有更准确的认识,让学生有勇气选择难度更大的题目。在教学中的安排是让学生阅读完源代码并进行考核之后,再让他们通过教学辅助平台进行选题。从2003级和2004级两届学生的选题情况可以看出,选择难度较大的学生的比例在大幅度增加,如图2所示。

(4) 笔者在以前的教学过程中发现,很多学生完成作业的时限取决于交作业的最后期限。在前面有充足的时间时,拖拖拉拉,漫不经心,而发现截止日期快到时,才匆匆忙忙,加班加点。这样造成的后果是学生并没有充分利用时间进行仔细钻研,而在最后草草了事,甚至在没有时间自己解决问题的情况下,拷贝别人的程序来应付。要求提交作为中期检查内容的详细设计文档之后,笔者发现这种方式确实能够有效地敦促学生有计划、按步骤地完成作业。

(5) 进行最终作业的逐一现场考核能够让这类实践课程存在一个正规的考试环节,相比教师单独评判作业给出一个分数更能给学生造成紧迫感和压力,让他们在完成作业的过程中认真对待。同时,一对一的现场交流能够让学生有更多的机会展示的成果,如果出现一些小小的失误还可以在现场进行调试,既确保了学生的利益,也能调动起学生的主动性。

(6) 申优答辩是在现场考核之后进行的,提出申请的学生只有通过了现场考核才有资格参加申优答辩。答辩以一种严格规范的方式进行,要求学生准备10~15分钟的演示文件,评委由课程组的几位老师担任。根据学生报告及回答问题的情况,老师给出自己的分数,各个分数综合起来得到该生的申优答辩成绩。申优答辩环节除了让学生更充分地展示自己的成果外,还能培养学生的口头表达能力和沟通能力,为今后的各种报告、答辩打下基础。

(7) 按照工程化的方法完成软件的开发是计算机专业的学生应有的技能和素质。“编译技术”的课程设计作为本科学生要完成的第一个较大规模的编程作业,在工程化思想和方法的培养中起着重要的作用。这个环节也是学生在学习了“软件工程”课程后的一次真正的实践。

(8) 精细化的评分方式能够让学生的成绩更客观、公正。在上述各个阶段,教师根据各次考核的情况给学生若干项具体的分数,并且大多数时候都是在考核现场直接给出的,这比以前由教师根据学生的作业单独进行评判更公开、透明。同时,精细的分数计算公式也让学生感受到工程技术领域的严谨和规范,有助于培养他们诚信、公正的品质。

4 结语

本文提出的质量管理体系已经在“编译技术”课程设计中成功应用了两年,并正在当前的课程设计中继续应用。在这套质量管理体系的管理、监控之下,绝大多数学生都能按要求完成作业并收到应有效果。即便是最高难度的题目,也有不少学生能顺利完成,2003级有36人申优,32人获优,2004级有21人申优,18人获优。学生对这种严格的过程质量管理是理解并赞同的。在课程设计提交的内容中,有“总结感想”一项,要求学生对完成“编译技术”课程设计的情况进行总结,以此了解学生的意见和建议。从学生反馈的情况看,按照教学的要求完成课程设计后,他们均感到受益匪浅。

下面就摘录几个学生的总结片段作为本文的结束语:

“通过c0编译器的实现,让我得到了很大的锻炼,不仅是技术能力方面的提高,更重要的是在自己的心态方面,只要自己努力了,就一定能够取得一定的成绩,也许不能成功,但至少努力了,不会遗憾。”(34060518)

“通过编写编译器,也使我明白了许多做项目的方法。在实际的项目中,会发生各种各样的情况,因此需要有较好的处理异常的功能,就像编译器中的错误处理一样,不能一遇到错误就死掉。”(34060824)

“我希望这门课的老师们能继续坚持这样的作风,毕竟现在真正认认真真地检查课程设计的科目是越来越少了,所以我很欣赏你们!希望我们的师弟师妹们能继续‘被迫’这样认真地完成课程设计,因为这将是对他们大有好处的!:)”(34060328 )

“这个编译器是自己读计算机专业以来,第一个独立实现的稍具规模的项目,虽然不敢说自己为之自豪,但确实有种成就感,对自己的专业学习也有了信心。那句话真的说得不错‘世上无难事,只怕有心人’,只要肯付出,肯努力学习,不管什么都能学会。

最后,很感谢老师给我这个自己锻炼的机会,也很感谢老师的敦促,说实话如果没有老师的敦促,我说不定会让这个大好的机会溜掉。”(34060707)

参考文献:

[1] Alfred V. Aho, Ravi Sethi, Jeffrey D.Ullman. 编译原理[M]. 李建中,姜守旭,译. 北京:机械工业出版社,2003.

[2]高仲仪,金茂忠. 编译原理及编译程序构造[M]. 北京:北京航空航天大学出版社,2001.

上一篇:操作系统实验设计 下一篇:复旦大学计算机科学技术学院