“编译原理”实践课程教学方法研究

时间:2022-08-11 01:32:43

“编译原理”实践课程教学方法研究

摘要:本文探讨了目前国内高校“编译原理”实践课程的现状,研究了“编译原理”实践课程的“多层次―多目标―多效果”的教学方法,给出了该方法的实施方案和效果。该项研究对深化高校教学改革,更新实践性教学模式,培养创新型人才具有一定的意义。

关键词:编译原理;实践课程;教学模式;创新型人才

中图分类号:G642 文献标识码:B

编译程序作为连接应用程序和计算机系统的桥梁和纽带,是不可或缺的一个系统软件。具备一定的编译程序设计原理和实现技术也是计算机专业的学生及工作者必备的基础知识和技能。由于“编译原理”课程中涉及形式语言、属性文法等比较抽象的内容,一直被学生认为是较难掌握的一门课程。所以,各高校相应地开设了“编译原理”实践课程,希望借此加强学生对理论知识的理解,建立理论和实际的联系,强化动手能力,促进学生综合素质的提高。

目前,多数高校在“编译原理”实践课教学中采用的都是以实例语言为主导,贯穿整个编译过程的教学模式。经过几年的教学实践,取得了一定的教学效果,但也存在一些问题,比较典型的有以下两种情况:(1)一般的实践教学都是采用统一实验题目,学生分组进行实验的形式进行。实际上,由于学生水平参差不齐,针对统一的题目,一些水平较低的学生容易产生畏难情绪,而一些水平较高的学生则认为题目有些陈旧,没有反映最新的应用要求,导致学习兴趣降低,教学效果不好;(2)由于编译程序是一个系统程序,开发一个完整的编译程序涉及高级程序设计语言、数据结构、算法分析、操作系统、汇编语言、软件开发方法等领域许多内容的综合运用。尤其是高级程序设计语言、软件开发方法等课程,如果基础不好,学生很难完成既定的任务,即使勉强完成,效果也不是很好:有些同学会抄袭他人的程序,有些同学会给出结构混乱的代码。

笔者所在教研室实践了“实例―阶段―循环”的教学方法后,取得了较好的教学效果,在对该方法进行实践、改进、再实践的基础上,提出“多层次―多目标―多效果”教学方法。该方法的中心思想是,针对不同水平的学生设定不同难度的题目,不同的题目有不同的要求,学生在不同的要求下达到不同的效果,从而激发每个学生的学习兴趣,使每个学生都能通过学习而有所收获和提高,真正达到培养创新型人才的目标。本方法对其他具有相似特点的课程也同样适用。

下面从实验准备、实验实施、考核三个阶段阐述“多层次―多目标―多效果”的“编译原理”实践课程教学方法实施的全过程。

1实验准备

“编译原理”实践课程开设的目的是加深学生对编译理论知识的理解,培养学生开发大型软件的能力。为保证实践课取得更好的效果,同时考虑到学生的整体水平和实践课开设的时间,我们认为在正式进行实践教学之前,应该使学生在以下三个方面做好准备:

一是编译基础理论知识的复习。目前,大多数高校的“编译原理”理论教学安排在大三上学期进行,实践教学安排在大三下学期进行。由于理论教学和实践教学是分开进行的,因此常常会有一些基础不好、知识掌握不扎实的学生将已经学过的知识忘记,还有的学生理论知识掌握得比较好,但无法在理论知识和实际软件开发之间建立联系。所以在学生正式动手之前,有必要由专业指导教师进行理论知识的讲解,并通过一些浅显易懂的例子说明如何在抽象理论和实际实现之间建立联系,帮助学生明确任务需求。

二是高级程序设计语言编程能力的培养。高级程序设计语言的编译程序是一个庞大的系统程序,工作量较大,学生必须熟练地掌握编译的理论知识和程序设计技能。然而,笔者从几年的实践发现,有一部分学生没能按时完成编译实验的原因是“高级语言程序设计”课程的学习不够扎实,编程能力较弱。针对这一现象,我们加强了教师的辅导,即将开发编译程序中可能用到的相关编程知识提前加以辅导,例如文件相关的操作、指针、数组、结构体等数据结构的设计和使用等,唤醒学生的记忆,提高编程的速度。

