编译原理课程教学论文

2022-05-14

近日小编精心整理了《编译原理课程教学论文(精选3篇)》,供大家阅读,更多内容可以运用本站顶部的搜索功能。摘要:结合编译原理课程教学工作,从课程特点、教学内容的合理取舍、语法和语义分析等难点内容的讲授方式、实验内容的设计等方面进行深入探讨,对教学过程进行总结,讲述如何提高教学质量。关键词:编译原理;课程内容;实验环节0引言编译原理是计算机专业本科生的重要核心课程,通常开设在大学3年级。

第一篇:编译原理课程教学论文

“编译原理”课程的教学研究

摘要:“编译原理”课程是计算机科学及相关专业的一门重要专业基础课程,但由于其理论抽象、算法复杂,加上目前本科学生中普遍存在的各种思想误区,教学效果不甚理想。本文针对这一现状,从如何提高学生学习兴趣,搞好课堂教学,加强实践环节等方面入手,提出了相应的对策。

关键词:编译原理;课堂教学;实践教学

“编译原理”课程是计算机专业必修的一门重要的专业基础课程,也是计算机系统软件中非常重要的一个分支。学习和掌握编译程序的基本构造原理和实现技术,将为计算机专业学生进一步学习、研究和工作奠定坚实的专业理论基础。但该课程内容有一定深度和难度,涉及其他课程知识较多,学生在学习过程中感到内容抽象、算法复杂,因此,“编译原理”被普遍看作是计算机本科教学中既难教又难学的一门课程。这主要是因为:(1)本课建立在多门前修课程基础上,并要为后续课程提供理论和实践基础。这些理论的学习有一定难度,学生要在编译课程中融会贯通比较困难;(2)本课程涉及的算法多而复杂,学生想深刻理解算法的思想很困难;(3)学生普遍认为学习该课程仅是为了构造编译程序,很难认识到其在培养自己掌握科学方法和形成严谨思维方面的潜在价值,因此感觉课程枯燥,望而生畏。

针对以上情况,笔者借鉴国内外“编译原理”课程的教学经验,对如何改进教学方法和提高教学效果做了一些研究和探索,并取得了良好的效果。

1明确教学目标,提高学生学习兴趣

“编译原理”课程专门介绍如何将高级语言翻译为低级语言的编译程序的工作原理和方法。不同于一般的应用程序,编译程序是一个十分庞大和复杂的系统软件,它所包含的算法建立在高级语言或汇编语言基础上,综合运用编译理论及多门前修课程,如“数据结构”、“离散数学”、“计算机组成原理”等相关知识,解决高级语言在机器上运行的实际问题。因此,这门课程也可以看作是“软件工程”学习的一个实例。这门课程的内容丰富,各部分内容间具有严密的逻辑性,不但可以使学生真正了解计算机的工作过程,认识计算机信息处理的实质,还可以综合运用所学的软件设计技术分析解决问题,提高计算机软件素质。

作为系统软件,编译程序在性能上有严格的要求,这使得它的算法都很经典、高效,而这些算法、思想和实现技术也可广泛应用于一般软件的设计实现,对提高学生元级程序的设计能力和开发大型软件的能力是十分有益的。如正规式在XML查询技术中的广泛应用、有穷自动机在字符串查找中的运用、必经节点算法在网络中的运用、由文法来定义网络协议等。教师可以鼓励学生尝试将编译程序中的各种算法和技术应用到各个领域,激发学生的创造性思维,培养学生的创新能力。

2注重理论教学,开拓学生学习视野

“编译原理”的理论性强,内容丰富且抽象,具有严密的逻辑性,应用其他课程知识比较多。要在有限的课时内很好地完成本课程的教学,除了要注重教学的方式方法外,还要优化教学内容,将理论性与实践性相结合、时代性与实用性相结合、科学性与通俗性相结合。

2.1把握联系,启发学生积极思维

“编译原理”是一门综合性很强的课程,它的理论教学首先要考虑、分析各门课程的内在联系,增强课程的总体效能,达到事半功倍的效果。

“编译原理”与前修课程间的联系如图1所示。作为“编译原理”课程的前修课,如程序设计语言、形式语言与自动机、算法设计与分析等,既是编译技术理论的基础,也是编译技术的分析对象和实现手段。教师可以从知识体系的内部结构入手,将先修课程的内容贯穿始终,并不断强化和深入,以加强课程的系统性,培养学生的全局观。同时还要把握编译过程各个功能阶段的内在联系和规律,有目的地设计问题,有意义地提出问题,通过问题把编译原理中的理论难点、抽象概念引导出来,学生通过回答问题,从不同的角度寻求解决问题的原则、途径和方法,加深对编译理论和技术的理解。

2.2实例演示,形象化抽象理论

“编译原理”的概念和定理很多,再加上大量复杂的算法,抽象程度很高,要获得良好的教学效果,必须借助形象化教学手段,使抽象的理论具体化。

