“编译原理”课程教学方法研究与探索

来源 :中国电力教育 | 被引量 : 0次 | 上传用户:yangyang03
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:针对“编译原理”课程教学中存在的内容抽象、算法复杂等问题,分析了现有的一些研究对策,在任务驱动的“编译原理”课程教学方法基础上,结合河南科技大学计算机专业“编译原理”课程教学的实际,讨论了“编译原理”课程理论教学与实验教学的具体实施方案,并探索了实验教学的考核办法,在实际的实施过程中,取得了令教师、学生都比较满意的教学效果。
  关键词:任务驱动;编译原理;教学改革;教学实践
  作者简介:孙士保(1970-),男,河南固始人,河南科技大学电子信息工程学院,副教授,北京航空航天大学计算机学院博士后(北京 100191)。
  (河南 洛阳 471003)
  基金项目:本文系河南科技大学教育教学改革项目(项目编号:2009Y-016)的研究成果。
  中图分类号:G642.41     文献标识码:A     文章编号:1007-0079(2012)01-0069-03
  
  随着信息技术的发展,编译技术已经成为计算机科学中发展最快的分支之一,它体现了计算机技术发展过程中的重要成果。因此,“编译原理”课程是信息类计算机专业的一门专业基础课程,对理论教学和实践教学起着奠基的作用。通过学习编译知识,有助于学生从宏观上把握编程语言;编译技术涉及到计算机的系统结构、指令集结构以及相关的操作系统,掌握编译技术有助于更进一步地理解计算机系统;从软件工程的角度来看,编译器是一个很好的系统软件,它所涉及的算法和技术可直接复用于软件开发的实践中。如正规式和自动机理论在字符串检索中的应用,以及用文法的方法来定义网络协议等,另外,编译技术在软件系统安全、现有程序理解和软件工程中的逆向工程等方面应用广泛。
  一、“编译原理”课程教学过程中存在的问题及相应解决办法的探索
  “编译原理”课程是理论性和实践性的统一体,其中更倾向于实践。在该门课程的学习过程中涉及到大量抽象的思想和复杂的算法,学生往往难于理解,因此“编译原理”课程是计算机科学与技术专业本科教学中较难的课程之一。原因如下:(1)该门课程涉及的理论知识抽象、深奥,如自动机理论,学生若想完全理解这些知识需要查阅很多相关的文献,这为学生学习增加很多负担。(2)该门课程涉及的一些算法复杂,如自下而上的分析算法LR(k)、向前看的自下而上分析算法LALR(k)等。这些算法计算复杂,涉及内容多,学生掌握它们困难。(3)编译程序是一个系统软件,各个模块之间的接口复杂,学生们往往不能从整体上来理解编译程序。
  针对以上种种情况,国内高校中教授“编译原理”课程的教师们从不同角度进行了探索。如文献[1]给出了“编译原理”课程和内容分解的建议;文献[2]设计了“编译原理”课程实践教学的方法;文献[3]介绍的对策可以提高学生学习“编译原理”课程的兴趣;文献[4]对大学生应掌握的编译知识进行了归纳。这些成果对于“编译原理”课程理论或实践教学起到了极大的推动作用,但它们还是采用传统教学模式,即先讲授理论知识,再进行实验验证。为了改变这种教学模式,提高学生学习的积极性和主动性,并把学习编译知识与开发编译器的实践结合起来,文献[5]介绍了河南科技大学从2007级计算机科学与技术专业部分学生中开始采用任务驱动的学习方法。在文献[5]中对实验项目的设计、教学计划的制定、辅导材料的编写、网络资源信息平台的构建、教学资料的开发等进行了探讨。本文在文献[5]的基础上对“编译原理”课程的理论教学和实践教学的具体实施方案进行讨论,以强化任务驱动教学过程中边实践边学习的教学方案,提高“编译原理”的教学效果。
  二、“编译原理”课程教学方法研究与探索
  1.提高学生学习的兴趣
  “编译原理”课程是一门实践性较强的课程,任务驱动的学习方法将以前重理论的教学模式转为重实践的教学模式,通过完成“编译原理”课程中的每一个具体实验反过来再进行书本上理论知识的学习,真正实现学以致用,理论与实践相结合的教学理念,并实现从难懂的理性知识向直观的感性知识的转变。这将极大地调动学生学习的积极性,全面提高学生学习的兴趣。这样学生学习该课程中的原理除了可以用于分析编译器以外,还对诸如“系统结构”、“人工智能”、“并行处理技术”等课程的学习具有指导作用,并且可以更进一步地帮助学生理解和综合应用“离散数学”、“高级语言”、“数据结构”、“汇编语言”等专业基础课程中的知识。
  2.合理安排任务驱动的“编译原理”课程教学内容
  在河南科技大学教改项目:任务驱动的“编译原理”教学方法研究中,我们根据教学大纲的安排,把源语言编译的工作原理与方法融入一个类C编译器的开发过程当中,根据开发中的需求来驱驶学生学习书本上的编译知识,具体方法安排如下:
  (1)根据教学大纲合理设计实验项目。
  编译器是一个大的系统软件,学习它主要是掌握编译的方法,所以在设计实验项目时要从整体上来把握它,而不拘泥于某一个实验的细节。对于编译过程中的每一个阶段可以设计一个或多个实验项目,具体每一个项目如何实现不作具体要求。例如,对于语法设计部分是采用自上而下分析还是自下而上分析学生可以自由选择。但实验项目的内容要包括必须掌握的编译知识,还可以设计一些较难的项目留给成绩优异的学生在课后完成,以扩展他们的知识。
  (2)制定分阶式教学内容。
  为了让学生们能够熟练地掌握任务驱动的“编译原理”课程教学内容,并理解编译过程的工作原理和构造方法,我们把书本相关内容按基本要求和高级要求进行分类,全体学生必须完成基本要求的内容,部分优秀学生可以试探完成高级要求的内容。
  “编译原理”课程中学生必须完成基本要求的内容包括:文法和语言部分知识点包括文法、推导/归约、句型、句子、语言;词法分析部分知识点包括状态转换图、正规集、正规表达式、有穷自动机(DFA、NFA)的表示方法及相互转换;语法分析部分知识点包括递归子程序法、LL(1)分析法、LR分析法中的SLR(1)和LR(1)的构建方法;语法制导翻译和中间代码生成部分知识点包括四种常见的中间代码:逆波兰式、四元式、三元式、三地址码;符号表部分知识点包括符号表的组织方式;目标程序运行时的存储组织部分知识点包括静态分配策略;代码优化部分知识点包括局部优化达到全局优化的目的;代码生成部分知识点包括目标代码生成算法。部分优秀学生可以试探完成高级要求的内容包括:文法和语言部分包括规范推导、规范归约、句柄、上下文无关文法、语法树、二义性;词法分析部分包括正规文法、正规式向有穷自动机(DFA、NFA)的转换;语法分析部分包括算符优先分析法和优先函数、LR分析法的LALR(1)的构建方法;语法制导翻译和中间代码生成部分包括常见的语法成分的翻译;符号表部分包括符号表的查找算法;目标程序运行时的存储组织部分包括动态栈式分配策略;代码优化部分包括循环优化以达到全局优化的目的。
  (3)适时编写该课程的辅导材料和构建相应的网络资源信息平台。
  课后作业是对书本知识的巩固与复习,为了帮助学生更好地掌握编译知识,我们针对书本重点和难点编写了一套学习指导,并给出了相应的习题解析。
  任务驱动的“编译原理”课程教学研究从2008年开始,并在河南科技大学电子信息工程学院2007级计算机科学与技术专业学生开始实施。“编译原理”重点建设课程网站于2009年3月建立,全部电子教案、教学大纲、教学计划、课程知识体系、考研试题库和学习辅导材料在网站建立后就发布到了网站上,学生可以在网上随时下载这些资料,并可以在交流区与老师或同学交流学习中遇到的问题或分享各种经验与乐趣;该门课程的评价体系采用网上测评和河南科技大学教务处网站上学生评教的方式进行,让教师随时掌握学生对该课程的意见和建议,并及时调整教学进度或方法;友情链接可以链接到国内一些学校“编译原理“精品课程网站,实现该课程资源共享,为学生课后复习及深入研究提供了丰富的资源。为了在学生中尽快实施任务驱动的“编译原理”课程改革成果,2009年9月河南科技大学计算机专业大三学生开始试行该方案,通过实验项目的实施与相关理论知识的讲授,与此同时,找出部分优秀学生,让他们参与实验项目设计、实施和评价的全过程,并多方听取学生的意见,逐步改进该方法的不足之处,该方法越来越趋于完善。
  3.灵活运用现代化的教学手段
  “编译原理”课程算法和图形多,其中算法步骤复杂而且抽象,因此要想让绝大多数学生掌握编译知识,必须借助现代化的教学手段,使抽象的理论知识感性化,感性知识娱乐化,让学生在玩中学、乐中学。因此我们编制了一套把难懂的编译知识融于动画效果的多媒体课件,它可以把抽象的算法和理论知识用生动的动画形式表示出来,在讲课的过程中配合板书,细化教学内容,提高教学效果。课后向学生推荐目前全国著名高校“编译原理”精品课程网站,如中山大学“编译原理”精品课程网站,网站上有一些实验教学项目和具体实施方案,我们可以借鉴它们的方案来调整自己的实验项目及实施方案。充分利用校园网等网络资源,积极开展网上辅导,定时在网上与学生交流,通过邮件等形式为学生解答学习过程中的各种疑难问题。总之,学校可以根据现有的技术条件为学生学习“编译原理”提供全方位的帮助。
  三、“编译原理”课程实践教学方法研究与探索
  任务驱动的“编译原理”课程教学研究以实践为主导,实验效果的好坏直接关系着研究项目的成败,也直接体现了计算机科学与技术专业教学大纲的优劣,这种思想适应现代工程技术型专业教学的需要。因此我们首先提出任务,设计实验项目;然后讲授相关理论知识;最后通过实验验证,经过两年多的实践证明该方法教学效果良好。但该项研究在实施的过程中也遇到了新的问题:有些学生很快完成任务,有些学生完不成任务。针对这种情况,我们提出多层次、多目标的思想,即确定全体学生必须完成的基础任务,然后再设定扩展任务,扩展任务分多个等级,难度各不相同,要求也不相同,学生可以按照自己的能力完成不同等级的任务,由于最后效果不同,所以成绩也有区别。以下从任务驱动的“编译原理”课程实验项目准备、实验项目实施、实验过程监督与评价三个阶段讲述多层次、多目标的“编译原理”实践课程教学全过程。
  1.任务驱动的“编译原理”课程实验项目准备
  河南科技大学计算机科学与技术专业的“编译原理”课程是在本科三年级第一学期开设的,学生们在二年级已经完成“高级语言程序设计”、“数据结构”、“算法设计与分析”等课程的学习,他们已经具备基本的编程能力。任务驱动的“编译原理”课程是为了向学生系统讲授编译知识、并培养学生开发较大规模软件的能力。为保证实验课的顺利开展和学生水平的稳步提高,我们在“编译原理”课程开设之前,让学生在以下两个方面做好准备:
  (1)熟练掌握高级程序设计语言编程技术。
  提高高级程序设计语言编程能力是一个系统工程,它需要在一定的时间范围内持续地培养,河南科技大学计算机科学与技术专业学生在学习“高级语言程序设计”后有两周时间的“程序设计课程设计”,该课程主要是让学生完成一些简单的程序,如:多功能计算器、文件移位加密与解密、本班同学通讯录、万年历系统、图书管理系统、一个课题随机选题程序的设计等;学生学习过“数据结构”后同样有两周的“数据结构课程设计”,该课程让学生们完成难度较大的程序,如:运动会分数统计、飞机订票系统、简易文本编辑器、校园导航、数制转换问题等;学生学习过“算法设计与分析”后也有两周的“软件专题训练”,该课程让学生在一定的编程基础上完成中等难度的算法设计问题,如:马的Hamilton周游路线问题、罗密欧与朱丽叶的迷宫问题、独立钻石跳棋问题、n2-1谜问题等。通过这些课程设计的训练,学生们已经熟练掌握了文件操作、指针操作、数组的使用、结构体与共用体的设计与使用等高级程序设计语言编程技术。
  (2)软件工程开发方法训练。
  河南科技大学计算机科学与技术专业学生学习“软件工程”课程是在本科三年级第二学期,因此学生此时还没有系统掌握软件工程的思想。但我们在学生进行的各种课程设计过程中要求他们逐步掌握分析、设计、编码、测试、评价等思想,并运用到每一个具体编程任务中去,经过两年的训练,绝大多数学生掌握了这样的软件工程开发方法,从而改掉了以往教学中拿到题目就动手编程的坏毛病,为今后的各种程序开发提供了技术路线保障。
  2.任务驱动的“编译原理”课程实验项目实施
  基于任务驱动的“编译原理”课程实验的主要目的是为了让学生自已开发一个类C语言的源程序编译器,该编译器能够完成基本的词法分析、语法分析、语义分析与中间代码生成和代码优化等功能,从而起到锻炼学生的作用。
  在任务驱动的“编译原理”课程实验的实施过程中,考虑到目前编程语言非常多,其中C语言学生比较熟悉,因此我们以C语言源程序编译器为依据来进行模仿开发。但由于C语言功能强大,涉及内容太多,短时间内不易完成,所以我们依据C语言的缩小版本,即类C语言。类C语言的数据定义方式、语法、程序结构与C语言及其变种C++语言相似,只是不含嵌套、递归和面向对象等特性。
  编译器的开发是一个系统工程,它涉及到编译的各个方面,对于部分基础一般的学生来说完成一个简单的编译器开发是合适的,但对于部分优秀学生来说只完成编译器这些基本功能起不到锻炼的作用。针对目前学生人数多,学生水平参差不齐的特点,我们采用多层次、多目标的教学方法。首先要求全体学生必须完成类C语言编译器的开发,对于部分优秀学生可以在类C语言编译器的基础上增加嵌套、递归和面向对象等特性。这样就把实验任务分为基础目标、扩展目标两个层次,学生可以根据自己的能力、兴趣与爱好选做不同层次的题目,从而达到分段培养、分段锻炼的目的。这样无论对于优秀学生还是普通学生,同样都能起到很好的锻炼作用。
  以前我们的实验课内容主要为了验证相关理论知识,而任务驱动的“编译原理”实验目的是为了解决实际工程问题。这样就要求学生在确定了实验内容后,去学习相关的编译理论知识,变被动学习为主动学习。对于编译器这样的系统程序开发必须遵循软件工程的方法,才能保证开发出的编译器程序具有高的质量和好的可维护性。为了顺利完成开发任务,我们采取的措施是:学生可以单独完成,也可以由3~4名学生组成的小组协作完成。在分组时,特别强调组内每个成员任务明确,编程时统一命名机制,统一接口标准等。每人在确定了开发任务后,开发时必须遵循需求分析、系统设计、编程实现、模块测试与集成测试等标准的软件开发过程中的各种规范,还要求他们在每个阶段详细给出对应的文档,并对每个阶段出现的问题及解决方案给出明确的说明,为他们日后检查程序提供必要的技术文档。
  3.任务驱动的“编译原理”课程实验项目监督
  现在的大学实验课,绝大多数学生能够按照教师的要求完成,但也有部分学生,他们依赖性强,自觉性差,在学习过程中不够刻苦,实验时不愿意多动手,这样很难达到课程实验的要求。如何让自觉性好的学生水平更上一层楼,让自觉性差的学生提高认识,自觉完成实验,是教师必须解决的问题。为了正确引导并督促学生完成各项任务,在实践教学过程中,实验过程的监督是必要的。
  任何一个语言的编译程序都存在代码较长、无法当堂测试的问题。采用多层次、多目标的教学方法后,我们采取分散考核的方法,即学生随时完成任务随时提出考核要求,全部任务考核完成再进行成绩汇总。由于确定任务时分为基础任务和扩展任务,所以学生完成不同的任务,考核的成绩也不相同,成绩良好的学生可以提出优秀申请,我们采用公开答辩的方式进行优秀评定。这样在答辩的过程中,等于他把自己如何分析、如何设计、如何实现的全部过程以及他的创新点向全体学生进行了一次公开说明,这对他本人和别的学生都是一个非常好的形式。对于部分基础弱的学生,我们可以在该门课程结束前进行考核,这样让他有更多的时间来完成他的任务,从而更好地达到课程实验的目的。
  四、结束语
  任务驱动的“编译原理”课程教学方法研究与探索是以课程实践教学为主线,靠不同的实验来带动各章理论知识的学习,这种研究是探索性的,也是开拓性的,学生变被动学习为主动学习,2009年、2010年、2011年已在河南科技大学计算机专业“编译原理”课程教学中实施该教学方法。在实施过程中绝大多数学生表现出极高的热情,并有部分学生参与了该项目的研究工作,项目获得了成功。但在项目实施的过程中也发现了一些问题,主要表现为:(1)本次研究的基础任务中以结构化程序设计语言为主,在扩展任务中包含了面向对象的内容,但绝大多数学生没有完成;(2)在语义分析与代码优化部分有的学生完成不全面;(3)在优秀评定时,申请答辩的学生不多,一方面是时间有限,另一方面学生不积极;(4)考核过程中当一组有3~4名学生时,存在1人完成多人共享的情况。虽说存在问题,但总的来说学生通过该次实验学习的主动性明显提高、教学效果良好。
  目前项目组成员已经在研究报告的基础上整理出一本实践性非常强的“编译原理”内部资料,准备进一步完善后出版,为以后的教学与改革提供理论及实践支持。
  
  参考文献:
  [1]何炎祥,伍春香.计算机专业不需要开设编译原理课程吗?[J].计算机教育,2009,(4):61-62,85.
  [2]张昱,陈意云.编译原理课程实践改革探索[J].计算机教育,2008,(8):24-26.
  [3]李冬梅,施海虎.“编译原理”课程的教学研究与探索[J].计算机教育,2008,(8):103-105.
  [4]张昱,陈意云,郭宇,等.“编译原理”课程的教学内容选择的探讨[J].计算机教育,2009,(18):143-146.
  [5]张海朝,孙士保,张芳芳.任务驱动的编译原理课程教学方案研究[J].计算机教育,2010,(10):100-103.
  (责任编辑:孙晴)
其他文献
摘要:文章结合江苏省中小企业应用软件工程技术研究开发中心教学资源库建设项目,对“C#程序设计”课程设计到教学都进行了改革,并对配套的教学资源库建设的思路、理念、内容和要点进行了探讨。  关键词:C#程序设计;教学;资源库建设  作者简介:管小卫(1981-),男,江苏南通人,江苏财经职业技术学院,讲师。(江苏淮安223003)  基金项目:本文系江苏省中小企业应用软件工程技术研究开发中心公共服务平