APP下载

编译原理教学方法研讨与实践考核改革

2017-05-12高珍卫志华黄杰杜博闻

计算机教育 2017年4期
关键词:教学实践自主学习

高珍+卫志华+黄杰+杜博闻

(1.同济大学 软件学院,上海 201804; 2.同济大学 电子与信息工程学院,上海 201804)

摘 要:編译原理是计算机专业的核心课程和难点课程,该课程的教改一直是热点问题。文章基于多年编译原理授课经验,针对课程的理论教学提出一些有效的教学方法,包括应用归纳思维、采取实时检测、创造自主学习、复原问题求解等;同时提出从实践平台的创建和考核方面进行思考和改革,重视过程监督,利用GitHub平台使实践考核更为公正。

关键词:编译原理;自主学习;归纳思维;教学实践

0 引 言

编译原理是计算机专业的一门核心课程,内容涉及形式语言、有限自动机等抽象内容,一向被认为是最难的计算机专业课程[1]。教师感觉难教,学生感觉难学,课程内容抽象和枯燥、算法复杂且不易理解、实践考核难通过等都是师生公认的问题。国内学生在就业后较少从事与编译器设计开发相关的工作,这也使得他们的学习积极性不高。对于授课教师而言,如何提高该课程的教学质量、消除学生的畏难心理、提高其学习兴趣、改善学习效果,是一个需要研究的课题。

鉴于编译原理课程的重要性和挑战性,对其教学方法的尝试和探索一直是研究的热点。很多学者提出了自己的见解,如有学者从教育心理学(包括人本主义教学理论和构建主义学习理论)出发考虑教学方法的改革[2];有学者从目标驱动着手构建编译原理课程实施的目标体系,以帮助学生更好地自主学习[3];也有学者提出采用隐喻语言来锻炼学生的抽象思维能力[4],采用启发式教学来提高教学质量[5]。同济大学软件学院和电子与信息工程学院均开设了编译原理专业课程,教师团队互相学习,积极探索和提高教学方法,以课程内容为导向,提出并凝练了4种教学方法,同时对课程实践平台的创建和考核方法也进行了探讨和实践。

1 教学方法研讨

在编译原理课的授课中积极尝试改革教学方法以改善课程的教学质量,取得了良好的效果。这些教学方法包括应用归纳思维、增加随堂练习、创造自主学习机会、复原问题求解等。经过实践验证,这些教学方法能够有效提高学生的学习兴趣,降低学习难度,改善教学效果。

1.1 应用归纳思维

和演绎思维相比,人类更容易接受归纳思维,但大多数编译原理中文教材都采取了演绎思维的方式来组织教材内容,这给学生自学或者预习编译原理课程带来困难。为了帮助学生更容易理解看似复杂的模型和算法,以一个具体的例子来讲解是较好的做法。如在自上而下语法分析章节中讲解到消除文法的左递归算法时,先拿出一个简单的具有左递归的文法,以它为例,让学生探索如何消除其左递归,待这个例子讲解完之后再介绍该算法,就显得清晰易懂。

1.2 增加随堂练习

在讲解完重要知识点尤其是难点之后,鼓励教师加入随堂练习进行实时检测,一方面可以考核学生是否理解了教授的知识点,另外也可以提高学生的注意力。根据本教学团队的授课经验,随堂练习能够很准确地反映出学生对知识点的掌握程度,如果学生对知识点有不正确的理解,也能通过练习来迅速纠正。随堂练习提高了学生对课程的参与度,通常只要学生认真听讲,在老师的引导下,随堂练习一般都能正确完成,这种“积极反馈”现象也会给予学生鼓励和成就感,构成学习的良性循环。

一些老师可能认为编译原理课程本身的教学任务重,增加随堂练习在时间方面有难度,但是如果只顾完成教学任务而忽视学生是否掌握了授课内容,就难免舍本逐末。当然为了控制时间,随堂练习的设计就比较重要,目标是考查知识点,需要控制计算量,题目规模宜小不宜大,宜简不宜繁。通过观察学生在练习中发生的错误可以直接定位到学生的薄弱知识点,立刻进行重复讲解,以使关键知识点都能够被学生理解和接受。

如考核NFA如何通过状态消去法转换为正规表达式,可以采用如图1所示的NFA来测试,它基本覆盖了所有的状态消去规则。

又如考察赋值语句的语义分析,可以让学生根据赋值语句的文法产生式(如图2所示)及语义规则写出赋值语句A:=B*(-C+D)的三地址代码,这个语句很简单,却全方面考核了学生对属性文法和语法制导翻译方法的掌握情况。

1.3 创造自主学习

多数高校会将编译原理课安排到大三来上,一般来说,这些高年级学生已经具备了较好的自主学习能力,所以考虑将较难的课后习题单独摘录出来,让学生分组完成,然后抽出一定的课堂时间进行答辩与讲解。这样有利于学生自主、自助地学习和探索,使他们对自己解答的题目和相关知识点掌握得更加牢固。对教材中的可选性章节,也允许学生分组进行研究性学习,希望将教材中讲解的基本知识点与拓展的可选知识点相结合,以实现知识的拓展性。拓展学习成果也可以作为加分因素,以此来鼓励学生。