一方面,形象化教学可以通过实例类比来实现。例如,把编译原理与某种高级语言(如C语言),甚至可以是自然语言(如英语)联系起来,用课堂上学到的理论知识对该语言的语法和词法结构加以分析。这样不仅可以使学生深入了解高级语言的工作原理,做到知其然更知其所以然,更能使学生切实体会到编译原理的实用价值。如编译原理中词法分析的学习就可以以C语言中的实数为例,画出能够识别实数的状态识别图,并用程序实现。通过这个简单实例,学生很快就能了解词法分析在整个编译过程中的作用。

另一方面,教师可以借助多媒体辅助教学,把原理性的重点知识以动画、图形形式呈现给学生,化静为动,寓教于乐。为此我们编制了一些多媒体课件,用Flash技术生动形象地演示抽象概念和算法,同时向学生推荐网上优秀的“编译原理”课程教学网站、电子书、算法等资源,拓宽学生视野,培养和激发学生的学习兴趣。

2.3与时俱进,优化教学内容

编译技术是计算机语言发展的支柱,也是计算机科学中发展最迅速、最成熟的一个分支。目前国内“编译原理”课程所选用的教材大多偏重于介绍程序设计语言编译程序构造的一般原理和基本实现方法、技术,编译系统大而复杂,编译原理多而深奥。很多学生学习时会受教材的局限和影响,往往花费很大力气去掌握复杂而深奥的理论知识,而不是实际动手去构造具体的小型编译器,使理论与实践完全脱节。因此,教学要坚持理论和实践相结合,课内和课外相结合,融知识传授、能力培养、素质教育于一体。例如,主要算法、例题和习题可以以学生最熟悉的C语言为背景,将编译程序模型的实现过程贯穿于各个章节,让学生阅读理解和扩充编译程序,加深对所学内容的理解。

