国防科学技术大学 编译原理国家级精品课程
王挺
五十多年以来,随着编译技术的发展,有关编译原理和技术的内容被逐步引入到了计算机专业本科教学中。从早期各阶段
ACM
和
IEEE
的计算机专业教学计划,到后来的
Computing
’
91
,再到近年
ACM
和
IEEE
联合制定的
CC 2001
以及中国计算机学会、全国高校计算机教育研究会制定的
CCC2002
,都把有关编译原理和技术的内容列入核心教学内容。目前本课程的内容覆盖了
CC2001
和
CCC2002
体系中程序设计语言
(PL)
领域
(area)
中的程序设计语言概述、虚拟机、语言翻译介绍和语言翻译系统等
4
个知识单元
(unit)
。详细信息参见本课程网站提供的
教学大纲(http://sei.nudt.edu.cn/cp/index.php?type=kczy&page=jxdg)。
编译原理课程是高等学校培养计算机专业人才的核心课程。本课程以介绍程序设计语言编译程序构造的基本原理和设计方法为教学目标。通过本课程的学习,一方面使学生掌握和理解编译系统的结构、工作流程以及编译程序各组成部分的设计原理和实现技术,获得分析、设计、实现和维护编译系统的初步能力;另一方面,通过学习编译的理论和方法,提高学生对程序设计语言、操作系统、计算机原理和体系结构等课程知识的综合理解。对于将来从事编译系统设计工作的学生来说,本课程的知识将为其打下坚实的能力和知识基础;对于从事其它工作的学生,本课程对于提高他们对计算机系统总体认识也具有重要的意义。此外,课程介绍的经典的语言分析方法和工具,对于设计一些实用的工具和软件,如自然语言理解、网络信息处理、网络协议的分析与实现等,都是必备的基础。
课程的重点、难点及解决办法
课程的重点
包括:
编译过
程和编译程序的结构,文法的构造,正规表达式与有限自动机的等价性,有限自动机的确定化和最小化,消除文法的左递归和回溯,递归下降子程序的构造,预测分析表的构造,算符优先分析表和优先函数的构造,
LR
分析表的构造,属性的计算,表达式和控制语句的翻译,名字的作用范围和栈式存储分配的实现,
DAG
表示及其应用,循环优化,代码生成器的生成算法,依赖关系分析的基础理论以及向量化、并行化等。
课程的难点
包括:正规表达式与有限自动机的等价性,有限自动机的确定化和最小化,
LR
分析表的构造,属性的计算,表达式和控制语句的翻译,名字的作用范围和栈式存储分配的实现等。
针对上述教学重点和难点,课程小组在讲授过程中采取了如下措施,以提高课程学习的效果:
1)
注重理论和实践的结合
。编译程序的构造原理和技术可以说是计算机科学技术中理论和实践相结合的最好典范。在许多课程的教学中,经典的理论和先进的技术之间的联系往往缺乏具体而形象的例证,而编译原理课程在这方面具有得天独厚的优势。经典的形式语言和自动机理论为编译程序的设计提供了坚实的理论基础,正是在科学理论的保证下,才形成了一系列先进的编译程序设计方法和工具,使得编译程序的构造具有很高的系统性和自动化程度。本课程既强调了经典理论在计算机科学中的重要作用,又注重介绍利用这些基础理论来设计和构造编译程序的各模块的先进的方法及工具,具体形象地说明了基础理论与先进技术的关系。
2)
形式内容呼应,丰富教学手段
。本课程的建设以能力与素质的综合培养为目标,因此,课程采取了丰富的教学手段以培养学生综合运用知识的能力:课堂教学坚持采取讨论式、启发式教学方法,改变满堂灌的教学方式,活跃课堂气氛,激发学生的创新意识
,
提高教学效果;通过设计综合实验,为学生提供综合运用知识、培养科研素质的机会,锻炼了学生的自主性;综合实验的验收采取演示、讲解和答辩相结合方式,使学生的科研能力和人文素质得到全方位的锻炼;通过使用多媒体网络教学环境,学生与教师可以在课外进行流畅而生动的沟通,教师利用多媒体交互手段指导学生开展自学活动。
3)
建设系列课程,注重知识融合
。编译原理课程一直坚持按照计算机学院系列课程建设的目标来加强改革,课程知识点的安排力求体现系列课程建设的要求,充分考虑与相关课程在内容上的衔接和呼应。根据
CC2001
和
CCC2002
的知识点,理清本课程与程序设计、数据结构、算法设计与分析、操作系统和体系结构等相关课程的关系,确定本课程应该覆盖的知识点。同时,课程小组加强系列课程之间横向、纵向联系与分工的研究,协调本课程在计算机知识体系中与其它课程之间的关系,开设了一些配套课程与选修课程,对本课程知识进行完善与补充。根据系统软件、程序设计和软件工程等相关系列课程的发展和变化,更新并完善课程实验方案。
实践教学的设计思想与效果
我校是国内最早开设编译原理综合实验的学校之一。本课程的实践教学环节充分体现了综合性、设计性和自主性的特色。
课程实践包括单元实验和综合实验两部分。其中,单元实验主要包括
LEX
、
YACC
和
JavaCC
等工具的分析和使用;综合实验包括简单的、包含现代程序设计语言典型成分的语言的编译器的分析和扩充等。其中综合性实验为整个实验的重点,所占比例超过
50%
。在综合实验中,学生以
PL
语言编译器为基础,扩充
PL
语言成分,并对相应的编译程序进行扩充,扩充的内容包括:基本的控制语句、函数的说明和使用、数据类型等。有关实践教学的详细信息请参见课程网站提供的 实验指导(http://sei.nudt.edu.cn/cp/index.php?type=kczy&page=syzd
)。
课程实验要求学生综合应用程序设计、数据结构和算法、体系结构和计算机组成原理等课程的知识,在实践中贯彻软件工程的原则和规范,独立进行编译器的设计和实现,提交标准的软件文档和具有良好程序设计风格的源程序。
在完成综合实验的规定内容外,鼓励学生自主提出拟扩充的语言机制并独立设计实现,如新的数据类型和控制语句的扩充等,以培养学生自主研究的意识和能力。
通过课程的综合性实践,学生分析并扩充了一个较完整的编译程序,培养了学生通过灵活运用理论知识、设计较大规模的软件来解决实际问题的能力。通过课程学习和实践,学生深刻体会到了理论学习的意义和动手实践的乐趣。学生反映编译原理课程的实验系统性、综合性非常突出,在实验中不但极大地提高了动手实践的能力,而且也更深刻地体会到了计算机科学理论的作用和意义。