APP下载

“编译原理”课程教学改革探讨

2021-04-11希,陈佳,农

梧州学院学报 2021年6期
关键词:编译器原理笔者

何 希,陈 佳,农 健

(梧州学院 大数据与软件工程学院,广西 梧州 543002)

“编译原理”课程是一门介绍编译器工作原理和方法的课程。它是高等学校培养计算机专业人才的主干课程之一,也是一门对理论、实践要求都很高的课程。它既要求学生理解编译原理、编译系统结构、各种编译算法,又需要学生具备设计、完成、分析和维护编译程序的初步能力。同时,“编译原理”课程又是计算机专业中一门综合性很强的专业课程,需要以多门前修课程为基础,如“数据结构”“离散数学”“操作系统”“程序设计”“汇编语言”等等。

据笔者了解,目前大多数“编译原理”课程的内容包括词法分析(正则表达式、非确定有限自动机、确定有限自动机)、语法分析(上下文无关文法、自上而下语法分析、自下而上语法分析)、语义分析和中间代码生成(属性文法、语法制导翻译形成中间代码)、代码优化(局部优化、循环优化)和目标代码生成。同时,一些“编译原理”课程还会针对某些课程内容进行一些小型项目实践和练习。

1 “编译原理”课程的教学现状

由于编译系统复杂,所涉及的理论宽广且深奥,而且课程涉及多门前修课程,大多数学生反映此课程内容枯燥、抽象、复杂。同时,由于课程讲授难度大,学生积极性不高,参与度低,很多教师也不愿意开设“编译原理”课程。有的高校为此缩减了“编译原理”课程的课时个别高校甚至把此课程从人才培养计划中删除。笔者分析有以下原因造成了“编译原理”课程目前的困境:(1)课程内容的设置偏理论轻实践。编译系统中有大量的理论内容,这些内容对于本科学生来说比较抽象甚至是晦涩难懂,而且在实际中应用不多。很多教师不得不把大部分时间用来解释这些理论内容,从而留给学生实践的时间不多,进而增加了学生理解理论知识的难度。(2)学生基础参差不齐。部分学生在修该课程前并没有打好基础,造成了理解上的障碍。(3)教师自身功底薄弱。(4)实践环节的开创性和实用性不够。由于时间的关系,学生很难实现一个完整的编译器。即使是简化版的计算机语言,其编译器的开发难度也是远远超出“编译原理”课程项目的范畴。然而,如果学生没有一个从无到有设计和完成一个编译器的经历,那么他们对编译原理的理解、对编译中涉及算法的理解都会大打折扣。

2 相关工作

针对“编译原理”课程存在的问题,许多研究提出了不同的解决方案。文献[1]提出课内因材施教、理论联系实际。让学生上讲台授课。课外组织答疑,采用加分规则提拔优秀学生。文献[2]提出有效教学,丰富教学手段,加强实践教学。文献[3]提出引用4个实验项目来帮助学生掌握理论知识。文献[4]提出理论与实践并重,并且选择C语言的编译程序作为实验内容。同时,选择得当教学方法。文献[5]提出理论课教学应该体系完整、结构清晰、内容贯通,同时倡导采用CAI软件进行教学。文献[6]建议课程教师对教材及教学内容做一定程度的处理,对层次较低的学生则可适当降低难度,对层次较高的学生可加入与编译有关的最新内容,激发学生对编译的兴趣。

3 教学改革方案

3.1 基本思路

笔者的基本思路是通过一个小型的、完整的编译器项目来引导整个“编译原理”课程。课程的考察方式摒弃了传统的期末闭卷考试,避免学生死记硬背编译理论和算法。课程根据每个学生团队所承担编译器项目的完成度来进行评估,让每个学生都有参与感,发挥主观能动性来学习编译器相关知识。一个具体的编译器项目可以让学生理解编译问题是在什么背景下产生的,编译理论是基于哪些假设而产生的,而编译算法又是如何解决这些问题的,有哪些优点,有哪些妥协。项目中的代码更是可以让学生更好地理解编译器结构以及各种编译算法的实现。课程的编译器项目可以细分为词法分析模块、语法分析模块、语义分析模块、执行模块。各个模块分阶段提交、评估。编译理论、编译相关算法的讲授以服务编译器项目为出发点,对现有内容进行斟酌、调整。 对于绝大多数学生而言,将来都不一定进行编译器方向深入的研究。对于他们而言,理解编译器的基本原理、工程上设计和实现显然更加重要和实用。

3.2 “编译原理”课程项目的选择

在笔者的教改方案中,选择合适的“编译原理”课程项目是决定整个课程成败的关键。首先,这个课程项目一定要相对完整,包含编译系统的主要模块。这样学生才可以对整个编译系统有完整的理解。其次,这个课程项目的工作量是在学生能力范围之内的,可以由学生团队在一个学期内完成。一般常见计算机语言的编译器,如Java编译器, C编译器, 其代码量都是惊人的,哪怕是精简版的编程语言,如miniJava, 其编译器的实现也会因为工作量太大而不适合作为本科生“编译原理”课程项目。笔者在读研期间,曾经为Datalog语言[7]编写过编译器。Datalog语言是一种接近SQL的数据库查询语言,其精简语法如下:

(1)ddb ∷= idb_rules DOLLAR

(2)idb_rules ∷= idb_rule|idb_rule idb_rules

(3)idb_rule ∷= NAME LPAREN arg_list RPAREN IMPLIES idb_body PERIOD

(4)idb_body ∷= literal|literal COMMA idb_body

(5)literal ∷= NOTOP predicate|predicate

(6)predicate ∷= NAME LPAREN arg_list RPAREN|arg COMPARISON arg

(7)arg_list ∷= arg|arg COMMA arg_list