此外,教师还要坚持教学和科研相结合,将最新教改和科研成果引入教学,将经典编译理论与现代编译技术有机地结合起来,激发学生对编译新技术的学习兴趣。例如,程序设计语言已经从结构设计语言(如C语言)发展到面向对象程序设计语言(C++、C#),讲授一些经典的编译理论应用在新一代高级程序设计语言中的实例,会激发学生更大的学习热情。同时,向学生介绍编译技术在人工智能、并行计算、自然语言处理等领域的具体应用,也会为后续课程做好铺垫,奠定坚实的理论基础。

3加强实践教学,激发学生主体意识

“编译原理”是一门对实践要求较高的课程。编译程序以程序为操作对象,是由多个完成不同功能、执行在不同阶段的子程序组成的复杂系统,各个阶段具有不同的特点。即使学生理解了不同阶段各个子程序的功能和特定方法,但如何衔接各个子程序,组成一个完整的编译器,对学生来讲仍可能是一件困难的事情。

基于此,本课程的实践教学设计要充分考虑编译理论与实际应用的结合,突出阶段性和实用性。如将编译器的实验过程分为4个阶段,每个实验阶段安排在对应阶段的理论课结束时开始,实验以小组为单位进行,每阶段都有文档提交和审查评分,最后将不同阶段的各个子程序衔接起来,完成整个编译器的分析设计,实践课的成绩以40%计入总评成绩。这样,开发过程可以引入软件工程的理论,注入结构化程序设计思想,将整个系统模块化,合理组织不同能力层次的学生分组开发各个功能模块,鼓励所有学生共同参与,相互探讨,协作完成,共同提高。同时,要特别加强实验中的督促环节,各阶段的设计实现要严格控制实现进度和质量,培养学生良好严谨的软件开发风格。

4结束语

本文就如何改进“编译原理”课程的教学方法,提高教学效果做了一些研究和探索,从培养学生兴趣入手,对理论教学和实践教学中存在的问题和相应的对策进行了讨论。实践证明,这些方法能更好地提高学生对“编译原理”课程学习的兴趣,提高教学质量。

参考文献:

[1] 张素琴. 斯坦福大学计算机科学系的编译原理课程分析[J]. 计算机教育,2004(1):79.

[2] 黄贤英,刘贞,刘全利.“编译原理”课程的地位及教改思路[J]. 重庆科技学院学报:社会科学版,2005(3):103-105.

[3] 何炎祥,伍春香. 现代教学理论指导下的“编译原理”教学综合改革[J]. 计算机教育,2005(3):10-13.

[4] 刘磊,金英,王胜军,等. 编译原理多媒体辅助教学软件的设计与实现[J]. 吉林大学学报:信息科学版,2002(6):54-58.

[5] 张昱,陈意云,郑启龙. 编译原理课程的教学方法和教材建设[J]. 中国大学教学,2005(7):61-62.

[6] 李冬梅,施海虎. 编译原理[M]. 北京:人民邮电出版社,2006.

[7] 刘磊,郭德贵.“编译原理”课程建设研究[J]. 计算机教育,2006(6):8-10.

[8] 王一宾. 基于面向对象的编译原理实验的研究[J]. 安庆师范学院学报:自然科学版,2002(11):84-85.

Researches on the Instruction of Compiling Principles

HUO Huan, PENG Dun-lu, ZHANG Yan

(School of Optical-Electrical and Computer Engineering, University of Shanghai for Science and Technology, Shanghai 200093, China)

Key words: compiling principle; course teaching; experiments organization

作者:霍 欢 彭敦陆 张 艳

第二篇:编译原理课程教学之思考

摘要:结合编译原理课程教学工作,从课程特点、教学内容的合理取舍、语法和语义分析等难点内容的讲授方式、实验内容的设计等方面进行深入探讨,对教学过程进行总结,讲述如何提高教学质量。

关键词:编译原理;课程内容;实验环节

0 引言

编译原理是计算机专业本科生的重要核心课程,通常开设在大学3年级。编译器是计算机3大系统软件之一,其构造原理和技术是计算机科学技术领域的重要组成部分。虽然绝大多数计算机专业学生未来不可能去构造或维护一个主流程序设计语言的编译器,但与编译原理相关的模型、理论和算法可以用在多种应用领域,将对研究开发产生有益的影响。学习该课程可以培养学生抽象思维、独立解决复杂问题、编程和调试等涉及多门专业课程知识的综合应用能力。

编译原理课程内容抽象、理论性强、形式化方法不易理解,对学生编程实践有较高的要求。对于教师而言,如何在有限的学时内优化教学内容,合理安排实验环节,是值得探讨的问题。

1 课程特点

编译领域里的经典教材作者Alfred V.Aho认为编写编译器的原理和技术还可以用于编译器设计之外的众多领域,这些原理和技术通常会在一个计算机科学家的职业生涯中多次被用到。这句话给出了编译原理课程的教学定位——兼具理论与实践两方面的高要求。

编译器构造各阶段的工作均有其抽象理论基础,涉及多种数学模型,词法分析阶段涉及正则表达式与有穷状态自动机理论;语法分析阶段涉及上下文无关文法;语义分析阶段涉及属性文法、类型系统;而树形结构是表示程序语法结构以及源程序到中间代码翻译的重要模型。编译器中的算法研究同样重要,必须考虑算法的功能、通用性,其中语法分析阶段的算法最为典型,依次引入了一系列算法。而编译器开发的实践性强,需要学生实际动手实现一个规模较大的编译器,这本身是一个较复杂的软件工程项目,必须考虑子模块划分、模块之间信息传递、算法效率、编译器构造自动工具等多方面因素。

编译原理融合多门专业课程,包括来自于计算机科学不同领域的思想,如高级语言程序设计、形式语言与自动机理论、数据结构中树及图形算法;操作系统中存储分配方式、人工智能中的贪婪算法、启发式搜索技术;汇编指令系统等。编译原理和高级语言程序设计联系紧密,学好该门课程有利于学生对程序设计语言的理解,可以迅速掌握新的语言工具,在遇到新的程序语言时,学生不会因为没有学过某一门语言而无从人手,这对学生今后从事软件开发工作有重要价值。编译原理课程蕴含着计算机学科中解决问题的思路和方法。学习编译原理课程,不仅要学习如何构造编译器,还要学习解决复杂和开放性问题的一般方法,从中接受的思维训练将会在今后的学习、工作中逐渐体现其价值。

2 合理安排课程内容,突出重点,注重方法

厦门大学计算机科学系的编译原理课程历年采用经典编译教材“编译原理、技术与工具”,其中讲解的核心编译原理是教学内容的重要部分,包括词法分析、语法分析、语义分析、中间代码生成以及运行时环境、优化和代码生成方法的基本技术,教材中对编译前端的技术进行了详细的阐述,但在一个学期60~64学时课堂讲授中,往往无法详尽地介绍所有内容,需要突出重点,对某些章节适当选择。

例如,运行时环境中有关源程序语言相关问题的讨论、非局部命名的访问、参数传递等高级程序语言设计可略讲,向学生列举这些技术在哪些相关课程、书籍或文献中找到参考,拓宽学生思路,培养其自学能力。代码生成、代码优化等编译器后端技术限于学时数,往往涉及甚少,匆匆带过。而这一部分内容对于编译器构造十分重要,关系到生成代码的质量,也是现代编译技术的研究重点。在教学中可介绍代码优化的主要来源、几种经典的优化方法,优化的主要数据结构和实现技术,让学生对这部分知识有所了解,便于将来深入学习。

又如,语法分析方法是编译教学的重点,详细介绍自顶向下分析和自底向上分析,LR分析中有LR(0)、SLR、LR(1)、LALR不同方法,若拘泥于教材逐一讲授,学生较难接受,没有头绪。教师注重讲授方法,在讲解过程中不断提出问题,寻求解决技术及其背后的原理。在语法分析讲授中先介绍递归子程序法,可以用该方法编写某些语法的语法分析器,但这必须对于每个文法手工编写相应的编译程序,教师提出是否可以找到非递归的自动生成语法分析器的方法问题,由此引出LL(1)分析方法。进一步提出LL(1)分析方法适应的文法是有限定的,是否有更普遍适用的分析方法问题,由此引出自底向上的LR分析方法,从SLR、LR(1)到LALR方法,每一种分析方法的引入相互关联。这一方法能够保证语法分析这一要点有清晰的脉络贯穿,让学生能把握这一主线。

语法制导定义及翻译方案的设计是教学的重点和难点,也是学生学习中反映困难最大的内容。因为它没有普适的一般方法,本质上是一种事件驱动的程序设计,这对于3、4年级的本科生较难掌握。如何把握课程难点的讲授,值得深入探讨。这一部分内容教师采用“归纳法”,在讲解过程中围绕语义描述和计算问题,结合具体实例寻求解决技术,阐述语法制导定义和翻译的作用,强调这些技术将运用于解决类型分析和中间代码生成的语义问题。可以将语义规则求值方法归纳为4点:

(1)由下向上计算S属性定义:用带属性值的语法分析栈实现;

(2)由上向下计算L属性定义:消除左递归后引入继承属性,扩充递归的语法分析器,可以实现预测翻译器;

(3)由下向上计算继承属性:用加标记非终结符的方法,使得嵌入产生式右部的语义动作全部出现在产生式末尾,从而能在归约之前执行语义动作;

(4)遍历分析树的翻译方法,上述3种翻译方法均和语法分析同时进行,但不是所有的SDD都能在语法分析同时完成,给出一般化的求值方法,先建立带语义动作的语法分析树,后遍历执行语义动作,要求属性依赖关系图无环。

这一讲解方法能更好地帮助学生理解抽象的问题,提高分析和综合能力。

3 精心设计实践环节

编译原理是实践性很强的课程,要真正理解编译系统,单纯依靠课堂讲解理论知识是不够的。实验课程是培养学生实践能力,巩固和验证所学理论知识,培养学生分析问题、解决问题能力的重要环节。通过实验环节,使学生对编译程序各功能部分间的接口有更好地理解,对算法的实现细节更明了。

在理想的情况下,完成一个完整的编译系统构造,从词法分析到目标代码生成,直至汇编程序的执行,这有助于真正理解整个编译过程,以及系统的运行过程。但在实际教学过程中,限于课时安排,实验课和课堂讲授同步进行,通常只能完成到中间代码生成阶段。编译程序构造是复杂的程序开发,不可能在课堂教学中把所有细节讲清楚,学生往往难以人手,在有限的时间内,实验的效果不好。为了达到好的实验效果,促进学生对编译原理的理解,教师从以下几个方面开展实验环节教学实践:

(1)注重自动工具的使用。利用kex/Yacc编译器自动生成工具,先实现简单的程序(如算术表达式的转换/求值、HTML文件转化成纯文本文件、C源程序格式化转化),所需知识限于正则表达式和自动生成工具本身的使用方法,对语义分析知识要求较少,可以提供相关的资料和网上相关教程,学生易于入手。目的是使学生体会到编译原理的实用性,提高学习兴趣,并获得编译器自动生成工具的使用经验,提高解决实际问题的能力。

(2)分阶段进行实验。根据课程的特点和大纲的要求,可以设置4个阶段的实验内容,词法分析器的设计实现、由上向下递归下降分析器的设计实现、利用工具生成的自底向上语法分析器、语义分析和中间代码生成器的设计实现。每个阶段需要利用之前得到的实验成果,逐步完成编译器系统的构造,通过明确的阶段划分,接口的定义,提高编译原理实验的完成质量。

(3)提供编译器源代码。编译器构造是一个具有相当规模和相当复杂度的系统,对于本科学生独立动手编写小型语言的编译器是有难度的。为了帮助学生掌握,结合一个小型语言编译器构造的完整实例,提供编译器构造的源代码,要求学生对源代码进行分析、扩充和改造,有助于学生的理解和掌握编译原理的构造技术。例如Alfred Aho著的“编译原理(第2版)”和“编译原理(本科教学版)”附录均给出了一个用Java语言实现的完整的编译器前端,包括:源语言的文法描述、词法分析器、语法分析器、符号表和类型、表达式的中间代码、布尔表达式的跳转代码、控制流语句的中间代码,实现源程序到等价中间代码的转换。Kenneth C,Louden编著的“编译原理与实践”以Tiny语言编译程序作为范例,结合各章内容讲解Tiny语言编译程序中的相关部分的实现方法。

4 对课程发展的思考

为培养高素质的计算机专业人才,重视软件开发能力的培养至关重要。在编译原理课程中强调理论知识的综合应用和编程实践能力的训练,要求学生针对特定语言(如C语言的子集),从文法出发,设计一个编译器构造方案,并以此为基础开发满足要求的编译器,将其看作软件开发的综合训练的重要一环。

编译原理课程的实践是在理论基础知识的指导下进行。学生在学习基本理论后进行实验系统的设计与实现;教师在掌握系统总体构成和基本原理、方法的基础上提出实验的基本要求。鼓励学生选择适当的方法进行系统设计,包括选择自动化生成方法。为实现相应效果,要求学生在每个实验之前应完成设计、描述解决方法并给出算法、编写出源程序、给出测试实例,实验完成后要求提交。学生对编译课程内容积极投入,绝大多数学生都能够在有限时间内独立完成词法分析和语法分析的实验,较优秀的学生能够独立完成中间代码生成的实验。

在教学过程中也发现了一些不足,编译原理的教学和实验对后端工作不够深入,尤其是实验,往往到中间代码生成阶段已经接近学期末,目标代码(汇编代码)生成、寄存器分配、优化等没有充分时间进行,对综合运用C语言、计算机组成原理、汇编等知识锻炼不够。

5 结语

正所谓“教学相长”,提高编译原理课程教学质量,需要教学双方的共同努力,互相促进。对学生而言,要提高自身学习积极性,敢于提出问题、解决问题;对教师而言,在讲授知识的同时,要注重学生能力的培养,激发学生的学习兴趣,充实教学内容,提升教学质量,在教学实践中不断思考、探索、实践和总结。

参考文献:

[1]Aho A,Sethi R'Ullman J D.编译原理[M],赵建华,译,2版。北京:机械工业出版社,2009

[2]张昱,陈意云,郑启龙,编译原理课程的教学方法和教材建设[J],中国大学教育,2005(7):61-62

[3]Aho A,Sethi R,Ullman J D.编译原理[M],赵建华,译,本科教学版,北京:机械工业出版社,2009

[4]Louden K C.编译原理与实践[M],冯博琴,冯岚,译,北京:机械工业出版社,2001:373-380

(编辑:赵廓)

作者:李慧琪

第三篇:“编译原理”课程教学方法研究与探索

摘要:针对“编译原理”课程教学中存在的内容抽象、算法复杂等问题,分析了现有的一些研究对策,在任务驱动的“编译原理”课程教学方法基础上,结合河南科技大学计算机专业“编译原理”课程教学的实际,讨论了“编译原理”课程理论教学与实验教学的具体实施方案,并探索了实验教学的考核办法,在实际的实施过程中,取得了令教师、学生都比较满意的教学效果。

关键词:任务驱动;编译原理;教学改革;教学实践

作者简介:孙士保(1970-),男,河南固始人,河南科技大学电子信息工程学院,副教授,北京航空航天大学计算机学院博士后(北京 100191)。

(河南 洛阳 471003)

基金项目:本文系河南科技大学教育教学改革项目(项目编号:2009Y-016)的研究成果。

随着信息技术的发展,编译技术已经成为计算机科学中发展最快的分支之一,它体现了计算机技术发展过程中的重要成果。因此,“编译原理”课程是信息类计算机专业的一门专业基础课程,对理论教学和实践教学起着奠基的作用。通过学习编译知识,有助于学生从宏观上把握编程语言;编译技术涉及到计算机的系统结构、指令集结构以及相关的操作系统,掌握编译技术有助于更进一步地理解计算机系统;从软件工程的角度来看,编译器是一个很好的系统软件,它所涉及的算法和技术可直接复用于软件开发的实践中。如正规式和自动机理论在字符串检索中的应用,以及用文法的方法来定义网络协议等,另外,编译技术在软件系统安全、现有程序理解和软件工程中的逆向工程等方面应用广泛。

一、“编译原理”课程教学过程中存在的问题及相应解决办法的探索

“编译原理”课程是理论性和实践性的统一体,其中更倾向于实践。在该门课程的学习过程中涉及到大量抽象的思想和复杂的算法,学生往往难于理解,因此“编译原理”课程是计算机科学与技术专业本科教学中较难的课程之一。原因如下:(1)该门课程涉及的理论知识抽象、深奥,如自动机理论,学生若想完全理解这些知识需要查阅很多相关的文献,这为学生学习增加很多负担。(2)该门课程涉及的一些算法复杂,如自下而上的分析算法LR(k)、向前看的自下而上分析算法LALR(k)等。这些算法计算复杂,涉及内容多,学生掌握它们困难。(3)编译程序是一个系统软件,各个模块之间的接口复杂,学生们往往不能从整体上来理解编译程序。

针对以上种种情况,国内高校中教授“编译原理”课程的教师们从不同角度进行了探索。如文献[1]给出了“编译原理”课程和内容分解的建议;文献[2]设计了“编译原理”课程实践教学的方法;文献[3]介绍的对策可以提高学生学习“编译原理”课程的兴趣;文献[4]对大学生应掌握的编译知识进行了归纳。这些成果对于“编译原理”课程理论或实践教学起到了极大的推动作用,但它们还是采用传统教学模式,即先讲授理论知识,再进行实验验证。为了改变这种教学模式,提高学生学习的积极性和主动性,并把学习编译知识与开发编译器的实践结合起来,文献[5]介绍了河南科技大学从2007级计算机科学与技术专业部分学生中开始采用任务驱动的学习方法。在文献[5]中对实验项目的设计、教学计划的制定、辅导材料的编写、网络资源信息平台的构建、教学资料的开发等进行了探讨。本文在文献[5]的基础上对“编译原理”课程的理论教学和实践教学的具体实施方案进行讨论,以强化任务驱动教学过程中边实践边学习的教学方案,提高“编译原理”的教学效果。

二、“编译原理”课程教学方法研究与探索

1.提高学生学习的兴趣

“编译原理”课程是一门实践性较强的课程,任务驱动的学习方法将以前重理论的教学模式转为重实践的教学模式,通过完成“编译原理”课程中的每一个具体实验反过来再进行书本上理论知识的学习,真正实现学以致用,理论与实践相结合的教学理念,并实现从难懂的理性知识向直观的感性知识的转变。这将极大地调动学生学习的积极性,全面提高学生学习的兴趣。这样学生学习该课程中的原理除了可以用于分析编译器以外,还对诸如“系统结构”、“人工智能”、“并行处理技术”等课程的学习具有指导作用,并且可以更进一步地帮助学生理解和综合应用“离散数学”、“高级语言”、“数据结构”、“汇编语言”等专业基础课程中的知识。

2.合理安排任务驱动的“编译原理”课程教学内容

在河南科技大学教改项目:任务驱动的“编译原理”教学方法研究中,我们根据教学大纲的安排,把源语言编译的工作原理与方法融入一个类C编译器的开发过程当中,根据开发中的需求来驱驶学生学习书本上的编译知识,具体方法安排如下:

(1)根据教学大纲合理设计实验项目。

编译器是一个大的系统软件,学习它主要是掌握编译的方法,所以在设计实验项目时要从整体上来把握它,而不拘泥于某一个实验的细节。对于编译过程中的每一个阶段可以设计一个或多个实验项目,具体每一个项目如何实现不作具体要求。例如,对于语法设计部分是采用自上而下分析还是自下而上分析学生可以自由选择。但实验项目的内容要包括必须掌握的编译知识,还可以设计一些较难的项目留给成绩优异的学生在课后完成,以扩展他们的知识。

(2)制定分阶式教学内容。

为了让学生们能够熟练地掌握任务驱动的“编译原理”课程教学内容,并理解编译过程的工作原理和构造方法,我们把书本相关内容按基本要求和高级要求进行分类,全体学生必须完成基本要求的内容,部分优秀学生可以试探完成高级要求的内容。

“编译原理”课程中学生必须完成基本要求的内容包括:文法和语言部分知识点包括文法、推导/归约、句型、句子、语言;词法分析部分知识点包括状态转换图、正规集、正规表达式、有穷自动机(DFA、NFA)的表示方法及相互转换;语法分析部分知识点包括递归子程序法、LL(1)分析法、LR分析法中的SLR(1)和LR(1)的构建方法;语法制导翻译和中间代码生成部分知识点包括四种常见的中间代码:逆波兰式、四元式、三元式、三地址码;符号表部分知识点包括符号表的组织方式;目标程序运行时的存储组织部分知识点包括静态分配策略;代码优化部分知识点包括局部优化达到全局优化的目的;代码生成部分知识点包括目标代码生成算法。部分优秀学生可以试探完成高级要求的内容包括:文法和语言部分包括规范推导、规范归约、句柄、上下文无关文法、语法树、二义性;词法分析部分包括正规文法、正规式向有穷自动机(DFA、NFA)的转换;语法分析部分包括算符优先分析法和优先函数、LR分析法的LALR(1)的构建方法;语法制导翻译和中间代码生成部分包括常见的语法成分的翻译;符号表部分包括符号表的查找算法;目标程序运行时的存储组织部分包括动态栈式分配策略;代码优化部分包括循环优化以达到全局优化的目的。

(3)适时编写该课程的辅导材料和构建相应的网络资源信息平台。

课后作业是对书本知识的巩固与复习,为了帮助学生更好地掌握编译知识,我们针对书本重点和难点编写了一套学习指导,并给出了相应的习题解析。

任务驱动的“编译原理”课程教学研究从2008年开始,并在河南科技大学电子信息工程学院2007级计算机科学与技术专业学生开始实施。“编译原理”重点建设课程网站于2009年3月建立,全部电子教案、教学大纲、教学计划、课程知识体系、考研试题库和学习辅导材料在网站建立后就发布到了网站上,学生可以在网上随时下载这些资料,并可以在交流区与老师或同学交流学习中遇到的问题或分享各种经验与乐趣;该门课程的评价体系采用网上测评和河南科技大学教务处网站上学生评教的方式进行,让教师随时掌握学生对该课程的意见和建议,并及时调整教学进度或方法;友情链接可以链接到国内一些学校“编译原理“精品课程网站,实现该课程资源共享,为学生课后复习及深入研究提供了丰富的资源。为了在学生中尽快实施任务驱动的“编译原理”课程改革成果,2009年9月河南科技大学计算机专业大三学生开始试行该方案,通过实验项目的实施与相关理论知识的讲授,与此同时,找出部分优秀学生,让他们参与实验项目设计、实施和评价的全过程,并多方听取学生的意见,逐步改进该方法的不足之处,该方法越来越趋于完善。

3.灵活运用现代化的教学手段

“编译原理”课程算法和图形多,其中算法步骤复杂而且抽象,因此要想让绝大多数学生掌握编译知识,必须借助现代化的教学手段,使抽象的理论知识感性化,感性知识娱乐化,让学生在玩中学、乐中学。因此我们编制了一套把难懂的编译知识融于动画效果的多媒体课件,它可以把抽象的算法和理论知识用生动的动画形式表示出来,在讲课的过程中配合板书,细化教学内容,提高教学效果。课后向学生推荐目前全国著名高校“编译原理”精品课程网站,如中山大学“编译原理”精品课程网站,网站上有一些实验教学项目和具体实施方案,我们可以借鉴它们的方案来调整自己的实验项目及实施方案。充分利用校园网等网络资源,积极开展网上辅导,定时在网上与学生交流,通过邮件等形式为学生解答学习过程中的各种疑难问题。总之,学校可以根据现有的技术条件为学生学习“编译原理”提供全方位的帮助。

三、“编译原理”课程实践教学方法研究与探索

任务驱动的“编译原理”课程教学研究以实践为主导,实验效果的好坏直接关系着研究项目的成败,也直接体现了计算机科学与技术专业教学大纲的优劣,这种思想适应现代工程技术型专业教学的需要。因此我们首先提出任务,设计实验项目;然后讲授相关理论知识;最后通过实验验证,经过两年多的实践证明该方法教学效果良好。但该项研究在实施的过程中也遇到了新的问题:有些学生很快完成任务,有些学生完不成任务。针对这种情况,我们提出多层次、多目标的思想,即确定全体学生必须完成的基础任务,然后再设定扩展任务,扩展任务分多个等级,难度各不相同,要求也不相同,学生可以按照自己的能力完成不同等级的任务,由于最后效果不同,所以成绩也有区别。以下从任务驱动的“编译原理”课程实验项目准备、实验项目实施、实验过程监督与评价三个阶段讲述多层次、多目标的“编译原理”实践课程教学全过程。

1.任务驱动的“编译原理”课程实验项目准备

河南科技大学计算机科学与技术专业的“编译原理”课程是在本科三年级第一学期开设的,学生们在二年级已经完成“高级语言程序设计”、“数据结构”、“算法设计与分析”等课程的学习,他们已经具备基本的编程能力。任务驱动的“编译原理”课程是为了向学生系统讲授编译知识、并培养学生开发较大规模软件的能力。为保证实验课的顺利开展和学生水平的稳步提高,我们在“编译原理”课程开设之前,让学生在以下两个方面做好准备:

(1)熟练掌握高级程序设计语言编程技术。

提高高级程序设计语言编程能力是一个系统工程,它需要在一定的时间范围内持续地培养,河南科技大学计算机科学与技术专业学生在学习“高级语言程序设计”后有两周时间的“程序设计课程设计”,该课程主要是让学生完成一些简单的程序,如:多功能计算器、文件移位加密与解密、本班同学通讯录、万年历系统、图书管理系统、一个课题随机选题程序的设计等;学生学习过“数据结构”后同样有两周的“数据结构课程设计”,该课程让学生们完成难度较大的程序,如:运动会分数统计、飞机订票系统、简易文本编辑器、校园导航、数制转换问题等;学生学习过“算法设计与分析”后也有两周的“软件专题训练”,该课程让学生在一定的编程基础上完成中等难度的算法设计问题,如:马的Hamilton周游路线问题、罗密欧与朱丽叶的迷宫问题、独立钻石跳棋问题、n2-1谜问题等。通过这些课程设计的训练,学生们已经熟练掌握了文件操作、指针操作、数组的使用、结构体与共用体的设计与使用等高级程序设计语言编程技术。

(2)软件工程开发方法训练。

河南科技大学计算机科学与技术专业学生学习“软件工程”课程是在本科三年级第二学期,因此学生此时还没有系统掌握软件工程的思想。但我们在学生进行的各种课程设计过程中要求他们逐步掌握分析、设计、编码、测试、评价等思想,并运用到每一个具体编程任务中去,经过两年的训练,绝大多数学生掌握了这样的软件工程开发方法,从而改掉了以往教学中拿到题目就动手编程的坏毛病,为今后的各种程序开发提供了技术路线保障。

2.任务驱动的“编译原理”课程实验项目实施

基于任务驱动的“编译原理”课程实验的主要目的是为了让学生自已开发一个类C语言的源程序编译器,该编译器能够完成基本的词法分析、语法分析、语义分析与中间代码生成和代码优化等功能,从而起到锻炼学生的作用。

在任务驱动的“编译原理”课程实验的实施过程中,考虑到目前编程语言非常多,其中C语言学生比较熟悉,因此我们以C语言源程序编译器为依据来进行模仿开发。但由于C语言功能强大,涉及内容太多,短时间内不易完成,所以我们依据C语言的缩小版本,即类C语言。类C语言的数据定义方式、语法、程序结构与C语言及其变种C++语言相似,只是不含嵌套、递归和面向对象等特性。

编译器的开发是一个系统工程,它涉及到编译的各个方面,对于部分基础一般的学生来说完成一个简单的编译器开发是合适的,但对于部分优秀学生来说只完成编译器这些基本功能起不到锻炼的作用。针对目前学生人数多,学生水平参差不齐的特点,我们采用多层次、多目标的教学方法。首先要求全体学生必须完成类C语言编译器的开发,对于部分优秀学生可以在类C语言编译器的基础上增加嵌套、递归和面向对象等特性。这样就把实验任务分为基础目标、扩展目标两个层次,学生可以根据自己的能力、兴趣与爱好选做不同层次的题目,从而达到分段培养、分段锻炼的目的。这样无论对于优秀学生还是普通学生,同样都能起到很好的锻炼作用。

以前我们的实验课内容主要为了验证相关理论知识,而任务驱动的“编译原理”实验目的是为了解决实际工程问题。这样就要求学生在确定了实验内容后,去学习相关的编译理论知识,变被动学习为主动学习。对于编译器这样的系统程序开发必须遵循软件工程的方法,才能保证开发出的编译器程序具有高的质量和好的可维护性。为了顺利完成开发任务,我们采取的措施是:学生可以单独完成,也可以由3~4名学生组成的小组协作完成。在分组时,特别强调组内每个成员任务明确,编程时统一命名机制,统一接口标准等。每人在确定了开发任务后,开发时必须遵循需求分析、系统设计、编程实现、模块测试与集成测试等标准的软件开发过程中的各种规范,还要求他们在每个阶段详细给出对应的文档,并对每个阶段出现的问题及解决方案给出明确的说明,为他们日后检查程序提供必要的技术文档。

3.任务驱动的“编译原理”课程实验项目监督

现在的大学实验课,绝大多数学生能够按照教师的要求完成,但也有部分学生,他们依赖性强,自觉性差,在学习过程中不够刻苦,实验时不愿意多动手,这样很难达到课程实验的要求。如何让自觉性好的学生水平更上一层楼,让自觉性差的学生提高认识,自觉完成实验,是教师必须解决的问题。为了正确引导并督促学生完成各项任务,在实践教学过程中,实验过程的监督是必要的。

任何一个语言的编译程序都存在代码较长、无法当堂测试的问题。采用多层次、多目标的教学方法后,我们采取分散考核的方法,即学生随时完成任务随时提出考核要求,全部任务考核完成再进行成绩汇总。由于确定任务时分为基础任务和扩展任务,所以学生完成不同的任务,考核的成绩也不相同,成绩良好的学生可以提出优秀申请,我们采用公开答辩的方式进行优秀评定。这样在答辩的过程中,等于他把自己如何分析、如何设计、如何实现的全部过程以及他的创新点向全体学生进行了一次公开说明,这对他本人和别的学生都是一个非常好的形式。对于部分基础弱的学生,我们可以在该门课程结束前进行考核,这样让他有更多的时间来完成他的任务,从而更好地达到课程实验的目的。

四、结束语

任务驱动的“编译原理”课程教学方法研究与探索是以课程实践教学为主线,靠不同的实验来带动各章理论知识的学习,这种研究是探索性的,也是开拓性的,学生变被动学习为主动学习,2009年、2010年、2011年已在河南科技大学计算机专业“编译原理”课程教学中实施该教学方法。在实施过程中绝大多数学生表现出极高的热情,并有部分学生参与了该项目的研究工作,项目获得了成功。但在项目实施的过程中也发现了一些问题,主要表现为:(1)本次研究的基础任务中以结构化程序设计语言为主,在扩展任务中包含了面向对象的内容,但绝大多数学生没有完成;(2)在语义分析与代码优化部分有的学生完成不全面;(3)在优秀评定时,申请答辩的学生不多,一方面是时间有限,另一方面学生不积极;(4)考核过程中当一组有3~4名学生时,存在1人完成多人共享的情况。虽说存在问题,但总的来说学生通过该次实验学习的主动性明显提高、教学效果良好。

目前项目组成员已经在研究报告的基础上整理出一本实践性非常强的“编译原理”内部资料,准备进一步完善后出版,为以后的教学与改革提供理论及实践支持。

参考文献:

[1]何炎祥,伍春香.计算机专业不需要开设编译原理课程吗?[J].计算机教育,2009,(4):61-62,85.

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

[3]李冬梅,施海虎.“编译原理”课程的教学研究与探索[J].计算机教育,2008,(8):103-105.

[4]张昱,陈意云,郭宇,等.“编译原理”课程的教学内容选择的探讨[J].计算机教育,2009,(18):143-146.

[5]张海朝,孙士保,张芳芳.任务驱动的编译原理课程教学方案研究[J].计算机教育,2010,(10):100-103.

(责任编辑:孙晴)

作者:孙士保

上一篇:工程质量安全管理论文下一篇:妇产术后疼痛护理论文