首页 > 范文大全 > 正文

“编译原理”课程教学研究和教材编写

开篇:润墨网以专业的文秘视角,为您筛选了一篇“编译原理”课程教学研究和教材编写范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

由于教育的需求和市场经济的作用,目前教材出版业相当活跃,新书层出不穷,令人目不暇接。作为一个使用教材进行教学的教师,最关心的是教材质量,选择合适的教材是进行教学的第一步。教材与专著不同,教材是教师教学的工具,教材的主要读者是学生。在书写教材的过程中,对学科的知识体系要进行合理的删选,使它适合于教学和知识的传授。由于本人长期从事“编译原理课程教学,所以对于该课程的教材特别关注,想就“编译原理”课程的教学和教材编写,发表一些本人的看法,供同行参考。

教材现状和问题

我上大学时,“编译原理”课程用的是由陈火旺、钱家骅、孙永强三位老师合写的“编译原理”一书,这本书可称之为编译原理教材的经典。该书系统地介绍了编译基本理论和方法,内容充实,覆盖面广。既注重了最经典、最广泛的基本编译技术,又力求反映20世纪70年代以来一些最重要的新成果。至今,该书仍是我进行教育和科研的主要参考书之一。我记得当时上课的王家启老师(上海计算技术研究所)给当学生的我们出了一个上机题目:输入一个正规式,输出该正规式对应的确定有限自动机,当然该题是书中习题之一。在解题过程中,我曾经有过这样的想法,是否可以用LR分析法来解决这个问题。正是由于这个20年前的想法,加上自己不断的努力,在对编译理论理解和实践不断加深的同时,于2001年提出了一个新的自动构造词法分析器的方法,于《计算机工程》杂志2001年第7期。

在随后的“编译原理”课程的教学中,本人也不断发现好书或书中写得比较好的段落。例如由高仲仪、蒋立源二位老师合写的《编译技术》一书。在该书中,通过一个“大象吃花生”的英文句子的语法分析,引入上下无关文法的基本概念和定义,这样的书写使人特别容易理解。又如由何炎祥老师主编的《编译原理》一书。在该书中有关LR分析法基本原理的描述写得相当好,他将活前缀在LR分析法中的作用写得清清楚楚。另外,尽管有些书不是介绍编译技术的,但是这些书对于“编译原理”课程的教学也是相当有益。例如由蒋国南老师翻译的《PASCAL程序设计》一书,书中二个程序例给了我特别深刻的印象。一个是去除源程序注释的程序例,而另一个是使用自动机的程序例。在以往的《编译原理》教科书中,只介绍如何构造自动机,基本上不介绍使用自动机的控制程序。其结果是:学生只知道自动机的构造方法,但不知道自动机如何使用。同样,在以往的词法分析教学中,只注重扫描器(单词识别程序)的教学,手工构造有状态转换图,自动构造有DFA;而对于词法分析的输入和预处理,最多一笔带过。实际上,输入和预处理程序是编译程序和用户程序的接口。编译程序首先是从文件读入源程序,经预处理后,才由扫描器进行单词识别。适当加强这部分内容的教学,有助于学生对编译程序前端的理解。

当然,由国内出版社出版的书也有不尽人意的地方。例如现在写书都要求有创新或标异。明明没有创新或标异,为了达到该指标,将一些与“编译原理”课程无关或关系不大的内容写入书内,这些内容根本不会用于教学,比较典型的是“并行编译”这部分教材内容。个别作者将国外教材删去某些章节,加上习题和习题解答后,就作为一本教材交付某出版社出版。正因为本人曾买到过这种类型的书,从此改变了本人看到有关编译的书就买的习惯。目前在市场上销售的有关编译的书,基本上都以LEX和YACC系统作为“编译原理”课程实习手段。当然LEX和YACC系统有多种版本,可用于不同的操作系统。但LEX和YACC系统毕竟是外国人编制的,是否适合于国内教学仍是个问号。由于本人与他校教师基本无教学交流,也不清楚实际使用效果如何,有关编译的书大都由多人合写,写编译理论部分的作者和写实验部分的作者往往不是同一人。从书的整体来看,有明显的脱节现象。LEX系统实际是一个状态转换矩阵产生器,而YACC系统实际上是一个LALR(1)分析表产生器。我想,LEX和YACC系统并没有复杂到常人不可实现的程度,为什么作者本人不能动手编写一个类似系统用于学生实验。

