摘要: 编译原理是计算机专业的一门重要的专业基础课程,它的主要任务是系统地介绍编译程序的基本原理、基本实现方法,编译方面的最新技术及其研究发展方向。学习本门课程不仅能帮助学生更深入地了解计算机以及计算机程序本质,还能提高学生抽象思维能力和逻辑思维能力。本文根据编译原理课程特点,结合自己教学经验,探讨了工科院校编译原理的教学内容的选取及实践教学如何开展,对普通高校更深入的教学改革和创新人才的培养具有一定意义。
关键词: 编译原理;PL/0语言;实验教学
1 引言
编译原理是计算机科学与技术专业的专业必修课,是计算机学科核心课程,理论性和实践性都很强,由于涉及形式语言描述、有穷自动机等抽象内容,学生在学习过程中存在一定困难,一度被学生戏称为“天书”。国外和国内分别从二十世纪六十和八十年代开始设置“编译原理”课程,从文献专著内容可以看出,几十年来,“编译原理”课程可以讲授的内容越来越多。编译技术在计算机体系结构设计、提高软件开发效率与质量的工具开发等方面有着重要的应用,这是学习编译原理主要理由,在“编译原理”课程的课时数不足情况下,如何选择编译原理教学与实践内容是一件值得探讨的事情。
从文献[1]可以看出,文章作者在多年从事的教学工作及教材建设的基础上,提出了对本门课程的三种不同层次学生(普通本科院校、重点本科院校及研究生阶段)在教学内容上的一个大致选择。本人在文献[1]基础上,根据我院本课程教学目标:通过编程语言实现技术学习,了解编译程序的实现原理和技术;利用从本课程学习到的知识,增强编写和调试程序的能力。同时结合我校的实际情况,对本课程的教学与实践内容进行了选取。
2教学内容的选取
针对我校刚升本的一般工科本科院校,教材采用[2],教学内容的选取应突出工科院校的特点,重实践,强调培养学生的动手能力。掌握编译原理和技术的同时,要指导学生独立的完成设计一个小的编译器。选取的教材中详细讲述了PL/0语言编译器的设计及实现,故而教学时要理论联系实际,使学生边听边做,在实践中深刻领会抽象的理论。在讲述各章的理论的同时要指导学生多做习题以加深对特定算法的理解。结合编译的各个阶段,对教学内容的选取如下:
(1)概述
讲述编译程序的基本框架,包括什么是编译程序、编译程序包括那几个阶段及各阶段的任务、编译原理在计算机科学与技术学科中地位和其他课程的关系以及编译程序的发展和应用。
(2)形式语言基本知识
内容包括符号和符号串、文法概念、推导、句型、语言、语法树和二义性,最后是文法的分类。重点是文法的概念及语法树,这一章是后面章节的基础,讲授时一定要注意节奏,使学生深刻领会,另外讲授下PL/0语言的语法。
(3)词法分析
本部分主要以正规式、NFA(不确定的有限自动机)、DFA(确定的有限自动机)及其最小化为主线来讲解,同时对词法分析器进行介绍,演示用C语言写的PL/0的词法分析器,并要求学生上机实现。
(4)语法分析
这一部分中,上下文无关文法是必备基础知识。语法分析包括自上而下与自下而上的语法分析二种。自上而下的语法分析包括二种:LL文法和递归下降分析方法,这两种方法比较简单进行可进行详细介绍,用一个简单语言的递归下降分析程序作为例子进行讲解效果更佳。自下而上的语法分析出包括二种:算符优先与LR分析方法,由于目前编译器的语法分析中已不再采用算符优先方法,因些可只作简单的介绍就可以了。LR分析方法是比较重要的语法分析方法,但由于SLR分析、规范LR分析和向前看LR分析非常复杂,讲解时需要占用较多的课时,不介绍这几种LR分析表的生成算法可直接介绍LR分析表的使用较好。因此,在介绍自下而上分析的一般概念和使用LR分析表进行移进归约分析后,可以直接介绍分析器的自动生成器,并介绍归约时的语义动作,为下面阶段语义工作的描述奠定基础。
(5)语义分析和中间代码的产生
语法制导的定义和语法制导的翻译方案是描述编程语言翻译的两种常用形式方法。它们描述严格并便于理解,因此大部分有一定深度的教材都用它们来描述静态语义检查和中间代码生成等。这一部分内容较难,简单加以介绍,让学生有所了解即可。
静态语义检查通常包括:类型检查、控制流检查、一致性检查、相关名字检查,重点应放在类型检查上,类型系统在编程语言的设计中占据重要位置,讲解时先介绍类型系统在编程语言中的作用,然后用语义动作来表达类型检查算法。
中间代码生成主要介绍各种形式的中间语言,把赋值语句和各种控制流语句翻译成中间代码的语义动作。对于类型和变量声明语句,重点关注怎样按语言的作用域规则组织符号表。符号表中符号的插入和查找方法在数据结构中已经阐述过,只需稍作提及就可以了。
(6)运行时存储空间的组织和管理
这是最需要搞明白部分。尤其在用C这样比较低级的语言时,掌握这部分内容对编写程序和程序排错都很有帮助。具体应该介绍局部存储分配策略(即一个活动记录中各类数据的组织),静态分配、栈式分配和堆式分配等三种全局存储分配策略,非局部名字的访问方式和各种参数传递方式的实现。
(7)代码生成
选择一种采用简单的寄存器分配策略的代码生成算法加以介绍,让学生对代码生成有所了解即可。
(8)代码优化
用实例来介绍各类优化,让学生明白编译器能完成哪些优化,而不要给学生介绍各种优化算法。这对编程有用处,例如,在可读性好的源代码和优化的源代码两者之间做选择时,若知道那些优化可以由优化编译完成,则宁可选择可读性好的代码。
2 实验内容的选取
设计一组适宜实验内容:首先,要将编译理论和方法在实验中得以概括,使学生不仅掌握它们本身具体应用,而且掌握由这些理论和方法所构造编译程序的各个部件是如何在整个系统中协调运行,这是实验最重要目的之一。其次,必须合理地简化,使学生比较容易完成。针对编译原理课程的特点及要求,共设置了五个实验项目。这组实验既和理论课内容相辅相承,同时相互之间又互相关联,构成了一个实验整体。
实验一:消去C、C++程序中的注释(2学时,必做)
实验目的:掌握C语言中文本文件的基本操作,消除源C语言程序中的注释,为以后的编译提供方便。
实验要求:对给定的带注释的C语言源程序,利用该程序去掉注释,输出去除注释的源程序。
实验二:词法分析(必做,4学时,必做)
实验目的:通过设计PL/0语言的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。