窦 亮 杨宗源 王婷婷
摘要:本文在研究了国内外高校编译实验课程教学情况的基础上,介绍了华东师范大学计算机系“编译原理实践”课的实施情况。教师从教学内容、教学方法、教学手段等方面对该课程进行了深入的研究和改革,提高了学生的动手实践能力,有助于培养学生的“计算机思维能力”。
关键词:编译原理;实践教学;课程改革
中图分类号:G642 文献标识码:A
“编译原理”是计算机专业的一门核心基础课程,所介绍的知识是计算机专业理论知识的重要组成部分,包含了用计算机解决问题的基本思路和方法。
在教学中,理论与实践是相辅相成,互为促进的,因此编译实验内容的合理设置对搞好整个编译教学起着至关重要的作用。我们一直非常重视编译实验的教学,多年来不断研究国内外高校的教学情况,结合学生的实际,对该课程进行了深入改革,取得了一定成效。
1国内外高校编译实验课程的研究
1.1国外高校情况
斯坦福大学(Stanford University)的编译课程使用的主要参考教材是业界经典的“龙书”——《Compilers Principles, Techniques and Tools》。课程实验内容分为4部分,在课程的不同阶段进行布置:①词法分析(使用Flex);②语法分析(使用Bison);③语义分析;④综合前面的部分实现一个完整的Decaf编译器,生成在SPIM模拟器上执行的代码。实验的后两部分较前两部分难度高,因此所给分值不同,分别是50分、60分、125分和125分。整个实验部分占到了编译课程总评的70%。
卡内基梅隆大学(Carnegie Mellon University)在编译技术领域享有很高的国际声誉,该校的编译课程使用的主要参考教材是业界经典的“虎书”——《Modern Compiler Implementation》(ML版本)。实验题目共有5道:①扩展给定的L1语言的编译器,使之能够将源代码转换成真实的X86汇编代码;②实现支持L2语言的完整编译器;③实现支持L3语言的完整编译器;④实现另一个支持L3语言并生成安全代码的完整编译器;⑤两者选其一,实现L3编译器的各种代码优化或者实现L3的垃圾收集器。实验部分量很大,使用的现代编译器技术含量高,分数也占到了编译课程总评的70%。
加州大学伯克利分校(University of California, Berkeley)的编译课程使用的参考教材也是“龙书”。课程实验要求实现一个Python语言编译器,依次分为3个项目:①完成针对Python语言子集的词法和语法分析器;②实现静态分析;③实现机器代码的生成。实验部分占到编译课程总评的55%。
华盛顿大学(Washington University)使用的参考教材是《Engineering a Compiler》(Cooper & Torczon)。课程实验项目是将一个用Java写的简单编译器完善成一个支持MiniJava(Java语言子集)的功能完整的编译器。项目分5个阶段实施,分别是扩展MiniJava编译器,完成词法分析、语法分析、类型检查、中间代码生成和目标代码生成。实践部分占编译课程总评的40%。
总体来看,国外高校的编译课程非常重视实验,实验内容量大且要求高,涉及到了面向对象语言编译器实现、代码优化等高级内容。学生提交的实验作业须遵循严格的学术道德,严禁抄袭。课程往往配备2~3名助教,解答学生疑问,协助教师检查实验作业。
1.2国内高校情况
国防科学技术大学的编译课程使用的教材是陈火旺院士领衔编著、国内高校广泛使用的《程序设计语言编译原理》。课程设置有两个实验:①调试PL编译程序,扩充PL语言成分,并对相应的编译程序进行扩充;②了解编译程序构造工具Lex、Yacc和JavaCC的使用。实验成绩占总评的20%。
清华大学的编译课程教材选用的是自行编写的《编译原理》(吕映芝等著)。实验内容题目由学生根据能力自选,分别是:①对PL/0编译程序进行扩充,用Lex和Yacc实现一个简单解释器;②Deacf编译程序的设计和实现;③Java实现的Mini-Triangle编译程序。三个题目难度从低到高,分数所占总评的比例分别是20%、40%和50%。
武汉大学的编译原理课程是国家精品课程,教材是自行编写的《编译原理》(何炎祥编著)。课程实验是先在课堂上举出完整的小语言实现的例子,然后将该小语言扩充后作为实习内容;或者提供程序源代码而空缺关键模块,让学生完成。
吉林大学的编译原理课程是教育部—微软精品课程,教材是自行编写的《编译程序构造原理和实现技术》(金成植著)。该校专门开设了独立的编译原理实践课程,共包含8个实验:词法分析程序开发、递归下降分析法、LL(1)语法分析、符号表管理、语义分析、中间代码生成、中间代码优化和目标代码生成。
以上高校的编译实验课程教学具一定代表性。根据调查,国内高校编译实验课程的教学大致有以下几种安排:
(1) 安排多次小型实验,分别支持编译程序的各个阶段。此种方式是目前国内大部分高校采取的形式,由于编译过程每个阶段都有特定的方法和技术,故可以针对各个阶段设计不同的实验,根据理论教学的情况灵活安排。实验难度相对较低,能够让学生掌握编译的有关技术,缺点是不能让学生学习到一个完整编译器的开发运行过程。
(2) 针对某一语言设计和实现一个相对完整、独立的编译器,或者研习现有的编译程序,对其进行扩充。这种方式的难度根据语言规模的不同以及学生扩充程度的不同而有差别,弹性较大,有利于加强学生对编译程序的整体认识,且能充分锻炼学生的编程能力。
(3) 借助Lex和Yacc等自动生成工具直接生成编译程序。这种方式需要学生花一定量时间研究工具的基本原理及使用方法,对编译程序前端成熟的理论知识是一个很好的再学习过程,但对编程能力锻炼不多。
(4) 其他涉及编译技术的实验。此类实验强调编译技术在实际软件工程中的应用,如将词法分析器的设计扩展为中文网页分词的应用等,有助于培养学生理论联系实际的能力,灵活性较大。
总体来看,根据学生水平层次和培养目标的不同,国内许多高校实施了不同的实验,比较强调编译器前端的代码翻译技术,重视编译器最基本原理的实践,以培养学生的逻辑思维能力、编程和综合应用能力。
2我校编译原理实验课程的实践
2.1教学简介
我校计算机系自1979年建系时就开设了编译课程,在理论教学的同时给出一个精简的高级语言,要求学生完成词法分析和语法分析。为了适应我国人才培养标准不断提高的要求,结合对国外高校编译实验课教学情况的研究,我们认为应该更加强调编译实验,适当提高难度,结合软件工程中的思想培养学生理论联系实际的能力。因此,从2004年起,我们将原来在一学期同时完成理论和实践教学的“编译原理”课程拆分成在第6学期先讲授理论知识,第7学期专门开设“编译原理实践”课程,要求学生独立设计和实现一个完整的编译器,经过几年的实践探索,收到了良好的效果。
2.1.1课程描述
课程名称为“编译原理实践”,属专业必修课。课程选择了著名计算机科学家N.Wirth教授提供的PL/0语言作为实验语言,该语言是程序设计语言的典型代表,国内较多高校采用其作为编译教学使用语言。教师讲解PL/0编译程序构建后,要求学生实现一个完整的PL/X语言编译程序(教师给出PL/X语言的形式化语法定义),包括词法分析、语法分析、出错处理、代码生成和解释程序,然后用PL/X语言编若干个程序,用自己开发的编译程序进行编译,能指出语法错误不中断,能生成代码程序,能解释执行代码程序,最后输出正确结果。更重要的是,鼓励学生对PL/X语言进行定义扩展,增加更多功能。教师还演示了使用Lex和Yacc生成PL/0语言编译器的过程,鼓励学生在编程实现PL/X编译器的基础上再使用Lex和Yacc构建编译器。
2.1.2组织形式
课程总学时72学时,其中教师讲课20学时,学生上机52学时,教师讲课集中在前10周完成。教师讲授PL/0编译程序的设计开发占16学时,介绍使用Lex和Yacc生成PL/0语言编译器占4学时。
为了充分锻炼学生的综合能力,避免学生投机取巧,产生依赖心理,课程不采用分组的形式,而是要求每个学生都必须独立实现PL/X语言编译程序。
2.1.3评分规则
评分规则规定,文档、程序、测试用例齐全,现场考核通过,成绩为60分。学生对PL/X语言进行扩充的内容建议为:①增加运算符定义,如XOR、%等;②扩充语句定义,如case、for、continue等;③增加数据类型,在现有整型/逻辑型基础上增加实数、记录类型、数组类型等;④增加函数调用功能,进一步扩充带参数、返回值的函数功能;⑤增加类,补充封装、继承、多态等面向对象特性。根据扩充内容的难易进行累计,给予2~40分的加分。此外,良好的用户界面可获得加分;以Lex和Yacc工具生成编译器也可获得加分。
2.2经验总结
2.2.1突破教学难点,理论结合实践
课程改进主要有两点:一是由于N.Wirth教授采用Pascal语言实现PL/0编译程序,而学生不熟悉Pascal语法,因此我们同时提供C语言版本的PL/0编译程序;二是分阶段系统地讲授PL/0语言编译程序各个阶段的设计开发,按顺序给出各个版本的范例程序,学生可以跟着教师的讲授进度进行同步的PL/X编译程序的开发。这种方式降低了开发难度,使学生可以看到自己的开发成果不断完善,增强了信心,提高了继续探索的兴趣。
对课程的难点,教师也注意讲解方法,理论结合实践,使用多种教学手段。比如PL/0编译器生成的目标代码是一种假想栈式计算机的汇编语言,而学生很少直接接触汇编语言,对目标代码指令感到陌生,且运行时的存储组织与分配又是编译原理的一个难点,因此教学就采用了先易后难的办法。先给出不含过程调用的PL/0源程序生成的目标代码,详细介绍目标代码执行时数据栈的变化情况;继而给出含有过程调用的PL/0源程序生成的目标代码,再次分步介绍目标代码执行时数据栈的变化情况,重点讲解静态链、动态链、返回地址3个联系单元的作用;接着使用多媒体教学软件,以动画方式完整演示数据栈的变化情况,给学生整体思路;最后复习理论教学中各种运行时的存储组织与分配情况,让学生有深刻的体会。
再如语义分析和代码生成部分,一直是理论教学的难点,特别是控制流语句的回填技术等,在教师详细讲解了PL/0编译器中if语句和while语句的语义分析和代码生成实现后,学生对此有了实际体会,更进一步对for、case语句的实现产生兴趣,有动手将理论课上的方法用在作品中的意愿。
2.2.2激发学生潜能,延伸第二课堂
课程的实验内容设计成可扩展的,使不同层次学生都可以接受。由于有了分阶段的完整示例,基础薄弱、编程能力较差的学生只需在基本理解的情况下就可以模仿PL/0编译器构造PL/X编译器,消除了畏难心理;对于能力较强的同学,教师罗列出可扩展内容的建议,激发学生积极主动实践的意愿,拓宽学生的创新思维视角。
在教学计划中,学生上机是52学时,但课程要求实现的是一个完整的编译器,具有一定工作量,若要实现扩展,需要更多时间,大部分学生难以在课堂内完成,这就要充分发挥第二课堂的作用。课内教师把握主要矛盾,对于扩展难度较高的部分,则给学生思路上的启迪。借助课程网站的功能,给学生提供编译技术文档、编译源程序等自学资料,鼓励学生通过各种渠道搜寻相关资料,并利用网络相互讨论,助教协助解答问题,实现第二课堂的功效。
2.2.3考核科学严格,树立良好学风
课程要求学生提交完整规范的文档、程序和测试用例。现场考核要求学生演示程序、回答问题、改写程序,实现教师提出的特定功能,这样能够充分检验出学生的真实水平,并锻炼学生的表达能力和快速解决问题的能力。
在课程开始时,教师重点强调禁止抄袭,借助程序对比软件检查雷同性,无论是抄袭者还是被抄袭者,均不能通过考试。在前两届学生中严格执行该规定后,后续学生逐渐形成了良好的学习风气。连续五届学生的实践表明,学生的潜力是无穷的,许多优秀作品充分展示了学生的创新能力。我们选取了一些优秀的作品,将其功能演示的全过程录制成视频,放在课程网站上,为下一届学生提供参考,也激励他们创作出更完善、更富创新的作品。
正是由于我们将教学目标定在国内外先进的水平上,在教学内容、教学方法上不断改进,我校编译课程始终受到学生的普遍认可,在学生评教中处于前列。该课程成为华东师范大学精品课程后,2009年成功成为“上海市精品课程”。当然,和国外著名的高校相比,我们还需要进一步提高科研水平,不断跟进编译技术的发展,在理论和实践方面进一步增加现代编译器技术的教学内容,使学生在编译系统方面获得更大的收获和提高,有效和国际接
轨。
3结束语
编译课程理论难度高,一直是学生反映难学的一门课程,因此近年部分高校降低了编译课程的教学难度,减少了实验内容,甚至有学校提出将其从本科教学计划中删除。通过对国内外高校编译课程教学的研究,我们认为,编译课程在提高学生“计算机思维能力”,培养学生专业素养方面起着非常重要的作用。要真正做好编译教学,教师要从教学内容、教学方法、教学手段等方面综合提高,结合科研,跟进编译技术的发展,才能使学生更好地领会和掌握基本编译原理,为将来从事软件开发工作夯实基础。
参考文献:
[1] 斯坦福大学. 编译课程网站[DB/OL]. [2009-9-16]. http://www.stanford.edu/class/cs143/.
[2] 卡内基梅隆大学. 编译课程网站[DB/OL]. [2009-9-16]. http://www.cs.cmu.edu/~fp/courses/15411-f08/.
[3] 加州大学伯克利分校. 编译课程网站[DB/OL]. [2009-9-16]. http://www-inst.eecs.berkeley.edu/~cs164/sp09/.
[4] 华盛顿大学. 编译课程网站[DB/OL]. [2009-9-16]. http://www.cs.washington.edu/education/courses/401/08au/.
[5] 国防科学技术大学. 编译原理精品课程网站[DB/OL]. [2009-9-16]. http://sei.nudt.edu.cn/cp/index.php.
[6] 武汉大学. 编译原理精品课程教学网站[DB/OL]. [2009-9-16]. http://jpkc.whu.edu.cn/jpkc2005/byyl/.
[7] 吉林大学. 编译原理精品课网站[DB/OL]. [2009-9-16]. http://www.jlu-softlab.cn/education/compiler.
[8] 唐仕喜. 编译技术可扩展式课程设计改革研究[J]. 计算机教育,2009(2):40-42.
[9] 斯传根. 编译设计与开发技术[M]. 北京:清华大学出版社,2003.
[10] 何炎祥,伍春香. 计算机专业不需要开设编译原理课程吗?[J]. 计算机教育,2009(4):61-62.
Research and Practice on the Experiment Course of Compiler Principles
DOU Liang, YANG Zong-yuan, WANG Ting-ting
(Department of Computer Science, East China Normal University, Shanghai 200241, China)
Abstract: The paper introduces the teaching of “Practice of Compiler Principles” in Computer Science Depart of ENCU based on the research of the same course in other universities worldwide. We perform in-deep study and reform on all aspects of the course such as teaching contents, teaching methods and course assignments, which greatly improves the students ability of hands-on experience and helps to build the ideation on computer science.
Key words: compiler principles; practice teaching; course reform