三是软件开发方法的培训。在以往的教学中,我们经常会遇到这样的情况,即教师讲解完实验目的和要求之后,仍会有一小部分学生不知从何处下手,还有的学生一拿到题目就动手编程,根本不做分析和设计,代码通不过测试时,又东一块西一块地对代码进行修正,最后导致代码一团糟,自己都看不懂。针对以上这些情况,我们倡导学生在实践中严格采用软件工程的思想进行设计和操作,实践证明,效果较好。

2实验实施

“编译原理”实践课程的主要内容是要求学生按照编译程序功能结构的划分,完成某个程序语言的词法分析、语法分析、语义分析和代码生成程序,从而熟悉各个阶段的功能和经典算法。本方法在实施阶段的重点主要体现在两个方面:题目多样化和实现工程化。

2.1题目多样化

“编译原理”实践课程的目的是使学生在掌握编译程序设计基本理论的基础上,能够针对具体的程序设计语言设计并开发出一个可用的编译程序。由于当前流行的语言都比较庞大,不易处理,因此多数高校都采用小的实例语言模型的方法,较常用的实例语言有PL/0、SNL、tiny C、mini C等。前两种是Pascal语言的子集,语言具有良好的结构性,但由于Pascal语言在教学和应用中已经很少使用,学生对其语法不熟悉,因此PL/0、SNL不适合继续作为实例语言。C语言及其变种C++语言,以及近似的Java语言是应用中采用较多的语言,学生对其语法、程序结构、语言特性等都有一定了解,所以C语言的子集比较适合作为实践课程的教学语言。但即使是C语言的子集,其编译程序也是非常庞大的,一些基础较差的学生仍然感觉比较吃力,无法完成整个程序,而对于一些基础较好的学生,则认为当今主流的程序语言都是面向对象的,特别希望掌握面向对象语言的翻译机制。

针对目前学生人数增多,学生质量参差不齐,教学质量和档次得不到保证的情况,本文提出“多层次―多目标―多效果”的教学方法。首先由任课教师将题目分为较低难度、正常难度、较高难度三个等级,难度主要体现在实例语言的语法和语义功能上。

较低难度的语言是指具有表达式语法结构及算术运算、关系运算功能的语言,记为Le,由于没有声明部分,因此Le的语义比较简单。其语法如下:

程序P ::= E

表达式E ::= c | id | (E) | E + E | E * E | E < E | E > E | E = E

正常难度的语言是指具有语句语法结构及子程序功能的语言,记为Ls,其语法如下:

程序P ::= D;S

声明D ::= Dctv;Df

Dctv ::= Dc; Dt; Dv

Dc ::= const id C | Dc; Dc

Dt ::= type id T | Dt; Dt

Dv ::= var id T | Dv; Dv

Df ::= fun T id module | Df; Df

module ::= params D S

param ::= param id:T

params ::= param | param; params

语句 S ::= skip | ass(id,E) | read(id) | write(E) | if(E, S1, S2) | while(E,S)| seq(S1, S2) | block(Dctv,S) |

call(id, E1, …, En)

语言Ls在语言Le的基础上,增加了声明、语句、函数等功能,相应地增加了语义处理、代码生成的难度和复杂性。

较高难度的语言是指加入面向对象机制的语言,记为Lo,Lo的词法、语法分析与Ls的词法、语法分析难度相当,但由于对象机制的加入,Lo的语义分析和代码生成部分都要增加一些特殊的处理。Lo语法如下:

Prog ::= ClassDecList; VarDecPart; Body

ClassDecList ::= ClassDec |

ClassDec ; ClassDecList

ClassDec::= class cname ;

[super cname;]

[insvar IVDecList;]

[insmethod IMDecList]

end

IVDecList ::= IVDec | IVDec; IVDecList

IVDec ::= VarDec

IMDecList ::= IMDec | IMDec; IMDecList

IMDec ::= Type mid  ParamDecPart  FunBody

ParamDecPart ::= VarDecPart

FunBody ::= VarDecPart; Body

VarDecPart ::= var VarDecList

VarDecList ::= VarDec | VarDec; VarDecList

VarDec ::= id:Type

Type::= cname | integer | bool

Body ::= begin StmList end

StmList ::= Stm | Stm; StmList

Stm ::= newid, cname |

receivermidRParamList | id = Exp |

if (Exp, StmList, StmList)| delete (id)

RParamList ::= Exp | Exp, RParamList