当然也不是说国外教材什么都好,包括国外优秀教材在内,也有不足之处。举一个简单例子:计算机的内存越来越大,由于引入控件,用户程序越来越短,是否还有必要将“在词法分析预处理时,通常将输入缓冲区分成二个半区互补轮流工作”这一内容写入教材,我想至少要说明一下。

提高教师自身学术水平

“编译原理”这门课程涉及的知识面较广,一头是程序设计语言,包括文件系统;而另一头是汇编语言或机器语言,包括计算机的系统结构。编译系统以形式语言和自动机为基础理论,构造算法复杂,系统十分庞大。所以,将“程序设计语言”、“数据结构”、“离散数学”和“汇编语言”等课程作为“编译原理”课程的前驱课程已成为共识。作为一个“编译原理”课程授课教师,除“编译原理”课程本身外,还要全面掌握上述这些课程的知识。尤其是对于“程序设计语言”和“汇编语言”这两门课程,要有一定的教学经历,这样才能把握好“编译原理”这门课程的教学。

现在有越来越多的教师加入了写书行列,著书立说已不是少数人的专利。但是,如何写书,如何写好书,这是每个作者必须面对的问题。尤其是作为一本教材的作者,必须具有一定的学术水平。在自己所涉及的学科领域中要花大功夫,要有自己的见解,要有自己的论文。在一定知识积累的基础上,才能编写好教材。

以科研为基础

“编译原理”课程是一门实践性很强的课程。尽管这门学科比较成熟,但仍然存在许多课题,有待我们去探索。比较典型的问题就是上面提及的LEX和YACC类似系统的实现。

本人先后实现了LL(1)分析表自动产生器、LR(0)分析表自动产生器和SLR(1)分析表自动产生器,相当于实现了YACC类似系统。由于有这样的编程经历,使得我在上语法分析课时,有一种如鱼得水的感觉。

作者曾试图实现LEX系统,但未获成功。正规式相当于算术表达式,作者从LR分析法的教学中得到启示,将LR分析法应用于词法分析器的自动构造,成功地实现了词法分析器的自动产生器,所生成的词法分析器是使用LR分析表来工作的。为了区别LEX系统,该系统简称为LR_LEX系统。

在此基础上,本人进一步实现了汇编程序自动产生器,于《计算机工程》杂志2005年第12期。

该二项新的编译技术和方法已写进《编译原理实用教程》一书,该书已由清华大学出版社出版发行。

重组教材内容

可能有些《编译原理》教材作者,他写书的目的并不是完全面向学生的,可能考虑把它作为这门学科的大全来编写。例如由美国著名计算机科学家Alfred V.Aho、Ravi Sethit和Jeffrey D.Ullman合著的《Compilers: Principle,Techniques,and Tools》一书,该书已由李建中和姜守旭老师翻译成中文,中文译名为《编译原理》。将这样的书作为教材,本人认为是不合适的,将它作为教师的教学参考用书,那是最好不过了。

由于面向的学生不同,培养目标不同,如何编写合适的“编译原理”课程教材,在很大程度上取决于作者本人所处的教学环境。但是,有一点是共通的,通过“编译原理”课程教学,使学生掌握编译基本理论和方法,能够建立一个较为完整的编译系统模型。不能由于作者个人因素或者知识难易程度来左右教材的书写。从国内出版的一部分《编译原理》课程教材和实际教学内容安排来看,本人认为存在如下问题:

(1)词法分析部分偏少;

(2)语法分析部分过多;

(3)语义分析部分过于简单;

(4)目标代码生成部分几乎是空白;

(5)讲授了一些不是很有必要讲授的内容(如DFA最小化、中间代码优化等)。

这是造成学生学习“编译原理”课程感到困惑的主要原因。难怪有些教师宁可使用老教材或者国外教材,而不愿使用新教材。

