吉 梅,张 静
(1.温州医学院 信息与工程学院,浙江 温州 325035;2.唐山师范学院 教务处,河北 唐山 063000)
编译原理是计算机本科专业的一门重要的专业基础课。该课程所讨论的原理与技术,既适用于程序设计语言的翻译和编译器的构造,也适用于其它系统软件和应用软件的设计与实现。“编译原理”被公认为是计算机专业本科教学中最难教、最难学的课程[1],主要是因为:(1)“编译原理”综合性比较强,涉及的先修课程比较多,包括离散数学、数据结构、汇编语言、程序设计等,对学习者专业基础知识及其掌握要求都比较高;(2)“编译原理”理论性较强,涉及到的一些理论知识抽象深奥、晦涩难懂,如形式语言与自动机理论等。(3)“编译原理”的实践性较强,一般的编译程序都比较复杂且规模庞大,教师很难在有限的课时内把编译器涉及的各个细节都讲透彻。
由于各个学校软硬件基础的原因,很多高校都把培养的重点放在理论教学上,实验课时安排得很少,有的甚至根本未开设实验课。这使得学生很少有机会理论联系实际,缺乏程序编译的直观感受,学习兴趣不高。
由于编译原理课程中涉及到很多的概念、定理,再加上一些复杂的算法,课程内容显得比较枯燥。尽管很多高校也提出了一些教学改革方案,如比喻式教学法、启发式教学法、构建多媒体教学环境等,在一定程度上调动了学习的积极性,但课堂效果总的来说还是不明显。
大部分学校将实验内容安排在词法分析器、语法分析器的构造上,而对编译器后端语义分析及代码生成部分内容涉及较少。同时,实验项目的选取一般都以孤立算法的实现为主,较少要求去完成一个规模型的编译项目设计与现实,直接导致学习者对编译程序的总体把握不够。
通常在编译原理理论教学过程中并不涉及编译器的具体实现[2]。由于理论知识的讲解与学习都是采用自然语言进行实际应用中则要采用计算机编程语言来实现,对于学生而言,从理解理论并且可以套用公式解题到能够编程实现存在一个巨大的鸿沟。因此,在上机实践时很多学生没有思路,感到无从下手。
项目驱动教学法以项目为核心,由教师根据各个阶段的教学目标提出项目设计任务,针对所提出的问题,采取演示或讲解等方式,给出完成项目的思路和方法,逐步引导学生边学边练,并通过协同合作实践来完成整个项目的目标[3]。通过将一个具体的实践项目贯穿到整个编译原理课程的教学过程中,以具体的实例让学生能在学习这门课程各个章节内涵的同时逐步提高他们学习的兴趣,以至最终理解并真正掌握编译原理技术。
与传统的教学方法相比,“项目驱动法”能更大地激发学生的学习兴趣和求知欲望[4],促使学生主动学习,充分挖掘学生的创造潜能,提高学生的思维能力、实践动手能力以及团队协作能力。
项目设计是整个项目驱动教学过程的关键。为了让学生能够掌握编译器的各个环节,采用自定义的简单绘图语言,以该语言编译器的实现为项目贯穿整个教学过程。
在学生了解编译程序的结构之后,提出项目任务,演示、讲解完成项目的思路和方法,让学生对整个项目有一个总体、初步的认识。
在运用多媒体教学手段、比喻式教学、启发式教学外,将项目的具体实现引入课堂。在理论教学的同时,适当介绍算法的具体实现以避免理论与实践的脱节。例如,在讲解词法分析的同时,介绍该绘图语言词法分析器的设计与实现。该绘图语言分为关键字、常量、标识符、界符和其他五类单词,各单词的词法规则如下:
(1)关键字。该语言只有 For、Next、Point、Line、Circle和Scale几个有限的关键字。其中For-Next用于循环语句;Point、Line和Circle用于绘制图形的方法;Scale用于定制图形的坐标系统。
(2)标识符:以英文字母开头的字母数字串。
(3)常量:非零开头的正整数,用来表示图形的坐标。
(4)界符:如分号、小括号等。
(5)其他:如空格、注释(支持Java单行注释)等。
在给出词法规则后,将语言的词法规则用正规式的形式描述单词,并利用 ANTLR构造该词法分析程序,然后对ANTLR自动构造的词法分析程序进行分析和测试,从而使学生理解整个词法分析过程。其ANTLR描述如图1所示。
图1 绘图语言词法规则的ANTLR描述
为了让学生能够整体把握编译技术,将项目分成不同的模块,每个模块都是一个独立的插件。在每一个阶段的练习中,我们将提供其它模块的代码,让学生立即看到运行效果,同时产生成就感,从而提高他们的编程兴趣。
在整个教学过程中,可以将知识点分解到不同的学习阶段并形成不同的模块,分别交给不同的学生组合去具体负责相应的模块实现,使学生都能够切实感受到知识应用的效果,使之加深理解,并以此来提高学习者的兴趣。
对于基础差、确实无力完成实验要求的学生,提供标准代码,要求能够看懂,能够讲解就给达标。
通过分析编译原理课程的特征、教学中存在的问题,提出了项目驱动教学法在编译原理课程教学中的应用。