receiver ::= id | self

Exp ::= n | x | tt | ff | id.id | Exp+Exp | Exp

由于在题目选择上增加了灵活性,学生可以根据自己的实力和兴趣选做不同的题目,极大地提高了他们的学习积极性。同时对于各个题目以及各个题目每个阶段的实现方案,学生可以自由发挥,充分发挥想象力和创造力,无论对于基础较好的学生还是一般的学生,都能达到很好的锻炼目的。

2.2实现工程化

实践课的目的是使学生能够真正运用所学的知识去解决实际问题,是理论知识的升华。这就要求学生在掌握编译原理的基础上,能够针对具体的程序语言设计并开发出可用的编译程序。作为一个庞大而复杂的系统程序,编译程序的开发应该遵循软件工程的思想和规范的软件开发过程,才能保证开发出的编译程序具有较好的质量和可维护性,同时实践的过程也是对学生软件开发实战的一次演练。具体措施如下:

(1) 由于编译程序较大,课上时间又有限,所以实验采用分组进行的方式,每个小组由4~5名学生组成,分工协作共同完成。在分工协作的过程中,特别强调明确任务划分,统一命名规则,重视接口设计等关键问题。

(2) 在开发过程中,遵循需求、设计、实现、测试等标准的软件过程,要求学生在相应的阶段给出相应的文档,明确每个阶段要完成的任务,以及相应的解决方案。

3实验考核

“编译原理”实践课程的一个难点在于如何对成绩进行评定,因为任何一个语言的编译程序都存在代码较长、无法当堂测试的情况。因此,常规考察都是要求学生每个编译阶段提交一个阶段性程序或在最后阶段提交一个完整的编译程序。经过几年的教学实践,我们发现考核中经常会出现部分代码雷同和相似的现象,对于成绩的评定和考试的公平性有一定的阻碍和影响。采用“多层次―多目标―多效果”的教学方法后,更是对成绩的公平性提出了较大的挑战。显然,绝对的公平是不存在的,只能在尽可能大的范围内保证公平。本着公开、公正的原则,我们提出阶段考核和汇总考核相结合的成绩评定方法,并且采用加权形式,不同难度的题目,其权值也不同。不论哪种难度的题目,都按照编译过程划分成几个阶段,并规定每个阶段完成的时间。每到一个规定时间,就对学生的当前阶段成果进行考核,提供合理化建议,并对考核结果进行记录,作为汇总考核的参考。在汇总考核阶段,采取公开答辩的形式,答辩以小组为单位进行,每个小组负责给指导老师和其他同学展示自己编写的程序,并讲解程序的功能、工作过程和创新点。通过以上措施,较好地避免了以往考核中经常出现的剽窃程序或偷懒现象,同时帮助学生树立了荣誉感、责任心和成就感,将人格、品德培养融入教学中,真正做到教书育人。

4结语

笔者经过在本校近三届学生中开展“多层次―多目标―多效果”教学方法的教学活动后,发现教学效果较以往有了很大的提高,不同层次的学生实现了不同的实践目标,不同的实践目标锻炼了不同的能力。任课教师和学生普遍反映,由于题目设定科学合理,极大地提高了学生的学习兴趣,兴趣带动了能力的提高,能力的提高促进了创新性成果的产生,形成了很好的良性循环。

参考文献:

[1] 金成植. 编译原理实现技术[M]. 北京:高等教育出版社,2007.

[2] 刘磊. 编译程序的设计与实现[M]. 北京:高等教育出版社,2003.

[3] 赵曦.“编译原理”实验教学改革初探[J]. 实验室科学,2006,8(4):26-27.

[4] 朱莉. 改革实验教学,培养创新能力[J]. 实验技术与管理,2003,20(1):70-72.

[5] 方凯晴. 计算机专业实验教学改革的探讨[J]. 实验室研究与探索,2002,21(1):6-8.

[6] 刘平安. 改革实践性教学模式 加强学生工程素质培养[J]. 机械工业高教研究. 2002(4):42-45.

[7] 张晶,杨冬,郭德贵,等. 编译原理实践课程教学方法研究[J]. 吉林大学学报:信息科学版,2005,8(23):142-144.

上一篇:在创新环境中培养具有个性化的本科生 下一篇:计算机和法律复合型人才本科阶段培养的研究