编译原理课程教学研究

摘要:原有编译原理课程教学在教学内容、教学环节、教学方法等方面存在一定问题。本文尝试从典型案例设计、实验实践教学模式、与其他课程知识相融合、与各类应用相结合、复合型考核方式等方面入手展开教学改革研究,探索该课程新的教学思路与方法。

关键词:实验实践教学模式;阶梯式;项目驱动式;复合型考核方式;大作业

随着编译技术的发展以及课程体系构建的科学化,原有编译原理课程教学在教学内容、教学环节、教学方法等方面存在一定问题,包括内容过于原理化、实验不太合理、实践环节实用性太差、教学方式单一化、与其他课程的知识未进行有效的融合、与各类应用结合不紧密等。本文尝试从典型案例设计、实验实践教学模式、与其他课程知识相融合、与各类应用相结合、复合型考核方式等方面入手展开教学改革研究,以探索该课程新的教学思路与方法。

1典型案例设计

编译原理课程的实践教学可以采用案例驱动方式,设计一个(或多个)综合性案例,贯穿整个课程的始末[1]。例如,以一个综合性的C编译器的设计与实现为例,从词法分析器、语法分析器,再到语义分析器,完成一个完整的编译器构造。

通过编译程序这一具体的案例,学生可以综合理解和运用计算机的程序语言、操作系统和体系结构等各种软硬件知识,形成计算机专业人才特有的系统的专业知识结构。在系统学习编译理论和技术的过程中,学生一方面对科学理论的基础作用有了充分的认识,提高了学习经典理论的兴趣,形成了较高的理论素养;另一方面,通过课程综合性的实践,分析或改进简单或复杂、原型级或产品级的各种编译程序或工具,也可以提高灵活运用理论知识、设计较大规模的软件来解决实际问题的能力。在课程的学习和实践中,学生可以深刻体会到理论学习的意义和动手实践的乐趣。

2实验实践教学模式

以“做中学”为平台,培养具有综合分析问题能力,解决问题能力的应用型创新人才。精选实验内容,采用主流技术,实行在教师指导下以学生为中心的阶梯式实验教学法、项目驱动式“做中学”;按照工程原则,规范地进行实验项目的分析、设计、开发、测试和管理工作,培养学生解决问题的工程能力和素质。

2.1阶梯式实验教学法

在所教的班级实施“阶梯式”的实验教学法后,教学取得较好的效果,在对该方法进行实践、改进、再实践的基础上,提出“多层次-多目标-多效果”教学方法。该方法的中心思想是,针对不同水平的学生设定不同难度的实验题目,不同的实验题目有不同的要求,学生在不同的要求下达到不同的效果,从而激发每个学生的学习兴趣,使每个学生都能通过学习而有所收获,真正达到培养创新型人才的目标。

针对基础较差的学生,以原理验证型实验为主。课程的实验应以理论中的一些经典的算法实现为主,并且举例说明算法的思想和实现技术在一般软件设计中的应用。比如,在有穷自动机的实验中,可以介绍有穷自动机的原理在文本编辑器中应用。这让部分基础本来就差的学生充分明白,编译理论不仅可以用于编译程序中,还可以广泛用于计算机的其它领域,充分调动他们学习编译原理课程的积极性。原理验证型实验内容主要包括数字、标识符和关键字的识别、C语言子集状态转换图的编程实现、简单词法分析器的设计与实现、FIRST集及FOLLOW集的编程实现、LL(1)分析表的构造、SLR(1)冲突解决办法的编程实现、SLR(1)分析表的构造、赋值语句或布尔式的翻译等。实践教学有助于学生熟悉词法分析、语法分析、语义分析的基本原理,使学生对编译过程有一个较直观的认识。

针对基础一般的学生,以设计型实验为主。比如,为一个C语言的子集设计一个真正的词法分析程序、语法分析程序等。选择C语言作为实例语言,是因为:程序设计的教学大都采用C语言;C语言编译器一般都以汇编语言作为目标语言,这便于分析源程序所对应的目标代码;C不是类型安全的语言,很容易出现难以捉摸的错误,编译知识有助于分析这些错误。每个学生完成编译器的前端(或后端),并自行选择完成后端(或前端)的合作伙伴。前端完成词法分析、语法分析、语义检查并生成抽象语法树,而后端由抽象语法树生成x86汇编码,生成的汇编码应能直接用gcc汇编,并连接得到可执行文件,不要求代码优化。

针对基础较好的学生,以综合型实验、(课外)研究创新型实验、企业实践型实验为主。学生设计开发出一个属于自己的“产品”,这有助于提高学生的工程实践能力和应用能力。在这种实验中,注重对学生工程意识、质量意识、团队意识、创新意识和产品意识的培养。

