软件工程专业中编译原理课程的教学探讨

时间:2022-09-02 05:20:11

软件工程专业中编译原理课程的教学探讨

摘要:结合软件工程专业特点,给出一套切实可行的编译原理课程的教学和实验方案,旨在提高学生的学习兴趣,解决因编译原理课程理论性强,实践困难而产生的现实问题。

关键词:编译原理;软件工程;项目管理

编译原理是软件工程专业的一门重要专业课程,与其他计算机学科关系紧密,其相关技术在很多领域都有广泛的应用,如软件工程、逆向工程、软件再工程等。这门课主要内容是程序设计语言编译程序的构造原理,包括形式语言、有限自动机、自上而下和自下而上的语法分析、LR分析方法、属性文法和语法制导翻译、语义分析和中间代码产生、存储器的动态分配与管理、符号表的组织与管理、优化问题、代码生成等内容。在软件工程专业设置本课程的目的,在于系统地向学生介绍编译系统的结构、工作原理以及编译程序各组成部分的设计原理和实现技术,使学生通过本课程的学习之后,既掌握编译理论和方法的基本知识,也具有设计、实现、分析和移植编译程序等方面的初步能力,为从事计算机软件开发工作及理论研究工作打下坚实的基础[1]。

由于编译原理课程本身逻辑性强、理论性强、理论实现偏难,学生普遍存在畏难情绪,教学效果不理想。本文就编译原理课程教学中的问题,结合软件工程专业的特点,就教学方式展开深入的讨论。

1编译原理课程教学存在的主要问题

1.1学生前期课程学习不足

编译原理课程的先修课程包括程序设计语言、离散数学、汇编语言、数据结构、计算机组成原理等。其中某一门课程的基础没打好,就会影响编译原理课程的学习。

1.2课程本身理论性强

本课程涉及不少理论知识,如形式语言和自动机理论、语法制导的理论等,内容抽象,学生学习与理解有一定的难度,特别是语法制导定义(或翻译方案)的设计。由于课程的理论性太强,难以激发及调动学生学习的兴趣,甚至致使部分学生放弃本门课程的学习[2]。

1.3实践性环节薄弱

编译程序是大型复杂的软件系统,在教学中要把它拆开成各个部分,分阶段地讲解,以便减低学习难度,但这样做常常导致学生不清楚各部分是怎样在整个系统中协调工作的。因此,上机编程时,大部分学生没有思路,无从下手,一部分同学还产生依赖思想,并出现抄袭别人程序的现象。

1.4教学手段单一

传统教学手段主要是以课堂教授为主的“灌输式”教学,很少采用启发式、讨论式教学方法。编译原理理论性强,学生上课时感觉听懂了,但在课后作业和实验环节,学生的表现说明他们没有真正理解。

此外,由于课程本身具有一定的理论深度和难度,而且学生普遍认为学习该课程仅仅是为了构造编译程序,认识不到其在培养科学方法和严谨思维方面的重大潜在价值,学生缺乏学习的积极性[2]。

2具有软件工程专业特色的教学方式

欲改善上述局面,就应结合学生的专业特色,即在软件工程专业教学过程中,把工程化的思想纳入到本课程中来,增加学生对课程目的性的认识,提高学生的积极性。

2.1在思想上提高学生的学习兴趣

为了消除学生对编译原理课程的畏难心理,教师的第一堂课非常重要。在第一堂课的组织中,教师应以引导性为主,比如把“编译”和两门语言间的“笔译”相类比,“解释”和“口译”相类比,这样可以增强学生的理解的记忆。然后,需要强调课程在软件工程专业开设的重要性,避免部分学生对本课程认识不足,投入精力不够。在语言组织上,尽量把复杂的问题简单化,可以添加些有趣的实例,增加学生的兴趣。让学生在第一堂课就减少一些抵触情绪,建立学好编译原理的信心。

2.2教学上采用软件项目开发小组的方式

