APP下载

编译原理课程教学改革研究

2011-12-31柴艳妹马燕林

计算机教育 2011年20期

  摘要:针对编译原理教学过程中“教难、学难、实践更难”的现状,本文从激发学生兴趣、培养学生专业素质和提高学生动手能力三个方面入手,研究并提出了一系列教学改革的具体步骤和方法。实践证明,这些方法在改善教学质量方面达到了预期的目的。
  关键词:编译原理;思维训练;素质培养;教学实践
  基金项目:中央财经大学‘211工程’三期(CUFEXX2011-3-1);“中财121人才工程青年博士发展基金”项目(QBJGL201005);中央财经大学精品实验课程;中央财经大学科研创新团队支持计划。
  作者简介:柴艳妹,女,讲师,研究方向为图像处理,模式识别;马燕林,女,教授,中央财经大学信息学院副院长,研究方向为信息系统管理。
  
  编译原理是计算机软件及其相关专业的一门主干课和必修课。它系统地向学生讲述了如何利用计算机,实现从程序设计语言到汇编语言和机器语言的自动转换。在利用计算机求解现实世界问题的过程中,通常我们需要先有现实问题的自然语言描述,再经过一次或多次的语言转换,得到问题的形式化描述,再编写程序,并最终编译成可供计算机执行的汇编程序或二进制代码来解决问题。从抽象的角度看,这种问题求解过程就是一个“语言转换”过程。“语言转换”可以看成计算机学科求解现实问题过程的缩影,是计算机专业思维的集中体现。因此,该课程讲授的编写编译器的原理和技术具有非常普遍的意义,是从事计算机工作必不可少的。在计算机从业人员的职业生涯中,这些原理和技术都会反复用到。
  编译原理与其他计算机学科课程关系紧密,其先导课程是汇编语言程序设计、计算机组成原理、数据结构、高级语言程序设计和离散数学等,后继课程有形式语言与自动机、软件工程和计算机体系结构等,是一门理论深度和实践要求并重的课程。
  1编译原理课程教学现状
  编译原理课程由于涉及了数据结构、程序设计语言、离散数学、计算机组成原理等课程知识,具有知
  
  识点多、概念关系复杂、算法抽象难懂等特点,因此,长期以来都被看作是计算机本科教学中“教难、学难、实验更难”的一门课程。造成这种现象的原因主要有以下几点:
  1) 课程理论性强。编译原理这门课内容丰富且抽象,具有严密的逻辑性,除了编译器自身的理论体系外,还涉及了大量其他理论知识,如形式语言、自动机、集合论、图论等知识,这些理论的学习有一定难度,容易使学生感觉课程枯燥、望而生畏。
  2) 学习目标不明确。不少学生认为学习编译原理的目的是为了构造编译器,而目前各大软件公司的编译器已经非常优秀没有必要重复开发。加之这门课程理论性较强,觉得即使学会书本上的理论也未必能开发出复杂的编译器,因此认为这门课程缺乏实用价值。
  3) 实践环节薄弱。由于编译系统的实现涉及到若干其他课程,算法复杂、综合性很强,即使是针对简单文法的编译器设计对于大多数同学来说都存在较大难度,因此会挫伤学生实践的积极性。再加上教学过程中课时数量的限制,实践成为教学中较为薄弱的环节。
  因此,如何提升学习积极性、如何在授课过程中训练和培养学生能力、如何合理安排难易适度的实验内容就显得尤为重要。本文将以现代教育理论为指导,在教学过程中,针对教学模式、教学辅助、思维训练、能力培养、课程实践等环节进行探索和创造性的改革与实践,以期改观本课程的教学效果,从而达到提高教学质量的目的。
  2树立新的教学目标
  “在新时代条件下,培养什么样的人?怎样培养人?”是教育改革要回答的首要问题。作为计算机专业的学生,除了具备必要的知识与信息获取能力、基本学科能力和团队合作能力外,更重要的是具备思维创新能力和工程实现能力。这就要求在本科阶段的教学中能有效训练学生思维、培养他们敏锐地发现问题、正确地分析问题和创造性地解决问题的能力。
  从课程体系结构上来看,编译原理正是这样一门优秀课程。学生在程序设计、数据结构等课程中受到一定的锻炼之后,在该课程中可进一步从系统级别上重新认识算法和程序,能有效提升学生的系统设计能力。此外,该课程中所涉及的形式化理论、词法分析、语法分析等知识是本专业实施计算思维训练的最佳载体之一,可有效训练学生的逻辑抽象思维能力及培养创新性意识。因此,对于编译原理课程的教学目标不能仅定位于编译器设计和实现中的基本概念、基本理论和基本方法的学习。除了理论知识外,更应注重学生的计算思维、程序设计与实现、算法设计与分析、计算机系统的认知、开发和利用等4大专业基本素质的培养[1]。
  3教学改革措施与实践
  在编译原理教学过程中,我们紧紧围绕新的教学目标,从激发学生兴趣、培养学生专业素质和提高学生动手能力三个方面入手,加强学生的素质和能力培养。
  3.1采用多种教学模式,激发学习兴趣
  兴趣是人们力求认识某种事物或爱好某种活动的心理倾向,是推动学生学习活动的内在驱动力。要想让学生学得好,需要不断地激发他们的学习兴趣,从而变被动学习为主动学习[2]。
  1) 启发式教学。
  激发学生学习兴趣的方法之一就是“启发式教学”。孔子曰:“不愤不启,不悱不发”,即教师要对学生严格要求,先让学生积极思考,再进行适时启发。它把学生真正置于主动者位置,充分调动学生的积极性,激发学生的学习兴趣。
  在授课过程中,教师应注重引导学生发现问题。例如,可以提问:“我们平时都是通过编写程序来指挥计算机完成任务的,学过组成原理之后,大家知道计算机只能执行0/1组成的机器指令,而我们编写程序用的则是C、Java之类的高级程序设计语言,它们是如何被执行的?”通过问题,引导学生积极思考,回忆他们从编写代码到执行程序的过程,从而引出编译系统的功能和作用。又例如,可以从英语文章到汉语的翻译过程出发,首先启发学生分析英语翻译的详细过程,并思考高级程序设计语言翻译与英语翻译的关系,再得出“本质上一致”的结论,从而引出编译程序的构造过程[3],并用图示方法进行对比展示(如图1所示)。这种启发式的模式能使学生更自然、自主地接受新知识。
  
  图1高级程序设计语言翻译与英语翻译的关系
  2) 互动式教学。
  现代教育理论认为,教学过程是教与学的双边互动过程。在这个过程中,通过调节师生关系及相互作用,形成和谐的师生互动,生生互动,甚至学习个体与教学中介的互动,以产生教学共振,达到提高教学效果目的[4]。该模式也正符合培养目标的要求,通过让学生分组研讨和查阅资料,教给他们提出问题、分析问题和解决问题的思想和方法,从而增强学生的沟通表达能力和团队合作能力。
  在课程大纲的框架下,合理分配课堂讲授和研讨的学时及内容,适当选择研讨课题。例如,“符号表的组织和管理”一章,可让学生分组调研不同的构造和查找算法,并要求各组派代表在课堂上讲解算法过程、分析计算复杂度以及优缺点比较等。通过任务驱动,可增加学生学习的主动性,进一步激发学习兴趣。通常情况下,选择的研讨课题应当是学生通过自学、讨论和教师的适当指导就可以掌握的,难度不大知识点。难度大的内容仍要按照常规教学方法进行详细讲解。
  3) 形象化教学。
  由于本课程涉及的概念和定理 很多,从词法分
  析、语法分析、语义分析,一直到代码生成,包含了大量的算法。很多算法过程复杂、理论抽象。比如,语法分析中的LR分析过程包含很多步骤,不同的动作(移进、归约、接受等)涉及的数据结构也不同,为了让学生更直观地接受这些内容,必须借助形象化教学手段。CAI(Computer Aided Instruction,计算机辅助教育)通过把文字、数据、图形、音频和视频等不同媒体结合起来,实现对教学内容的合理有效的组织和管理,因其具有形象、生动、直观等特点,可以极大地调动学生的积极性,具有提高教学效果、扩大教学范围和延伸教师功能的作用。
  
  除了使用PPT课件中的动画功能,还可以用Flash、Authorware等技术生动形象地演示抽象的概念和算法。为了加深学生的理解,还可以将类似的算法进行类比和对比,如简单优先分析算法和算符优先分析算法的比较、自上而下分析法和自下而上分析法的比较等,使学生在轻松愉快中掌握知识要点,并进一步深化理解,做到知其然更知其所以然。
  4) 网络辅助教学。
  课堂授课时间通常有限,为了帮助学生课外学习、方便师生交流,可采用网络辅助教学方法。通过建立编译原理课程网站,使学生随时随地在网上利用教学资源进行学习、做练习、模拟考试和答疑服务等,真正实现编译原理课程教学方法和手段的现代化。
  该课程网站的系统结构图如图2所示。学生除了可以下载课堂内容的PPT课件进行自学外,还提供了上传/下载作业、答疑、测试、讨论等服务,并为学生提供教学大纲、教学日历和参考资料等诸多信息,为学生在课堂外的自学、复习提供了丰富的资源。
  
  图2编译原理网络教学资源管理系统结构图
  综合采用多种教学模式,全方位、多角度的教学环境,极大提高了学生学习的主动性,有效激发了学生的学习兴趣,给学生提供了宽广的互动学习空间。
  3.2注重思维能力训练,培养学生专业素质
  “授人以鱼,不如授人以渔”。编译原理课程的教学目标最主要是对学生思维能力的训练,培养学生具备计算机从业人员的专业素养。
  1) 抽象思维的培养。
  抽象思维是思维的高级形式,是利用科学概念和理论,借助符号语言进行思维的方法。抽象思维的主要特点是通过协调运用分析、综合、概括等基本方法,揭示事物的本质和规律性联系[5]。由于大量涉及形式语言和自动机理论,“抽象性”是编译原理课程的一大特点。除了采用CAI辅助教学方法使内容形象化之外,通过实例逐步引申和讲解的方法可以帮助学生掌握具体问题抽象的方法。例如,在引入自动机概念之前,先用日常生活中打电话的例子构造一个简单的自动机,再借助文法的四元组定义形式引申出自动机的五元组形式化定义,从而使学生掌握从具体到抽象的思维过程。
  2) 发散思维的培养。
  思维能力不仅仅是指抽象知识的聚合能力,更重要的是推而广之的发散思维。发散思维又称“多向思维”,是指从一个目标出发,沿着各种不同的途径去思考,探求多种答案的思维方式。发散思维常常是创新的基础,它对新事物比较敏感,具有不依循常规、寻求变异的特点。对学生发散思维的培养就是要培养学生多种方法解决问题的能力。例如,给定一个语言,要求学生写出相应文法的时候,先不给学生答案,让学生把不同的答案写在黑板上,然后逐一进行分析和点评,最后得出结论:语言和它所对应的文法不是一对一的。这样不仅可以加深学生对知识点的印象,并且鼓励学生进行多向思维。
  3) 创新思维的培养。
  创新思维就是不受常规思路的约束,寻求对问题的全新的、独特性的解答和方法的思维过程。逆向思维就是培养创新性的有效方法之一。例如,在讲完自上而下语法分析之后,可以提问学生:“这个过程逆过来是否也可以完成句子的识别呢?如果可以,需要借助怎样的数据结构?如何进行分析?”学生经过思考、分析探讨,再加上适当的指导,得出的结论将会记忆比较深刻,会对自下而上的语法分析方法了解的更深入。
  此外,研究型教学也是培养学生创新能力的方法。选择一些有新意、有一定前瞻性的题目让学生分组研究,例如,让学生充分想象和调研,编译原理算法可以在哪些领域应用?学生发现,在搜索引擎、人工智能、模式识别等领域都有编译算法的应用。这种知识的拓展一方面可以训练他们的创新意识,另一方面还可以让学生认识到学习编译的重要性,从而产生浓厚的兴趣。
  3.3加强教学实践环节,提高学生动手能力
  实践教学是培养学生动手能力和工程实现能力的主要途径。学生只有在不断的实验环节中尝试、探索和研究,才能不断提高解决工程问题的能力。因此,除了训练学生的思维能力和培养创新意识之外,实践能力的培养也至关重要。
  编译原理课程对学生实践能力要求较高,学生在实验过程中除了需要掌握一些重要的算法,还需要将数据结构、高级语言等内容融会贯通。为了消除学生对该课程的“神秘感”和“畏难感”,实验教学中应做好以下几项工作:
  1) 合理安排实验内容。
  实验内容的安排要循序渐进,一开始不要给太难的任务,否则,容易挫伤学生的信心和积极性。例如,在作词法分析器设计实验之前,可以先给出去除源程序中代码注释的实验。然后,依次给出词法分析器实验、语法分析器实验、语义分析和中间代码生成器实验。有了上面的基础,最后给出一个拓展的综合性编译器设计实验。
  2) 给出难度适中的实验要求。
  在给学生布置实验任务的时候,要明确告诉学生实验目的和要达到的要求,即有明确的输入和输出内
  
  容。有些实验,如递归下降子程序法进行语法分析,还需要进一步划分好模块,给出粗略的流程图,以防学生完全没有思路,无从下手。但太过细致的提示又会限制学生的创新思维,因此在布置实验任务前,教师需要根据学生情况反复推敲,给出适宜的难度。
  3) 完善评分机制。
  在以前的教学实践中,经常发生代码雷同和类似的结果,单凭测试结果无法甄别是否存在抄袭现象,对于成绩的评定和考试的公平性有一定的阻碍和影响,也影响到部分学生课程实践的积极性。因此,在实验评价中,除了程序结果测试和实验报告之外,加入了随机答辩环节。随机抽取某段程序,让学生给老师和其他同学讲解其功能、工作过程和设计思想。这样一来,较好地避免了课程实践中经常出现的剽窃程序或偷懒现象,让学生真正做到理论联系实际。
  3结语
  为了改善编译原理课程的教学效果,我们在教学模式、思维训练、专业素质培养以及提高动手能力方面进行了一系列改革,如采用多种教学模式激发学习兴趣、注重思维能力和专业素质以及加强教学实践环节提高动手能力等。这些措施极大地激发了学生的学习兴趣,学生普遍反映编译原理课程没有想象中的难,厌学现象也减少了,对教学质量的提高起到了促进的效果。
  
  参考文献:
  [1] 蒋宗礼.“编译原理”课程与专业能力培养[J]. 计算