摘要:编译原理作为计算机专业重要的专业必修课程,对高校软件人才的培养具有重要意义。文中针对编译原理课程目前在教学上存在的问题,提出了针对一般本科院校学生在该课程教学方法改革方面的一些思路和措施,如合理选择教学内容、类比教学、启发式教学、实践教学、培养师资、校企合作等。实践表明,这些教学策略的实施,对编译原理课程的教学工作将起到积极的推动作用。
关键词: 编译原理;教学改革;教学方法;教学理论;教学实践
中图分类号:G642 文献标识码:A 文章编号:1009-3044(2013)07-1587-04
编译原理课程是计算机科学与技术专业学生的专业骨干课之一,同时也是计算机系统软件中非常重要的一个分支。该课程的主要内容是编译程序的基本原理、方法和实现技术,通过这些知识的学习将使学生具备设计、实现和维护编译系统大型系统软件的知识和能力,并在系统级上再认识程序和算法,提升其计算机问题求解的水平,增强其系统能力;同时,它还是关联很多计算机课程的纽带,通过学习“编译原理”的基本概念、基本理论、基本方法,可以加强学生对高级程序设计语言、数据结构、操作系统、计算机组成原理、软件工程、计算机体系结构等课程知识的综合理解和应用;此外,和编译器相关的模型、理论和算法并不只是关于编译器开发的,编译技术在当前已经广泛应用于编译器构造之外的其他领域,比如程序分析/验证、网络信息处理、网络协议的分析与实现、模型转换、自然语言语言处理等领域。通过该课程的学习,还可以拓宽学生的知识面,对学生未来的研发生涯产生有益影响,从上可见,学习好编译技术对于促进学生软件开发能力、问题求解能力的提高和抽象、形式化的计算机科学思维的培养具有重要价值。
但是,编译程序是一个庞大和复杂的系统软件。它所包含的算法和思想理论性强且抽象度高,计算机专业学生普遍反映,编译原理课程是一门比较难于理解和掌握的课程。如何让这门课程的教学效果达到令人满意的程度,是《编译原理》教师普遍关注的问题。该文通过分析目前《编译原理》教学过程中存在的问题,对《编译原理》课程教学改革提出了一些新的方法和见解。
1 “编译原理”课程教学现状
《编译原理》课程在目前教学中出现的主要问题有:
1) 课程内容抽象难懂,采用传统的灌输式的授课方式,教学手段单一,无法激发学生学习兴趣。编译原理课程中的概念和算法大都以符号、自动机、上下文无关文法、属性文法等抽象程度较高的复杂形式描述,教材内容显得比较枯燥。如果教师在教学中又以传统的灌输式教学为主,那么因为理论知识较抽象,在整个的教学过程中学生被动地接受知识,教师很少考虑学生的需要和态度,就会让学生觉得授课内容枯燥乏味,学习缺乏主动性,影响教学效果,造成理解难度大和教学难度大的情况。
2) 学生觉得编译技术在一般的软件开发中应用不多,学习积极性不高,难以让学生对这门课程的学习形成主动性。编译原理这门课包含许多理论知识和算法,这些理论的学习和理解都存在着一定的难度。同时,学生感觉教材中理论知识很难又不实用,所以学习积极性不高。但是和数据结构课程做比较,数据结构课程的很多内容也比较复杂和抽象,但是学生的学习积极性明显很高,看来内容的抽象并不是造成这门课程难讲、难学的唯一原因,造成这种现象的还有一个重要因素是,课程内容实用性的广度不同。数据结构课程中的很多内容如:栈、队列、图、排序和查找算法,学生在一般的软件开发中都会经常用到,即使用频率很高,学生觉得有必要学习即使课程内容难,学习积极性高,自然老师也容易教,也愿意教,学生也愿意学,教学效果就自然好。而编译原理中的很多技术,比如形式语言理论,LL和LR语法分析算法,属性文法,代码优化技术等,学生觉得这些技术只有在翻译器的开发中用到,而自己一般也不会从事这方面的软件开发,加上这些技术的理解难度和上机转换成程序的难度明显比先前学过的课程难度大,所以学习主动性不高。
3) 先修课程知识掌握不牢,增加学习本课程的难度。编译原理课程一般是在大三开设,它的先修课程在大一和大二学习,如果学生在之前的课程学得知识不太好,那么对这门课程的学习过程中就会觉得难度很大,影响学习效果,比如数据结构的“栈”,如果学习不好,就直接影响学生语法分析器的理解和上机实现。
4) 课程的课时有限,有的高校上机实践环节无法有效实施。由于教學改革,很多高校对包括本课程在内的许多专业课的授课课时进行了压缩,在一定程度上给教学增加了难度。有的高校对本课程没有开设实验课,仅仅学习了一些编译理论与算法,只有理论没有实践,使得学生无法将抽象的编译理论知识具体化和形象化,就难以对基本概念和方法正确地理解和运用,也无法全面系统地掌握了编译器的构造过程,缺乏上机实践,就会影响教学效果。
2 “编译原理”课程教学现状
针对以上在课程教学中出现的问题,该文提出了以下一些教学改革措施:
2.1 合理选用教材和参考书,保持教学内容的时代性和先进性
从教材建设方面看,教材坚持“基本概念严谨,基本方法灵活”的论述方法,既注重科学性也注重通俗性,文笔平实、通顺,易于理解。同时教材应该符合《中国计算机科学与技术学科教程》最新版的要求,真实反映当前程序设计语言翻译领域的核心知识,摒弃了部分陈旧内容及过时技术,并在此基础上增加适应新发展方向的内容;或对现有教材进行改版以满足新的教学要求。著名计算机科学家和教育家Alfred V.Aho所著的《编译器:原理、技术与工具》英文原版教材和翻译本可以作为主要参考书。增加配套实验教材,实验题目应该难度适中。合理选用教材和参考书,保持教学内容的时代性和先进性科学授课,可以充分调动学生的积极性和创造性。
2.2 科学授课
2.2.1 类比教学
使抽象内容形象化。事物之间存在着普遍联系,知识之间也存在联系,因而在教学过程中教师应该注意到这种联系,可以行之有效地运用这种联系的方法就是类比教学法。为提高课堂教学的效果,类比教学方法和值得推广。比如在讲高级程序设计语言的语法分析器的时候,涉及一个非常重要的内容:上下文无关文法。在讲的时候,可以先以自然语言文法为话题来引入。
以一个简化的自然语言文法为例:
句子→主语 谓语 宾语
主语→你
主语→我
谓语→是
宾语→定语 宾语
定语→可爱的
宾语→男孩
宾语→女孩
以上文法描述了一个简化的语言模型,该文法可以用来验证某个句子是否属于该语言模型。比如,验证“你是可爱的男孩”是否为合法的句子,实际上就是从“句子”出发,反复把上述规则中的“→”左边的符号替换成右边的符号的过程,如下:
句子=>主语 谓语 宾语
=>你 谓语 宾语
=>你 是 宾语
=>你 是 定语 宾语
=>你 是 可爱的 宾语
=>你 是 可爱的 男孩
则表明这个句子符合该文法描述的语言模型,即为合法的句子,否则为不合法的句子。这个例子中,文法G(VN,VT,S,P)可很容易地被学生理解。每个规则是文法的一条产生式P,而“句子”,“谓语”,“宾语”,“定语”就是非终结符VN,其中,“句子”是文法开始符号S,该文法的所有的句子都是由它推出的,“你”,“我”,“可爱的”,“男孩”,“女孩”就是终结符VT。由此例再引出“直接推导”的定义。“直接推导”,就是将产生式左部的非终结符替换为合适的产生式右部的过程,可以用“=>”来表示“直接推导”。同时,“语言”的定义也可以很容易地理解,就是从文法开始符S出发,通过推导得到的所有句子构成的集合,就是这个文法所描述的语言L(G)。经过以上分析,授课内容过渡到高级程序设计语言的语法分析器的开发途径,就是,需要对高级程序设计语言构建一个工具来描述这种语言的语法结构,这个工具就是上下文无关文法,上面的例子清楚地说明了文法G的主要概念。通过采用类比教学法,学生也容易理解和接受抽象理论。
2.2.2 温故而知新
编译原理是许多课程的一个综合性的实践。在课程讲授中,应注意将教授的课程内容与先修课程相关联,一方面起到温故而知新的作用,提高对程序设计语言、算法、软件开发理论的理解,另一方面也促进学生考虑问题层次的迁移,可以使学生体验到这些先修课在系统软件开发中的作用。比如在讲整个编译器符号表管理时,会涉及到散列表;讲自上而下语法分析器和自下而上语法分析器时候,会涉及到语法树和栈;在讲属性文法和中间代码优化的时候,会涉及到图,这些都是数据结构知识在系统软件开发中的实际应用;还有如运行时存储空间分配,会涉及操作系统的知识;目标代码生成部分的内容会涉及汇编语言以及计算机组成原理等课程的内容,这些内容在编译原理中再次学习并应用,会起到温故知新的作用。
2.2.3变“填鸭式”为“启发式”
“填鸭式”教学方式是教师为主体,学生被动学习的一种传统教学模式。而启发式教学是利用有限课时讲授重点内容,给出重要结论之前先提出一些问题,让学生思考。比如在讲词法分析器的设计这一节时,教师可以先提一个问题,即考虑在给定输入是高级语言源程序,输出是该程序的单词二元组(Token)形式的前提下,怎么去设计词法分析器,也就是怎么把源程序的字符流转换成单词流,可以让学生先思考,然后鼓励他们发表自己的见解,而不是由老师直接讲出该部分涉及到的知识:预处理、正则表达式、超前搜索识别、状态转换圖、确定有限自动机(DFA)、非确定有限自动机(NFA)等非常抽象的理论。这种方法激发了学生的思维,由以往的老师直接讲,直接灌输的填鸭式教育,变成学生主动去思考、去实现的启发式教育,能够收到更好地教学效果。
2.2.4多媒体与传统板书相互补充
板书和PPT各有优势,通过合理分工,可以使学生更好地理解讲授的内容。对于在授课过程中需要长时间对照参考的内容、复杂的推导步骤、难以在一张PPT中展示的内容,可以采用板书的方式讲解。而对于课本的核心内容、扩展内容、抽象内容的图形化或动画演示可以采用PPT的方式讲解。如在讲授程序句子递归下降法语法程序执行过程时,可以运用ppt的动画效果,直观地描述文法符号对应的程序递归调用的变化过程,抓住学生的注意力,增强了学生学习的兴趣,如图1所示。这和手工分析相比,即清晰又避免了长时间的手工书写过程;同时, PPT页面容量有限,有时候无法同时将某些显示给学生,影响教学,这些内容是可以板书出来,配合PPT演示,这样会取得更好地教学效果。
图1 句子i1+i2*i3的递归下降法语法分析过程演示
2.2.5 开发多媒体辅助教学软件
讲课时,采用文字、动画、图形等多种媒体,可以使内容充实,形象生动。对书本中死板的知识赋予活力,使学生在轻松的学习环境中掌握更多的要领。软件以多媒体动画的形式生动形象地描述了编译器的各个阶段的工作过程。借助现代化的教学手段和工具,将抽象的知识具体化、形象化,便于学生理解复杂的原理,极大地调动了学生的学习积极性,学习效果有了明显的提高。比如:LL(1) 分析法、移进归约分析法就可以采用FLASH动画演示,模拟语法分析过程,实现分析表和分析栈的状态跟踪。
2.2.6 将学科发展新内容引入教学中
在课堂授课上,首先注意将学科发展新内容反映到教学中,以丰富同学们的知识结构和拓展同学们的思路。很多学生在学习的时候,只是就编译技术学习编译技术,只知道在开发编译程序的时候会用到哪些理论,但是并不了解这些理论在编译技术之外的广泛应用。新的教学方式不能只是枯燥地讲解编译理论,而是应该在介绍编译技术的同时,介绍一些所学内容的学术前沿,使学生有强烈的学习和研究的冲动。编译技术在当前已经广泛应用于编译器构造之外的其他领域,比如:常用的文本编辑工具的实现;浏览器对HTML、XML的解析;网络检索;网络协议解析、信息安全领域;软件测试领域;中文叙词表的有效性检验程序;虚拟机、多核编程、嵌入式程序设计领域。这些新信息、新内容的引入,将有助于让学生对所学内容产生兴趣,同时加深对所学知识的正确认识,对于今后从事系统软件和应用软件的开发以及计算机的相关工作都是非常有好处的。
2.3注重实践环节,强调能力培养
实践性教学是课程教学体系中一个不可缺少的重要环节,对学生创新能力的培养,综合素质的提高,具有不可替代的作用。编译原理实践性教学的设计思想是使学生通过课堂学习,理解编译原理的同时,注重学生实践能力的培养,进一步巩固对知识的理解,通过实际的锻炼,掌握编译技术,进而能够独立的进行编译器的设计。
由于本课程在本科阶段的学习重点是编译的前端技术:文法、正则表达式、语法分析器以及语法制导翻译器,而后端的目标代码生成及优化技术在本科并不是教学重点,而是后继研究生的课程,再加上该课程的实验的课内学时一般都较少,时间非常有限,所以应该开展短学时编译原理实践教学设计,所以可以要求学生实现一个受限语言的词法分析、语法分析、语义分析和中间代码生成功能的基本编译器即可。实验课实施策略,采用在课程理论课的进行中,加以适当引导,同时让学生在课下前做好设计,根据课程教学内容的开展,让学生在有限的上机时间内完成了实践。编译程序实验课,前一个实验的输出结果要为下一个实验所用,所以前一个实验的完成好坏直接影响下一个实验的开展,所以教师要对学生每节实验课的完成情况进行有力监督和指导,同时进行随堂评分,以激励和督促学生完成上机作业。
2.4 建设编译原理资源网站,辅助学生自主学习
由于编译原理课程内容抽象难懂,学生难以在有限的课时里掌握讲授的全部内容。建立课程的网络教学环境,将课程的多媒体课件、课堂授课视频、编译原理实例库、习题库、编译源程序、实验所需编译工具等放在课程网站上,供学生在课后使用,极大地方便了各类学生的不同需求,使教师的课堂在课后得到了有效的延伸。同时,还可以通过网络平台提供的多媒体交互手段让师生进行有效的沟通,答疑解惑,同时也可以缓解目前学生人数增多,教学资源不足,学生质量参差不齐,教学质量和效率得不到保证的情况,为该课程的教学提供强有力的支持。
2.5教师队伍培养
教师应该承担过实际编译程序或相关系统软件的研制,具有丰富的教学经验和科研能力。紧密跟踪与编译原理相关的学科国际学术前沿,不断更新教学内容,以保证教学内容的先进性,并将科研中遇到的问题作为教学的典型案例在课堂中进行讲解,将科学研究的最新成果不断充实到教学过程之中,并且将科研项目进行必要的分解,组织部分优秀的学生参与项目开发,使学生切实体会到理论成果在技术实践中的完美应用,深刻理解理论与实践相结合的意义和具体途径。
2.6学校与公司合作,共建课程
学校可以和国内外和编译工具软件等相关的计算机公司签订培训协议,推荐学生到其公司进行专业实习和暑期实践,为学生提供到公司进行实践的机会,使学生能够更深刻了解课程知识的发展应用,同时培养学生的问题求解能力和软件开发水平;另一方面,聘请公司的资深开发人员、高级技术专家等人员到学校做讲座,讨论编译原理课程内容及其应用的热点问题等。学校和公司联合教学,共同提高学生的课程学习效果,多方面提升学生的能力和素质。
3 总结
编译原理是计算机专业的核心课程,它对培养高水平的计算机专业人才有重要作用,同时可以培养学生计算机思维和问题求解能力,因此是需要学生认真学习、教师认真教学的一门课程。为了使该门课程取得高效的教学成果,该文针对该课程目前的教学现状,从多方面对现有编译课程的教学提出了自己的一些改革措施。实践证明,这些措施的实施,使得学生不仅可以学习到课程的核心内容,同时还可以学习到结合现代信息发展的新的教学内容以及国外优秀教材的精华;通过在已有的教学手段的基础上,实施新的教学手段,能充分提高学生学习兴趣,有利于抽象内容的理解;通过上机实践,学生能有效提高自己的动手能力;通过构建网站,辅助学生课外学习;通过培养师资,为教育质量提供有力保障;通过校企合作,给学生提供更多实践学习的机会、并为将来的就业打下良好基础。总之,采用合适的教学措施,将使编译原理课程的教学效果提升到一个新的高度。
参考文献:
[1] 陈火旺,刘春林.程序设计语言编译原理[M].长沙:国防工业出版社,2004.
[2] Alfred V.Aho. 编译原理技术与工具[M].北京:人民邮电出版社,2008.
[3] Alfred V.Aho. 编译原理[M].北京:机械工业出版社,2009.
[4] Alfred Aho, Ravi Sethi, Jeffrey D. Ullman. 编译原理[M].北京:机械工业出版社, 2003.
[5] Francisco Ortin, Daniel Zapico, Juan Manuel Cueva. Design patterns for teaching type checking in a compiler.construction course[J]. IEEE Transactions on Education,2007,50(3):273-283.
[6] 裘巍.编译器设计之路[M].北京:机械工业出版社,2011.
[7] Thomax Pittman James Peters. 编译程序设计艺术[M].北京:机械工业出版社,2010.
[8] Francisco Ortin, Daniel Zapico, Juan Manuel Cueva. Design patterns for teaching type checking in a compiler construction course [J].IEEE Transactions on Education,2007,50(3):273-283.