专家访谈:《编译原理》课程教学的探讨

《编译原理》课程教学的探讨

张 昱 陈意云 郑启龙

(中国科学技术大学  计算机科学与技术学院, 安徽 合肥)

 

中国科学技术大学计算机科学技术系张昱、陈意云、郑启龙,多年来在中国科大从事编译原理教学和科研。总结教学中的体会,探讨在编译原理课程上所进行的课程建设,供国内同行参考与切磋。

 

编译原理是计算机专业的一门专业基础课程。该课程介绍编译器构造的一般原理、基本实现方法。主要内容包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等。通过编译原理的学习,学生可以对程序设计语言的设计和实现有深刻的理解,对和程序设计语言有关的理论有所了解,对宏观上把握程序设计语言来说能起一个奠基的作用。编译原理课程的学习还有助于学生快速理解、定位和解决在程序编译、测试与运行中出现的问题。另外,大多数程序员同时又是一些简单语言(如输入输出、脚本语言)的设计者,掌握编译知识有助于提高他们设计这些语言的水平。

 

对软件工程来说,编译程序是一个很好的实例(基本设计、模块划分、基于事件驱动的编程等),编译原理课程所介绍的概念和技术能应用到一般的软件设计之中。还有,编译技术在软件安全、程序理解和软件逆向工程等方面有着广泛的应用。

 

课程难点

 

虽然只有少数人从事构造或维护程序设计语言编译器的工作,但是编译原理和技术对大学生和计算机软件工程技术人员是重要的基础知识之一。大家普遍反映“编译原理”是一门难学的课程,理由如下:

 

1.  编译程序规模大,不可能在一门课的时间内把所有的细节都讲清楚,这使学生对编译程序各逻辑部分之间的接口和一些算法的实现是模糊的。

 

2.  课程涉及不少理论知识,如形式语言和自动机理论、语法制导的理论等。这些理论的学习有一定的难度,特别是语法制导定义(或翻译方案)的设计,因为它本质上是一种事件驱动的程序设计,这对于三、四年级的本科生来说还是较难掌握的。

 

3. 课程包含了很多算法,大的有LL(1)分析算法和各种LR(1)分析算法等,小的有DFA 化简算法、计算开始符号集合和后继符号集合的算法、各种数据流方程的迭代求解算法。要记住这么多算法不是件容易的事情。

 

教学方法

 

编程语言的编译原理是计算机专业一门非常有用的核心课程,又是一门需要较大投入的课程。怎样激发学生的学习热情,努力学好本课程?我们的策略主要有如下三点:

 

1.  我们认为对编译原理和技术的宏观理解及全局把握比了解一些局部的算法重要得多。因此我们强调运行时的存储空间组织、LL(1)分析和LR(1)分析的本质区别、各种LR 分析之间的差别、语法制导的方法等,不把学生的注意力分散到一些枝节的算法上,如计算开始符号集合和后继符号集合的算法、回填技术等;

 

2.  我们在课堂上和习题中准备了很多从实际程序编译和运行时碰到的问题中抽象出的例子,鼓励学生用所学的知识去分析、解决、理解实际编程中遇到的问题和发生的现象,激发学生学习编译原理和技术的积极性。

 

3.  在课程学习的后期,我们要求学生阅读一个从某简单高级语言到中间代码的编译器和这个中间语言的解释器,并鼓励学生在这两个程序的基础上实现一个扩展语言的编译和解释,由此来帮助学生融会贯通把握所学的知识。

 

教材建设

 

我们深感一套合适的教材对课程教学和学生学习的重要性。十几年来一直致力于本课程的教材建设。我们新编的课程教材由编译器概述、词法分析、语法分析、语法制导的翻译、类型检查、运行时存储空间的组织和管理、中间代码生成、代码生成、代码优化、编译系统和运行系统、面向对象语言的编译、函数式语言的编译等组成。这些对加强学生对原理和技术的掌握,在宏观上把握程序设计、语言设计等更具操作性。其特点为:

 

(1)介绍编译器构造的一般原理和基本实现方法,收入了20 世纪末和新世纪初的一些重要成果,如有关类型制导的编译思想。

(2)在介绍命令式程序设计语言实现技术的同时,强调了一些相关的知识,如形式语言和自动机理论、语法制导的定义和属性文法、类型论和类型系统等。这些知识在书中结合应用来介绍,有助于学生领会和掌握。

(3)强调了对词法、语法和语义分析、中间代码生成、代码优化和目标代码生成等,加强形式化描述技术,以语法制导定义作为翻译的主要描述工具。

(4)加强了对编译原理和技术在宏观上的理解及全局把握,而不把学习者的注意力分散到一些枝节的算法上,如计算符号集合和后继符号集合的算法,回填技术等。出于同样的目的,还详细地介绍了编译系统和运行系统。

(5)注重了面向对象语言和函数式语言的实现技术,有助于加深学习者对语言实现技术的理解。

(6)选编的很多例题和习题是从实际遇到的问题中抽象出来的。这些习题对激发读者学习编译原理和技术能起一定的积极作用。

 

 

课程实验

从2007年起,我们恢复了编译原理课程设计,并且以更开阔的视野来看待课程实验和课程设计。我们认为,计算机专业各课程的实验和设计(软件方面)要有整体规划、相互配合,才能使学生在同样的投入下获得最佳的效果。

1、各实验和设计针对单课程局部知识点、单课程综合知识、还是覆盖多课程,要有合理布局。

2、各实验和设计使用的开发语言、工具和环境,也同实验和设计内容一样,要逐步提升。

       3、根据实验和设计的特点,要求学生个人、合作、甚至竞赛方式完成,同时注重对学生工程意识、质量意识、团队意识的培养。

 

我们在加强过程管理和改进考评方式上的一些经验和体会如下:

 

       首先,规定截止时间,评测只对截止时间前的最新程序版本进行,避免后评测同学根据先前评测情况来完善程序,以保证评测的公平性和易评比性。

       其次,安排多次发布和提交,规定的时间节点有:提交设计文档、提交源代码、发布测试程序、发布评测环境、提交最终版本和测试文档(这是首次尝试后的改进方案)。这样做有助于培养学生的工程意识,大体了解企业开发过程中一些主要环节及其重要性;防止学生临时突击,甚至因突击失败而拷贝他人程序。同时可以保证评测顺利进行,避免诸如在程序中使用绝对路径、开发环境与评测环境不一致等枝节问题而影响评测、过度影响得分,以提高评测效率和保证公平性。

       最后,以4个小时考评10-12个学生的分组方式进行公开评比,评委由教师、助教和同组所有同学组成。教师主导考评过程、学生按教师要求在投影屏幕上当众演示测试过程和结果;评委提问,被评者当场回答;问题主要围绕完成的设计和编程,以及测试中暴露出的设计或编程错误。评分的主要策略是:每个评委给该组同学(学生评委包括给自己)排名次;排名依据整个编译器的优劣,而不是只考察被评同学所开发的前端或后端;所开发的前端或后端被越多的同学采用,则成绩越好。

 

       这样的过程管理和考评方式调动了学生投精力于课程设计的积极性,大大减少了拷贝他人程序的情况。学生不断交流经验、关注开发质量、积极推销自己的开发成果,不仅巩固了理论知识、积累了开发经验,也培养了质量意识和团队精神。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hzbooks/archive/2009/07/16/4352429.aspx

你可能感兴趣的:(课程教学)