(8)arg ∷= NUMBER|STRING|VARIABLE

从上面Datalog语言的语法可以看到,Datalog语言中单词种类少,其编译器中的词法分析模块相对简单,只有8条语法规则,决定了其编译器中的语法分析模块不会太复杂。因此,Datalog语言编译器项目是一个工作量适中,非常适合作为“编译原理”课程的项目。实际上,在实验环节中,该课程教师向学生介绍2款工具JFlex[8]和CUP[9],学生可以通过这2款工具配置、定制产生词法分析模块和语法分析模块,大大减少了编码工作量,而且可以更加专注地理解编译器的工作原理。同时,还为编译器中每个模块以及一些重要的功能点提供了测试案例,帮助学生在分模块开发过程中进行单元测试,减轻学生的工作量。

Datalog语言编译器中的语义分析模块需要一些Datalog语言的使用经验,鉴于大多数学生在数据库原理课程中都学习过与Datalog语言类似的SQL语言,在笔者适当的提示和帮助下,学生可以在短期内熟悉理解Datalog语言。最后,课程教师会提供基础的基于Datalog语言的数据库及管理程序,以便于学生在完成整个Datalog语言编译器后可以使用Datalog语言执行数据库查询以测试编译器的正确性。

笔者在具体的课程实践中发现,通过组建团队的形式,大多数学生是可以在一个学期的“编译原理”课程中完成此编译器项目的。

3.3 教学大纲和教案的制定

在笔者的教改方案中,“编译原理”课程的讲授思路已经从原来的重理论轻实践转变为以项目为核心,理论与实践并重。课程的考核方式也由期末闭卷考试转变为基于编译器项目的分阶段考核。针对实践性强的内容,如DFA化简,自上而下语法分析,还会采用课堂小测验的方式进行考查。

笔者对课程内容进行了优化。基本思路就是从传统的面面俱到、相关理论和算法都涉及,到现在的以应用为导向,重点突破。(1)将与编译器项目相关的编译理论和算法作为重点讲授对象。以语法分析为例,相关的算法很多,如果在课程中全部覆盖,哪怕是部分覆盖,都会占用很多时间,而且学生如果没有在实际中应用到这些算法,他们也很难理解和记住。所以课程教师会挑选在项目中实际应用到的自上而下语法分析算法重点讲述。(2)将理论证明作为可选内容,让学有余力的学生按需学习,课程教师提供必要的帮助。对学习课程吃力的学生不做要求。(3)将一部分高级的内容从课程内容中移出,放在针对研究生的“编译原理”课程中。例如,寄存器分配,涉及一些高阶知识,并不适合给本科生讲授。(4)适当补充一些涉及到的知识点。例如,形式语言,与课程相关度高,需要在课程中安排时间给学生补充或复习。

该课程对教材的选用也非常重视。很多“编译原理”课程采用的Alfred V. Aho编著的《编译原理技术和工具》。此书被认为是编译领域的经典教材,将编译原理写得非常深入。然而,笔者认为此书并不一定适合作为普通计算机本科学生的“编译原理”课程,因为本科阶段的“编译原理”课程没有必要涉及很深奥的理论。相比之下,Andrew W. Appel编著的《现代编译原理-C语言描述》更适合课程的需要。同时,在互联网时代,笔者希望可以充分利用网络中的各种电子资料和视频资料,特别是名校的公开课视频,其往往比传统的纸质教材更容易让学生接受。

3.4 教学方法的改进

为了进一步提高教育质量,笔者在“编译原理”课程的教学中采用了一些新的方法:

(1)建设“编译原理”课程网站。网站集合了课程相关的幻灯片、习题、参考资料、课程项目。让学生随时可以获取课程相关信息。

(2)课后设置专门的答疑时间。

(3)反转课堂。鼓励学生上讲台讲解编译知识,课程教师点评。

(4)鼓励学有余力的学生参与编译方面的研究项目。

(5)采用CAI教学,加深学生对编译原理概念的理解。

(6)以学生团队为单位,研究相关的论文并报告。

3.5 实施与效果

笔者在本科生的“编译原理”课程中尝试了本文讨论的教学改革方案,其教学安排见表1。

表1 编译原理课程教学安排

得到以下总结和反馈:

(1)学生上课积极性普遍提高,踊跃参与课堂讨论。

(2)学生对课程项目非常感兴趣,自发讨论不同的解决方案。

(3)课程项目对学生的编程要求较高,有一部分编程基础差的学生对于课程项目实施比较吃力,因而也影响了他们理解课程。

(4)每隔2周1次的课堂小测验对于督促学生学习非常有好处。

(5)由于既要备课、上课,也要负责在课后给学生答疑以及批改作业,课程教师的工作压力较大,建议给“编译原理”这门课配备2个学生助教。

4 结语

“编译原理”课程是计算机专业的核心课程,是所有计算机学生都应该认真掌握的课程。针对目前此课程所面临的困境,我们提出了以一个小型编译器项目为核心、理论与实践并重的“编译原理”课程改革方案。将编译原理和工程实践相结合,旨在提高学生的积极性和参与度,提高整个“编译原理”课程的教学质量。

目前,梧州学院大数据与软件学院有一个招收外国留学生的计算机科学与技术专业,笔者正在筹划将教学改革后的“编译原理”课程加入其专业选修课中,将教改成果向他们推广。

猜你喜欢

编译器原理笔者
基于包络解调原理的低转速滚动轴承故障诊断
老师,别走……
了解咳嗽祛痰原理,有效维护健康
基于相异编译器的安全计算机平台交叉编译环境设计
运行速度大突破华为《方舟编译器》详解
换位思考,教育更精彩
平均场正倒向随机控制系统的最大值原理
老师,你为什么不表扬我
化学反应原理全解读
通用NC代码编译器的设计与实现