软件学院编译原理实践课程的教学探索

时间:2022-10-24 01:39:15

软件学院编译原理实践课程的教学探索

摘要:软件学院对学生的培养目标集中体现在“实用”上面,因此对传授计算机基础理论知识的编译原理课程必须加大实践环节的侧重。如何在传授理论知识的同时,大力培养学生的编程能力,一直是摆在各软件学院面前的一道难题。文章针对这一现实问题,通过分析学生的接受能力,有针对性地设计几种课程实践的实施方案,并说明北京航空航天大学软件学院编译原理课程教学中的实践情况和取得的效果。

关键词:编译原理;编译技术;课程实践;编程能力

1 软件学院编译原理课程实践环节的重要性

随着本科生招生人数的大幅增加,高校毕业生就业竞争加剧,用人单位对人才要求不断提高,计算机及相关专业的不少毕业生在就业过程中暴露出动手能力差、分析问题解决问题能力薄弱、创新意识不强等问题。这些问题的出现在很大程度上反映出高校在学科的专业实践(特别是课程实践)教学方面的不足。作为大学课程中第一个较为系统化的软件设计类课程实践,编译原理实践对培养学生动手能力无疑起着非常重要的作用。

编译原理(在有些学校称为编译技术)是本科计算机专业的一门重要专业基础课程,也是计算机系统软件中非常重要的一个分支,其理论性和实践性都很强。大部分高校在这门课程的开设中,都会将其划分为理论讲授和课程实践两部分进行实施,甚至将理论讲授和课程实践分列为两门课程。

2002年,教育部在成立示范性软件学院的批示中,将“软件学院要培养市场急需的‘实用型’人才”放在了比较重要的位置,这也构成了软件学院区别于传统计算机学院的重要标志。因此对于软件学院的学生而言,编译原理的教学情况则有所不同。首先,软件学院的历史都不长,受课时和师资等多方面因素的影响,一些学校甚至是示范性软件学院,也会将该课程压缩甚至完全砍掉;其次,即使是保留该课程教学的学校,也会不同程度地压缩实践环节的时间,多多少少地影响到学生对编译技术的理解与掌握。笔者认为,尽管编译原理课程确实存在理论抽象、概念众多、算法多等特点,但这门课程对于培养学生掌握构造高级程序设计语言、编译程序的基本原理、结构、设计与实现技术,培养学生了解和掌握编译原理的基本原理及典型技术并具备相当的应用能力,帮助学生为今后从事软件开发打下坚实的理论基础,提升学生程序设计能力和创新能力等诸多方面,都有着其他课程不可替代的作用。因此编译原理课程教学不但不应该削弱,反而应该受到重视和加强。

在此前提下,如何让软件学院的学生在掌握编译技术基本原理的同时,大力加强他们对编译技术的理解与使用,从而提高其产品――计算机软件(尤其是大型软件)的结构有效性和效率,则是摆在软件学院编译原理课程教学的―个重要问题。

2 对学生能力的分析

在各高校的软件学院中,普遍存在着生源参差不齐的现象。由于学生入学时对计算机软件了解不多,所以即使是在示范性软件学院,也有相当一部分学生入学时对软件专业的认识不够,大学阶段的头两年如果没有打下良好的基础,则直接导致对专业课的畏惧乃至厌学情绪。所以在对学生传授知识和培养能力时,更需要摸清学生基础,培养他们学习兴趣,通过加强实验和实践环节,培育其分析问题和解决问题的能力。

通过观察和调研可知,软件学院的学生大致上可以分为以下几类:一是对计算机知识很感兴趣,且学习能力较强的学生;二是对计算机知识的兴趣一般,且学习能力平常的学生;三是对计算机知识不感兴趣,且学习较差的学生。

像北航这样985高校的软件学院中,学生的学习能力普遍比较高,学校给学生提供的实验环境和配备的师资力量也普遍较强,因此比较容易形成良性循环,为课程教学和实验教学提供重要的基础保障。但根据历年编译原理期末考试的情况分析看,实际教学效果也并非完全符合正态分布。高分段(>85分)学生的人数相对较多,约占40-50%左右,且这部分学生的能力较强,即使适当加大试题难度对其考试分数的影响也比较小;而不及格学生的人数大约占10%左右,且即使降低试题难度对其影响也较小;试题难度影响较大的是中间段的学生。

对学生的接受能力有一个正确的了解,才能有针对性地因材施教,使编译原理的实践环节达到应有的效果。

3 因材施教

笔者在编译原理与实践课程教学过程中,尝试过不同的实践方式。通过不断地摸索,发现采用如下的因材施教方式效果最佳。

(1)对于学习能力较强的学生,可以让他们自己动手编写小型编译器。一个完整的编译器包含词法分析、语法分析、语义分析、中间代码生成和代码优化等前端部分,也可以包含生成和具体计算机体系结构相适应的可执行代码后端。一般编译原理实践环节大多安排学时为32学时左右,因此要让一个(或一组)学生在这么短的时间内完成前端和后端两部分是不现实的,可以让学生单独完成前端。

(2)对于学习能力一般的学生,在实施编译程序实践教学中,除了可以采用第一种方法外,还可以让他们利用LEX、YACC、JavaCC等工具来编写编译器。由于YACC等语法分析程序是基于自底向上的分析方法,所以在编译原理课程教学环节,对LL等分析法就应当赋予较多的时间和精力,力争让学生在使用这些工具生成编译器程序时,清晰地了解它们的工作原理。