1.4 复原问题求解

编译原理中有很多经典的算法,如算符优先分析方法。如果采用传统的方法,先介绍什么是算符优先文法、该文法对算符的约束条件、算符之间的优先关系的定义,以及FIRSTVT和LASTVT集合的计算、算符优先关系表的构建和算符优先分析算法的设计。顺着这个思路(往往也是教材的思路),虽然也能把算符优先分析方法讲解清楚,但给学生增加了很多困惑:勤于思考的学生会困惑为何引入算符的优先级?优先关系为何这样定义,而不是另外一种方式?为何要引入素短语等。这些困惑给他们带来了学习上的困难,也很容易让他们对算法的学习失去兴趣。

针对这种情况,建议“复原问题求解过程”,一步步引导学生,使他们从被动思考转为主动探索。知识的讲解循序渐进,使得算法的设计、新概念及术语的引入都变得水到渠成,使被动地学习、接受新的概念和知识变成积极地创造概念和知识。

以算符优先分析方法为例,可以先抛出一个问题,如对一个算术表达式文法G{ E→E+T│T; T→T*F│F; F→P↑F│P; P→(E)│i},对于符合该文法的一个语句i+(i*i)+i,采用规范规约,我们会得到图3(a)中的语法分析树,然后向学生抛出问题:是否可以把这个语法分析树简化为图3(b)中的语法分析树?显然图3(b)中的语法分析树用于语法分析,步骤更少,效率更高。对比两棵树,同学们不难发现,它们的区别主要在于后者避免了单非终结符到单非终结符的归约。接下来可以引导学生找出图3(b)中语法分析树的规约短语,显然有i, N*N, N+N。可以把这些可规约短语定义为素短语,让学生给出其定义(即含有终结符且不包含更小的素短语),然后开始引导学生探讨如何利用程序自动识别这些素短语,提示是否可以结合产生式,引入这些终结符(如给一个新名字:算符)的优先关系(如>,=,<)来识别素短语。经过课堂检验,学生能够给出建议:同时出现在产生式左侧的算符优先级相同,采用“=”,其他算符的关系可以采用“<”或“>”表示。此时教师才开始介绍算符优先分析方法中对于算符的优先关系的定义,并给出素短语的识别算法。至此,学生很清楚引入算符优先关系的目的是为了识别出素短语,加速语法分析的过程,并且他们也会非常清楚这种方法的不足:当省略的单非终结符到单非终结符的归约不符合图3(a)中 语法树的时候,使用图3(b)中语法树会带来误判,把不合法的语句判断为合法。

这种复原问题求解过程的方法能够让学生很清楚地看到“新”定义、“新”术语、“新”算法被設计出来的缘由,理解和接受这些知识就变得轻松起来。

2 实践考核改革

2.1 建立实践平台

