编译原理教学现状与创新研究
崔光宇
摘 要:编译原理是计算机专业的主干课程,主要是为了使学生了解高级程序设计语言源程序翻译成计算机能处理的目标代码的整个过程,在整个专业教学体系中占有着重要的地位。文章分析了编译原理教学过程的现状以及存在的一些问题,进行了一些研究,最主要的是针对关键知识点设计实验,然后进一步将编译原理的各个部分整合为一个简单的编译器,把理论和实践结合起来,加深学生对各部分知识的理解,同时也能提高学生设计大型系统的能力。
关键词:编译原理;课程实践;教学创新研究
编译器产生于20世纪60年代,在计算机学科技术发展中起到非常重要的作用,是计算机不可缺少的工具。掌握编译器的原理对于计算机学习人员是最重要的基础知识。在高校教学中,编译原理主要是为了使学生了解高级语言源程序翻译成计算机能处理的目标代码的整个过程,主要包括词法分析、语法分析、语义分析、中间代码生成、中间代码优化以及目标代码生成这6大部分。通过本课的学习,学生可以系统掌握编译的基本原理和基本技术,对之前学习过的程序语言的设计与和实现有更好的理解,提高实践能力。
编译原理课程是计算机专业最难的课程之一,原因如下:(1)理论性很强,基本原理比较抽象,算法描述主要使用形式化语言,比如,有穷自动机、上下文无关文法等,与以往的学习有很大的差别,学生很难理解算法背后的精髓。(2)教学方式较为单一,因为理论知识过多,大部分学校为了保证教学进度,时常以灌输式为主,课堂上主要是编译系统原理为主,忽视了具体实例的讲解。(3)在实践方面,编译的算法较为复杂,对学生的编程能力以及逻辑思维能力都有很高的要求。因此,如何使用适当的方法提高课程的教学效果,是当前编译原理教学中需要探讨的重要问题。
1 研究现状以及存在的问题
1.1 国内外研究现状
国外大学从20世纪60年代开始开设编译课程,较为经典的编译原理教程有Aho等[1]编著的《Compilers: Principles, Techniques and Tools》(中文名:《编译:原理,技术与工具》)与Appel等[2]编著的《Modern Compiler Implementation In Java/C++/ML》(中文名:《现代编译原理—C语言描述》),这两本书在编译原理领域分别被称为“龙书”“虎书”。“龙书”出现于1986年,第2版删除了语法分析的算符优先分析法、语法翻译中递归计算方法等过时的技术,增加了面向对象的编译、类型检查等比较新新技术。“虎书”中包含C版本、Java版本,在“龙书”知识点基础之上,增加了循环优化等内容。
近年来,国内学校在编译原理教学方面也积累了大量的经验,上海交通大学张冬茉等[3]提出了现阶段进行大型编译原理课程设计的教学模式和方法,使学生能够通过实现一个实用的编译系统,提高对编译原理的认识。合肥师范学院祖弦等[4]针对核心知识点,设计实验教学案例,探讨在实验案例驱动下的编译原理课程教学创新方案。
1.2 存在的问题
1.2.1 学生对于课程的认识模糊
大部分学生对于编译原理的认识在于,认为学习编译原理的目的,是构建一个完整的编译器。然而大部分大学生在毕业后,制作编译器的可能性很小,学生很难提高学习兴趣。
1.2.2 编译原理理论抽象,算法比較复杂
相较于以往学习的课程,编译原理课程对于学生而言十分的抽象,比如有穷自动机等,学生理解不易,同时,课程中有很多复杂的算法,对于大部分大学生来说都很难掌握。
1.2.3 程序设计要求比较高
课程设计部分要求学生使用学过的C,C++,C#,Java等语言实现,由于算法本身比较复杂,对学生编程能力有较高的要求,然而大部分学生在之前的学习中并没有很好地掌握以上编程语言,使得课程设计更加困难。
2 教学创新措施
2.1 明确学生学习编译原理的作用
虽然很少有人从事编译方面的工作,但是学习编译的整个过程对于学生学习计算机科学的理论、技术和方法都是很有效地提高,而且编译原理的很多原理、算法不仅局限于编译本身。学好编译原理的一些算法和原理,对计算机很多问题的解决都能够起到很好的作用。此外,完整地编写一个编译程序,为学生提供了很好的编写大型程序的实例,非常有利于学生以后对于大型程序的编写。
同时,在大三课程中设置编译原理,其学习中融合了多门以往的课程内容,比如高级语言、数据结构、操作系统、汇编语言等,这使得学生能更好地理解以往学习内容的实际应用,还能更好地提高学生的程序设计能力。
2.2 教学方法的创新
编译原理课程理论性很强,实践性也很强,是两者相结合的课程。理论部分知识枯燥、抽象、难学。所以在讲理论时可以将理论、算法部分采用实例驱动的方法,将抽象的知识结合到一个个实际问题中去。在解决问题过程中,介绍基本原理和算法,这样学生可以很好地理解原理和算法在实际问题中的作用,提高学生的分析问题、解决问题的能力。
2.3 编译原理实验环节的设计
实验是培养学生应用能力最直接的手段,鉴于学生的编程能力,增加适当难度的实验,加强学生对重要知识点的认识和理解。实验总体分为两部分:一是对编译原理课程中的关键方法的实验,二是整体的设计一个简单的编译器。
2.3.1 词法分析器的设计
词法分析器实验:制作一个读单词过程,源程序保存在文本文件中,读取该文件,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分界符5大类。依次输出各个单词的内部单词种别及单词符号自身值,遇到错误时可显示“Error”,然后跳过错误部分继续显示。
2.3.2 语法分析器的设计
语法分析器实验:设计、开发一个高级语言的LL(1)语法分析程序,实现对源程序的语法检查和结构分析,加深学生对顶向下语法分析、First集、Follow集、Select集、判断LL(1)文法的方法、文法等价变换、LL(1)分析表的构造、对某一输入串的分析过程的理解。
2.3.3 語义检查和中间代码生成的设计
语法检查和中间代码生成实验:设计、开发一个高级语言的语义检查和中间代码生成程序,加深对语法制导翻译技术、类型确定、类型检查、常见可执行语句(如赋值语句、条件语句、循环语句)翻译技术的理解。
2.3.4 代码优化的设计
代码优化实验:设计、开发一个高级语言的代码优化程序,包括简单的局部优化、循环优化和全局优化,加深学生对代码优化重要性的认识。
2.3.5 目标代码生成的设计
目标代码生成实验:目标代码生成是把源程序的中间代码转换成等价的目标代码,在这里,设计、开发一个简单的代码生成器,能将中间代码(四元式形式)转换成目标代码。设计过程中,引进目标指令与四元式对照表,便于转换。
2.3.6 编译器的设计
以上5组实验对于编译过程中的6大部分重点方法进行了实践,由于比较分散,大部分学生不能很好地理解每个部分是如何在整个编译系统中达到协调工作的。经过一个学期的学习,开设一周左右的集中课程设计。目的是为了设计一个相对完整的编译器。题目较为简单,学生可以根据学生自身情况自行设计一个适合自己难度的做法,基础较差的同学,可以针对题目设计一些最为基础的算法,而基础较好的同学可以将编译中多种算法融入编译器中,最终生成一个简单的编译器。通过这个设计,学生能够系统地理解编译的整个过程。
3 结语
在编译原理课程教学过程中,针对现存的一些问题,本文进行了一些创新研究。最为重要的措施是提出了一套实验教学方法,很好地提高了学生学习兴趣,更好地让学生理解和掌握了课程重要算法,并通过制作一个编译器,把编译原理的所有内容达到一个融会贯通的目的,培养了学生编程能力,达到了提高教学质量的目的。
[参考文献]
[1]AHO A V,SETHI R,ULLMAN J D.Compilers:principles, techniques and tools[M].New York:Additions Wesley,1986.
[2]APPEL A W,JEOS P.Modern compiler implementation in Java/C++/ML[M].New York:Cambridge,1997.
[3]张冬茉,方习文.编译原理课程设计的教学实践和改革[J].实验室研究与探索,2012(11):134-137.
[4]祖弦,朱强,谢飞.实验案例驱动的编译原理教学改革探讨[J].合肥师范学院学报,2017(3):74-76.
Abstract:Compiler principle is the main course of computer science, primarily to enable students to understand the entire process of source code of high-level programming language translated into object code which computer can handle, it occupies an important position in the whole teaching system. This article analyzes the current situation and problems in teaching compiler principle, explores the teaching contents and method. The most important thing is to design experiments for key knowledge points, and then integrated the various parts into a simple compiler, combined theory with practice, deepened students understanding of the various parts of knowledge, also improve the ability to design large systems.
Key words:compiler principle; curriculum practice; research on teaching innovation