(3)对于学习能力相对较弱的学生,可以采用分析现有编译器程序的方法。也就是说,并不要求他们自己去设计开发一个具体的编译器,而是通过读懂现有的编译程序,了解其工作原理。哪怕让他们比葫芦画瓢地逐行输入并调试现有的程序,找出现有程序中的印刷错误和不合理之处,都对其动手能力的提升起到一定的作用。具体编译程序可选择PL/0文法程序代码,或者是Pascal-S文法程序代码。当然,其他类似的编译器程序都可选用。

还可以提供给学生不完整的程序源代码,让其采用填空的方式完成其中部分关键模块。此类题目由于提供了大部分源程序,只是让学生参考教材或课堂上的例子集中精力解决一些关键问题,这样就能保证大多数学生都能完成实践任务,真正达到让学生通过课程实践加深对编译过程理解的目的;同时学生在编译器的实现过程中也能够产生成就感,从而消除了对课程的恐惧感,增加学习的信心。

在对编译源程序的选择上,可以选取循序渐进的指导思想,例如张晶等人提出的Lo文法就只包含了空语句、赋值语句、条件语句和循环语句等基本语法成分。可以让学生在此文法基础上使用相对简单的递归下降分析法先进行实现,完成后再逐步对其进行扩充。这种方法就像软件工程中的原型开发方法,有利于学生快速看到自己的成果,从而树立信心,取得预计的效果。如果扩充的文法只是同一种类型的简单扩张,则学生会陷入重复的劳动,从而让他失去兴趣,所以文法的扩充一定是方法的扩充。

对于部分学生,还可以让其利用所学知识编写类编译器的工具,比如智能编辑器、公式编辑器等。只要是能够将编译技术的知识用到具体程序中去,所有的尝试都应当予以鼓励,但这种尝试一定要在老师的指导和监督下进行,以免出现学生出发点虽好,但遇到具体技术问题无法克服进而导致挫折性失败的情况。

4 编译原理实践教学的时机

通过对不同学校的调查发现,不同的学校对编译原理实践教学环节的安排主要有以下两种情况。一种是将教学环节和实践环节完全分开,而且分别放置到两个学期中实施。这种方法虽然存在着界限分明、便于组织教学的好处,但实践证明由于理论和实践严重割裂,学生往往在第二个学期实践环节中对上一学期所学的知识遗忘得非常厉害,导致教学效果很差,因此不建议采用;另外一种稍好的方法,是将教学和实践环节虽然分开,也就是先进行课程教学,结束后再进行实践。这种方法虽然把两个环节放在一个学期实施,解决了理论和实践脱节的矛盾,但上述矛盾依然存在,只是理论和实践脱节的程度稍轻一些而已。

经过多年的实践,作者认为采用两遍教学法可以较好地解决这个问题。也就是说,把教学和实践放在同一个学期实施,不要将它们完全分开。首先可以讲授编译原理的最基础知识,例如词法分析、语法分析中的自顶向下分析法、语法制导的语义分析等,与此同时安排学生进行编译器相应部分的编写工作,即把整个实践环节变成教学环节的一个大作业。待学生完成后,再进一步讲解词法分析中自动机理论、语法分析中的LL及LR分析法、代码优化以及目标代码生成等内容,最后再完成利用编译工具进行编译器自动生成的实践。在这种教学方法中,课堂教学和实践环节交叉进行,学生学到哪里就实践到哪里,从而保证教学与实践的紧密结合。

5 结语

笔者在北航软件学院七年的教学实践中,通过对学生学习能力的调查分析,摸索出了在教学过程中首先区分教学对象,然后因材施教的基本思路,并给出了具体的解决方案。

首先,在头几年的教学中采用的是简单的统一式实践方式,即所有学生采用同一个题目、使用同一种文法,独立完成一个编译器前段。此时有大约五分之一的学生存在偷懒抄袭别人作业的现象。之后采用分题目实践方式,即自我感觉水平较高的同学经过申请可以采用CO文法,绝大部分同学使用PL0文法独立完成一个编译器前段;自我感觉水平较低的同学采用在部分已有Pascal-S文法基本模块的基础上,通过填空补充递归子程序语法分析模块。此时没有发现学生抄袭别人代码的现象。为了保证成绩的区分度,所有获得优秀(采用五级计分制)的学生必须参加答辩,经过代码讲解和演示并通过教师提供的测试。

改革后学生们普遍反映“通过大作业,对课本上的知识有了更深刻的认识”、“编译原理课程是我大学四年学过的最难课程,其中编译实践对我的帮助最大”。2015年一位同学更是由于在其博客中发表了对LLVM编译相关的研究内容,被美国加州大学河滨分校的一位华人教授发现,并表达了招收其为直博研究生的意愿。

事实上,北航软件学院的编译原理课程近几年也经历了由必修课程改为选修课程,又由选修改为必修的曲折道路。在课程性质为选修的时候,编译原理和编译实践是分割到两个学期的两门独立课程。一部分学生由于种种原理,在选修过编译原理课程后不愿意再选修编译实践,导致对相关知识的掌握只是停留在表面。后来我们采用前述的两遍教学法,将编译原理和编译实践有机地融合到了一个学期,从而保证通过实践环节对课堂上所学的理论知识有较深的理解,达到了提高教学效果的目的。

上一篇:城市社区残疾人服务现状与问题研究 下一篇:公路工程经济管理中存在问题及应对措施