2.2项目驱动式实践教学法

项目驱动式实践教学的一个优势在于多课程协同,以项目为纽带,将多门专业课程的教学关联起来,围绕共同的线索和方向实施教学,以体现课程体系中多课程的协作关系。采用实际的工业项目作为实验平台,引导学生积极参与大型软件开发和维护活动,基于具有工业水准的真实软件进行实践活动,除编译实践之外,对于学生了解行业发展以及软件工程素养的培养也具有很大价值。在教学中,采取下列原则:

1) 统一性原则。以项目为动力,重视学生校内学习与实际工作的一致性,使“教、学、做”为一体,强化学生综合能力的培养,进一步改进考核方式,积极探索实践性能力考核形式。注重校内成绩考核与企业实践考核相结合,并探索主体课堂、辅助课堂与延伸课堂的一体化。

2) 层次性原则。学生综合应用能力和实践能力的提高和发展是一个渐进的过程,实践教学也应分阶段、分层次逐步深化。

3) 完整性原则。实践教学应维护教学计划的完整性和学科专业知识的系统性,不能游离于专业教学之外。

这种教学法深受学生的欢迎,因为有许多实践项目就是学生自己的毕业设计(或论文)的题目,实践的单位就是学生毕业后的工作单位,学生一毕业就能为自己的单位带来经济效益,不需要经过专业培训;另外,学生在未毕业就能亲身体验企业的文化和管理理念,为将来找工作打下基础。

3与其他课程知识相融合

多课程间通过项目发生关联,实施协同教学的课程必须是通过项目能够关联起来的课程。可以将编译原理与软件工程、数据结构与算法、算法设计与分析、软件开发方法、汇编语言程序设计、高级语言程序设计等课程结合在一起。“编译原理”是许多课程的一个综合性的实践,它进一步加深了学生对程序设计语言相关课程中语言基本单位的定义和作用的理解[2]。例如,编译程序使用的一些数据结构和算法是“离散数学”、“数据结构与算法”以及“算法设计与分析”等课程相关知识的典型应用;编译程序对目标代码的存储组织与分配功能的实现又与“操作系统”的相关内容相互渗透;编译程序对中间代码的优化功能的实现则是数学、逻辑学、结构化程序设计和优化理论的综合应用和专门化;如果“编译原理”与“软件工程”课程安排在同一学期,则可考虑将两门课程的实验合并在一起同步进行,即编译原理的综合实验同时也完成了软件工程的课程设计,软件工程课程重点要求工程化的开发步骤与文档,而编译原理课程更注重算法与数据结构的设计。

下面进一步举例说明编译原理课程与其他课程间知识的融合与关联[3]。

1) 考察编译程序的组织与结构,若从软件体系结构层面分析,将词法分析器作为语法分析器独立调用的子程序,则属于层次结构;若从接口关系上存在的直接I/O关系分析,可以认为属于过滤器结构;若从操作系统领域分析,将词法分析器和语法分析器各作为一个独立线程,则对共享程序要解决互斥问题等。

2) 编译理论中对语言的表示和分析,涉及到形式化描述和自动机的概念,自动机的化简是一种数学抽象,可直接利用离散数学中等价划分、商集的基础理论和知识。

3) 编译系统对用程序设计语言编写的源程序进行编译,编译过程中会用到源语言自身的规范和库程序,需要操作系统提供的库程序和接口,以及目标体系结构的相关信息生成可执行的二进制代码。可执行程序由操作系统调度运行,并与下层硬件系统产生密切联系。为此,编译课程所讲授的部分内容需要程序设计语言、操作系统和计算机体系结构等课程内容作为支撑。

4与各类应用相结合

编译原理是一门综合性的课程,本课程的设计,需充分考虑编译理论与实际应用的结合,突出开创性和实用性[3]。编译程序使用的一些原理、方法和技术在非编译系统的实际应用发挥了很大的作用。例如,正则表达式、自动机理论及词法分析器在搜索引擎与信息检索系统、模式识别程序、文本编辑器、数据库查询语言、文件处理语言中都有应用;上下文无关文法和语法制导定义已用于创建诸如排版、绘图系统和语言结构化编辑器;代码优化技术已用于程序验证器和从非结构化程序产生结构化程序的程序检验器等。

随着消费类电子产品的大量开发,嵌入式系统的应用需求也不断增加。在这种情况下,搭建适合的交叉编译环境的工作日益重要,急需掌握编译器构造相关原理、方法和技术的从业人员。此外,随着反病毒领域的不断拓宽,编译技术在其中具有非常广阔的运用空间。因此,编译的原理性研究、学习和实践,可以从多角度提高学生的逻辑思维能力、实践动手能力、编程调试及综合应用能力,有助于切实有效地提高学生的专业素质。

5复合型考核方式