为了更好地和软件工程专业相融合,在本课程的教学中,建议采用软件项目开发小组的方式。首先对学生进行分组或学生自行组织队伍,一个小组以6~8人为宜,固定一个组长作为项目经理,项目经理的职责是与老师沟通,是小组的领导者、决策者。教学过程中,老师除了教学外,还要承担项目委托方(需方)的角色,管理时多数时间与小组的项目经理沟通。在理论学习过程中,教师对每个章节的内容学习以及课后作业提出要求,各个小组给出解决方案,小组之间竞争,选出最好结果作为中标的供方,以提高学生的学习兴趣。在实验教学过程中,教师负责提出需求,并给出解题思路;小组的项目经理负责给组内成员分配角色,主要包括系统分析员、系统设计员、程序员、质量保证工程师、测试人员等,针对类似算法,要求小组内人员轮流执行不同的职责,保证每个学生都能训练到;实验课结果的提交采用项目答辩的形式,由各个组长和老师组成评审团,进行评审。在课程设计阶段,在小组内不同基础的同学分配不同的职责,以减少困难度,具体操作与实验类似。这种学生组织形式,有利于提升学生之间的团队合作精神,并且能很好地提高学生学习兴趣,团队之间的竞争大大激发学生的学习动力。

2.3理论教学采用实例教学

实例教学的依据是学习的一般规律。对编译原理这种理论性强的课程来说,采用实例教学是一种非常有效的方法[3]。其实际操作方式为:首先,教师通读教材多遍,并做完每章后习题;其次,参考其他同类教材,在此基础上选择在时量和知识影射方面最佳的例子;最后,强调学生自主学习,上课时教师只是快速的“过一遍”相关定义,而不是照本宣科地讲。接下来,课堂上的大多数时间用来讲解实例(这里的实例主要是相关知识点的应用例题,比如分析某个给定文法的二义性),让学生听懂例子、理解例子,学生再实践。最后,教师对课堂内容进行小结,归纳出一般性规律(理论知识),并让学生与前面的定义对比,这有助于其巩固对理论的理解,另外,可以让学生去看前面的定义、定理,这样回过头读这些理论知识要轻松很多、容易很多[3]。实际授课时,建议相关定义采用幻灯片形式,加大知识点的容量;而实例的讲授建议采用板书形式,思路更清晰。

2.4实验课有层次化,主要针对算法

本课程包含很多算法,有LL(1)分析算法和各种LR(1)分析算法、DFA化简算法、计算开始符号集合和后继符号集合的算法、各种数据流方程的迭代求解算法。由于实验课时间不连贯,实现编译器大型软件,只能将其分成几部分进行,鉴于学生理解上有困难,因此,建议实验课主要针对课程中的算法进行。实验组织形式上沿袭软件开发小组的模式,针对不同的学生情况分配任务,比如对于LL(1)分析算法,可以让编程能力强的同学先做开发,其他同学做辅助工作(测试、管理等),并学习相关代码程序;在做类似的LR(1)分析算法时,就转换角色,让前面没有做开发工作的同学参照LL(1)做相应的开发工作。这样就能使每个同学都能深刻理解相关知识点。

2.5课程设计,采用软件项目开发流程

对于连续一周时间的课程设计,做一个编译器是非常好的选择。作为软件工程专业的学生,应该能够以一个项目小组的形式高效地开发一个较大的项目。所以,像编译原理课程中的这种小型编译器,可以作为一个项目来进行开发,不但使学生对编译原理课程有整体上的认识,还能训练学生熟悉软件项目开发流程,增强学生的实践动手能力。原则上,课程设计期间,老师的角色应该是需方,即“客户”,各个项目小组的组长相当于项目经理,组员可适当分配角色和职责,比如系统分析员、开发人员、测试人员等,有时还会出现一人多个职责的情况。采用严格的项目管理流程,老师只具体参与需求分析、项目验收阶段,就能很好的把握学生的情况。通常在课程设计的第一天,教师负责给所有学生讲解需要完成的内容,即提供用户需求,该需求一般是给定一种具体的语言,要求学生完成该语言的词法分析、语法分析、语法制导的翻译和目标代码生成,然后把以上各个部分组合成完整的编译程序。教师应提供用户需求说明书,并和各个小组的项目经理共同商定小组的需求规格说明书。然后每个小组的项目经理负责提供一个项目进度计划,并明确每个小组成员的职责。在具体实践期间,小组的项目经理应每天提交项目跟踪文档,如果小组需要更改进度计划,应由教师同意,并根据项目计划修改流程进行修改。最后课程设计结束时,教师作为需求方参与项目验收,对各个小组进行最终评审,给出小组成绩。验收后小组应总结经验教训,并给出项目总结报告。

上一篇:Fireworks――网页图形图像制作专用工具,好学... 下一篇:独立学院软件技术人才实践教学体系建设