词法分析相当重要。正是从词法分析开始,将学生领进编译系统的大门。并且,作为编译系统的基础理论(自动机),也是在词法分析阶段讲授的。在授课中,应强调单词二元式的作用,单词种别用于语法分析,单词值用于语义分析。关于“DFA最小化”这一部分教学内容,本人认为应删除,教育重点应为:DFA的构造和使用。理由为:编译系统太复杂,首先要解决吃饭问题,然后再解决吃得好问题。

语法分析部分的教材篇幅应大幅减少。算符优先分析法较简单,宜于手工构造,特别适合于算术表达式的语法分析,在有些程序设计语言书中,也能看到它的介绍。由于算符优先分析法适用范围较小,实用意义不大,在教材中完全可将其删除。关于LR分析法,本人认为只要介绍LR(0)和SLR(1)分析法即可。理由为:SLR(1)分析法很实用,分析表又易于构造,它可解决大部分语言的识别问题。编译系统中的事情太多,先解决主要矛盾。

语义分析部分应加强,这是学生理解整个编译系统的关键,尤其要着重介绍符号表和常数表在编译程序中的作用。有了护照,可以周游世界;有了符号表和常数表,可以在编译系统中畅行无阻,符号表和常数表就是编译系统的护照。在内存分配时,符号表是变量地址分配的依据。由于符号表的引入,使得代码生成和变量实际存放地址无关;甚至可在程序运行过程中,对变量地址进行动态分配。

在目标代码生成部分,可先假设一个汇编语言虚拟机模型,然后介绍从四元式到汇编语言的翻译。应强调的是:由于符号表和常数表的结构不同,导致变量和常数寻址方式的不同。从汇编语言到机器码的翻译, 可将其留作课程实习,详见下一节。

创建实验环境

向学生提供一个虚拟裸机,虚拟裸机是用高级语言来实现的,虚拟裸机只接受二进制形式的机器指令。提供虚拟裸机的好处在于:可将与编译无关的一些硬件特性屏蔽掉,可根据要求来改变虚拟硬件配置。

要求学生根据虚拟裸机的机器指令设计汇编语言,然后构造汇编程序。用户用汇编语言编写程序,由汇编程序将它翻译成机器指令程序,该机器指令程序可以在虚拟裸机上运行,这样就形成了一个微型编译系统。这个微型编译系统包括了编译过程的四个主要阶段,它们是词法分析、语法分析、语义分析和目标代码生成。在汇编程序构造中,要求学生运用在“编译原理”课程中所学到的理论和方法。首先根据机器指令中所含的地址数量,将机器指令划分为0地址指令(RET)、A型1地址指令(READ)、B型1地址指令(CALL)和2地址(ADD)指令三大类。然后用上下文无关文法予以描述,并生成SLR(1)分析表。由于分析表的规模不大,可由学生手工构造。在有条件的情况下,可向学生提供SLR(1)分析表产生器,用于验证分析表的正确性。根据机器指令的二进制位特征,设计和构造语义分析器。语义分析子程序主要是由二进制位运算构成。当然这个汇编程序是相当初步的,它不允许用户用符号名来表示变量地址或标号。

有关这一部分内容,在《编译原理实用教程》一书中有详细介绍。

“编译原理”课程是计算机专业本科生必修课程。该课程对于计算机专业学生来说,是一门难度较大的专业课程,不少学生,就连上课教师也感到头疼。由于学生对该课程意见比较大,有些学校甚至准备将“编译原理”课程从本科教学计划中删除。实际上,计算机专业课程大部分都比较难,如计算机操作系统、计算机组成原理、计算机网络等。为什么学生对“编译原理”课程教学意见特别大,可能有多种原因。计算机操作系统有五大管理,这些管理可以分别单独讲授,可不涉及它们之间的联系。因为在某种状态下,计算机确实以这种方式工作。如果要介绍操作系统的整体工作机制的话,我想操作系统要比编译系统难得多。更深层次的原因还是应从教师自身查找,只有深刻理解编译系统的工作原理,包括理论和实践两个方面,才能为人之师。天下无难事,只怕有心人,只要我们不断努力,我想一定能搞好“编译原理”课程的教学。