为了鼓励学生的团队合作精神,以团队为基础来完成项目实践这种考核方式被越来越多地采用,但这也会带来一些负面影响,比如一些同学“搭便车”,而另外一些同学的负担又过重。为了评分的公平,一般情况下,老师都会要求同学们提供工作量比例以作为评分的依据,但是鉴于人为因素,这个比例往往不能真实地反映出每个人的贡献,这一直都是造成团队考核不公平的原因。为了避免此问题,本教学团队提倡采用一些新工具和平台来进行项目管理,以使团队考核更加有据可依和科学合理,如可以利用GitHub平台(http://www.github.com/ )来进行项目的管理,同学们在代码方面的贡献直接根据GitHub平台的数据来评定。比如,图4是一个4人小组在GitHub上管理的项目在课程授课几个月期间贡献数据的图形化表示,每个人的贡献量一目了然,再乘以工作内容的难度系数,就能够得到客观公正的成绩评定系数。

同样,也可以利用GitHub平台来构建课程实践平台,通过该平台发布项目实践要求,也鼓励同学们通过此平台共享课程资料和分享学习经验,同学们的贡献及活跃程度的数据也能够轻松通过GitHub平台获得。此外,QQ群、微信群等也是良好的沟通平台,能够有效促进师生之间、同学们之间的沟通和互助。

2.2 重新定位考核内容

目前各大高校对编译原理课程的考核一般分理论和实践2部分,每个高校的比例都有差异。从整体数据上看,国外高校更偏重于实践考核,如斯坦福大学编译课程实践部分占编译课程总评的70%[6],卡内基梅隆大学在编译技术领域享有很高的国际声誉,其实践部分分数也占编译课程总评的70%[7],加州大学伯克利分校的实践部分占到课程总评的75%[8];而国内高校对一般理论知识的理解和讲授偏多一些,如武汉大学编译原理课程的实践环节占总课时的40%,北京航空航天大学编译原理的实践教学比理论基础教学少1个学分。

近些年,国内高校也越来越重视实践考核,也有一些这方面的教改内容探索[9-12]。不管国内还是国外,多数实践考核都是鼓励学生使用一门自己熟悉的高级语言从头编写一个编译器,这样不仅考察了学生对课程理论知识的掌握,也连带考核了学生对数据结构、操作系统、计算机组成原理、程序设计语言、软件工程等多门课程的掌握程度,所以编译原理实践也是对学生计算机综合能力的全面考核。因此,该课程实践考核对学生的计算机软件开发能力的要求就很高,并且这和软件学院的另外一门课程“软件综合项目实践”冲突,软件综合项目实践课程设计的目的就是为了锻炼和考核学生综合运用计算机技术开发具有一定规模的系统软件或应用软件的能力。从另一个角度来看,如果学生的计算机软件开发素养不够好,即使在该课程的学习过程中非常努力,也无法取得理想的成绩。这对“下游成绩”的学生来说也不是很公正。

所以鼓励学生使用编译开源工具,“站在巨人的肩膀上”,借助开源工具的帮助来构建编译器,推荐的词法分析器包括Lex等,语法分析器包括JavaCC、Bison和Yacc等,这些开源工具被广泛应用,Lex、Yacc等也有多个不同语言的实现版本(包括C、Python等);同时支持跨平台(包括Windows、Linux、Mac等),学生根据自己熟悉的平台和语言进行选择。如此,课程实践考核对软件开发技能的要求相对降低一些,考核点集中在学生对编译技术及方法的理解和掌握上,而不是在学生软件开发综合素养上。这样设计的“实践”环节依然可以促进和加强对理论知识的理解,而且更有针对性。

为了能够识别并鼓励优秀的学生,可以把实践考核设计成“多层次”的考核。可以提供一个简单语言L0,一个相对丰富的语言L1,基于L1扩展语言Ln(不限制扩展的语法),对于实现不同级别语言编译器的同学,差异化他们的实践环节得分。比如,可以在课程设计中列出2个可选的题目编写PL/0编译器和编写类C编译器。学生可以根据自己的能力和兴趣实现一个适合于自己水平的编译器。

3 结 语

基于多年的教学经验,我们提出编译原理课程理论教学的一些有效的教学方法,同时对实践考核进行思考和改革,课程教学实践表明,这些教学方法和实践改革卓有成效,希望为高校的编译原理课程的教学提供一些借鉴。下一步希望能够在实践环节的过程监控上更加细致和科学,也计划将课程的一些扩展性知识以慕课教学的方式开展,以期为课堂教学带来有益的补充。

作者简介:高珍,女,副教授,研究方向为编译技术、数据分析与数据挖掘, gaozhen@tongji.edu.cn;

卫志华(通信作者),女,副教授,研究方向为机器学习、数据挖掘,zhihua-wei@tongji.edu.cn。

参考文献:

[1]周会平, 王挺, 李梦君. 关于编译原理课程定位的思考[J]. 计算机教育, 2011(11): 45-47.

[2]周汝雁, 韩彦岭, 张明华,等. 基于教育心理学的编译原理课程教学方法[J]. 计算机教育, 2014(9): 66-68.

[3]杨晓波, 骆嘉伟, 文佳宝. 目标驱动的编译原理课程体系研究[J]. 计算机教育, 2011(11): 23-27.

[4]黄孝喜, 谌志群, 王荣波. 隐喻语言在编译原理课程教学中的应用[J]. 计算机教育, 2015(1): 102-104.

[5]姚卫红, 赵晶. “编译原理”教学实践探究[J]. 计算机教育, 2013(5): 64-67.

[6]斯坦福大学编译课程网站 [EB/OL]. [2016-09-01]. http://online.stanford.edu/course/compilers.

[7]卡内基梅隆大学编译课程网站[EB/OL]. [2016-09-01]. http://www.cs.cmu.edu/~fp/courses/15411-f08/.

[8]加州大学伯克利分校编译课程网站[EB/OL]. [2016-09-01]. http://www.eecs.berkeley.edu/Courses/Data/208.html.

[9]窦亮, 杨宗源, 王婷婷. 编译实验课程的教学研究与实践[J]. 计算机教育, 2009(23): 8-11.

[10]邵兵. 软件学院编译原理实践课程的教学探索[J]. 计算机教育, 2016(8):115-117.

[11]张昱, 陈意云. 编译原理课程实践改革探索[J]. 计算机教育, 2008(8): 24-26.

[12]张晶, 金英, 刘磊.“编译原理”实践课程教学方法研究[J]. 吉林大学学报(信息科学版), 2009(21): 19-21.

(见习编辑:张 勋 )

猜你喜欢

教学实践自主学习
基于三维软件和云班课APP的机械设计课程教学实践
中职职业生涯规划课程的教学反思
中职计算机应用课程教学改革与反思
浅论高中化学生活化教学的实践与思考
浅谈初中物理实验教学与学生创新能力的培养
测量平差课程教学改革探讨与实践
高中生英语自主学习能力培养研究
翻转模式在“液压与气动”教学中的应用研究
中职学校“生本课堂”的调查研究与实践
践行少教多学,构建高效课堂