教学评价的标准反映了教学的价值取向。传统的教学评价常常是教学内部的自我完善和自我评价,缺乏社会需求和市场驱动的直接作用。与教学模式的改革相适应,我们必须改革目前僵化的、单一的课程评价与考核方式,积极探索考核方式多样化的改革与创新。以往实践环节的考核过程中存在重结果轻过程、重技术实现轻报告撰写,以及分组实验无法考核到个人等不足。网络教学平台及贯穿本课程的大型案例(项目)的引入,给实验实践环节考核方式的改革带来了新的挑战。

5.1考核环节和评分比重的合理设置

绝大多数实验可考核实验过程、实验结果和实验报告撰写质量等三个环节。实验过程可由教师观察或系统自动记录获得。设置评分比重时,应重视实验报告的撰写,因为如果缺乏准确的描述和有效的总结,实验结果难以得到认可。需改变传统的实验报告模式,不再硬性规定报告的格式和内容,而是要求学生将实验报告以科研论文的形式提交。让学生把在分组讨论时对实验结果进行的分析和自己独特的见解写进报告,避免实验报告“千人一面”的现象。这样还能够培养学生实事求是的科学态度和独立的科研素质。

5.2大作业考核新尝试

在前一步的基础上,对课程实践大作业(项目)的考核环节进行细分,责任到人。采取大作业集中答辩和演示的方式,每组8~10分钟,由授课教师、助教和其他学生针对各个环节提问,以杜绝“一人种树、众人乘凉”现象的发生。答辩时间、答辩形式等具体问题有待在实践中不断改进。大作业的实施一方面完成了课堂知识到个人知识的转化;另一方面为创业型人才所需要的知识基础、心理素质、能力素质提供了一个展示和培养的平台。大作业作为课程学习中的一个重要环节,通过锻炼学生的资料搜集、协作精神、解决综合问题的能力,可以充分发挥学生的主观能动性,自主学习探讨,勇于发现问题,独立分析问题,与他人通力协作,可以增强其独立意识、创新意识、合作意识,锻炼和提高其观察力、思维力、想象力和动手能力等。通过课程大作业,大部分学生能更好地掌握相关的理论与实践知识,提高了学生解决实际问题的能力。通过小组大作业的运作过程,增强了学生对团队协作、独立工作和文献资料收集等工作的认识。

5.3成绩综合评定

根据平时作业、分组实验、课程实践大作业、科研报告、期末闭卷考试成绩等方面的情况,对学生的学习成绩和学习能力给予综合评定。将学生分为3~5人的小组,分组实验和课程实践大作业以小组为单位完成。由于引入阶梯式实验教学法和项目驱动式实践教学法,每组的题目难易程度一般都不一样,可以就每个题目预先给定一个难度系数。科研报告可以是与编译技术相关的学术会议调研,学生利用互联网等资源,搜集与编译技术相关的近三年的国际会议资料,针对某一次会议写出包括研究方向、研究内容和发展趋势评价的调研资料,深入阅读该会议中的某一两篇论文,撰写对论文的阅读评价。

6结语

编译原理课程能够培养学生的计算思维[4],提升学生的系统能力,使学生在系统的级别上重新认识算法和程序;能够培养学生的形式化描述能力;能够激发学生的创新意识、工程意识、质量意识、团队协作意识。因此,该课程对于计算机专业学生来说非常重要。然而,目前编译原理课程的教学不尽人意,我们的教学改革正是针对这些问题,从典型案例设计、实验实践教学模式、与其他课程知识相融合、与各类应用相结合、复合型考核方式等方面入手提出自己的一些想法和思路,供大家借鉴。

参考文献:

[1] 赵曦. 编译原理实验教学改革初探[J]. 实验室科学,2006,8(4):26-27.

[2] Alfred V Aho,Monica S Lam,Ravi Sethi, et al. Compilers: principles, techniques, and tools [M]. 2nd ed. New York: Addison-Wesley,2007:35-50.

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

[4] 王挺,李梦君,周会平. 对编译原理课程教学中计算思维培养的探讨[J]. 计算机教育,2009(21):11-13.

Teaching Research on Compiler Principle

QIAN Zhongsheng

(School of Information Technology, Jiangxi University of Finance & Economics, Nanchang 330013, China)

Abstract: Some issues emerge in teaching content, teaching process and teaching method in traditional teaching way of compiler principle course. This work conducts a teaching innovative research on the course to explore new teaching methods considering the aspects of typical case design, experimental & practical teaching mode, associating with other courses, combining with other applications, and compound evaluation method.

Key words: experimental & practical teaching mode; stepped teaching; project-driven teaching; compound evaluation method; course exercise

(编辑:郭小明)

推荐访问:教学研究 编译 原理 课程