编译原理课程教学之思考

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 4

View metadata, citation and similar papers at core.ac.

uk brought to you by CORE


provided by Xiamen University Institutional Repository

第 18 期 计 算 机 教 育
66 2013 年 9 月 25 日 Computer Education

文章编号:1672-5913(2013)18-0066-03 中图分类号:G642

编译原理课程教学之思考
李慧琪
(厦门大学 信息科学与技术学院 计算机科学系,福建 厦门 361005)

摘 要:结合编译原理课程教学工作,从课程特点、教学内容的合理取舍、语法和语义分析等难点内
容的讲授方式、实验内容的设计等方面进行深入探讨,对教学过程进行总结,讲述如何提高教学质量。
关键词:编译原理;课程内容;实验环节

0 引 言 编译器构造各阶段的工作均有其抽象理论
基础,涉及多种数学模型,词法分析阶段涉及正
编译原理是计算机专业本科生的重要核心
则表达式与有穷状态自动机理论;语法分析阶段
课程,通常开设在大学 3 年级。编译器是计算机
涉及上下文无关文法;语义分析阶段涉及属性文
3 大系统软件之一,其构造原理和技术是计算机
法、类型系统;而树形结构是表示程序语法结构
科学技术领域的重要组成部分。虽然绝大多数计
以及源程序到中间代码翻译的重要模型。编译器
算机专业学生未来不可能去构造或维护一个主流
中的算法研究同样重要,必须考虑算法的功能、
程序设计语言的编译器,但与编译原理相关的模
通用性,其中语法分析阶段的算法最为典型,依
型、理论和算法可以用在多种应用领域,将对研
次引入了一系列算法。而编译器开发的实践性
究开发产生有益的影响。学习该课程可以培养学
强,需要学生实际动手实现一个规模较大的编译
生抽象思维、独立解决复杂问题、编程和调试等
器,这本身是一个较复杂的软件工程项目,必须
涉及多门专业课程知识的综合应用能力。
考虑子模块划分、模块之间信息传递、算法效
编译原理课程内容抽象、理论性强、形式化
率、编译器构造自动工具等多方面因素。
方法不易理解,对学生编程实践有较高的要求。
编译原理融合多门专业课程,包括来自于计
对于教师而言,如何在有限的学时内优化教学内
算机科学不同领域的思想,如高级语言程序设计、
容,合理安排实验环节,是值得探讨的问题。
形式语言与自动机理论、数据结构中树及图形算
法;操作系统中存储分配方式、人工智能中的贪
1 课程特点
婪算法、启发式搜索技术;汇编指令系统等。编
编译领域里的经典教材作者 Alfred V. Aho 认 译原理和高级语言程序设计联系紧密,学好该门
为编写编译器的原理和技术还可以用于编译器设 课程有利于学生对程序设计语言的理解,可以迅
计之外的众多领域,这些原理和技术通常会在一 速掌握新的语言工具,在遇到新的程序语言时,
个计算机科学家的职业生涯中多次被用到 [1]。这 学生不会因为没有学过某一门语言而无从入手,
句话给出了编译原理课程的教学定位——兼具理 这对学生今后从事软件开发工作有重要价值。编
论与实践两方面的高要求。 译原理课程蕴含着计算机学科中解决问题的思路

作者简介:李慧琪,女,讲师,研究方向为智能计算、软件理论,lihuiqi@xmu.edu.cn。
第 18 期 教育与教学研究 67

和方法。学习编译原理课程,不仅要学习如何构 法手工编写相应的编译程序,教师提出是否可以
造编译器,还要学习解决复杂和开放性问题的一 找到非递归的自动生成语法分析器的方法问题,
般方法,从中接受的思维训练将会在今后的学 由此引出 LL(1) 分析方法。进一步提出 LL(1) 分
习、工作中逐渐体现其价值。 析方法适应的文法是有限定的,是否有更普遍适
用的分析方法问题,由此引出自底向上的 LR 分
2 合理安排课程内容,突出重点,注重 析方法,从 SLR、LR(1) 到 LALR 方法,每一种
方法 分析方法的引入相互关联。这一方法能够保证语
法分析这一要点有清晰的脉络贯穿,让学生能把
厦门大学计算机科学系的编译原理课程历
握这一主线。
年采用经典编译教材“编译原理、技术与工具”

语法制导定义及翻译方案的设计是教学的
其中讲解的核心编译原理是教学内容的重要部
分,包括词法分析、语法分析、语义分析、中间 重点和难点,也是学生学习中反映困难最大的

代码生成以及运行时环境、优化和代码生成方法 内容。因为它没有普适的一般方法,本质上是一

的基本技术,教材中对编译前端的技术进行了详 种事件驱动的程序设计,这对于 3、4 年级的本

细的阐述,但在一个学期 60~64 学时课堂讲授 科生较难掌握 [2]。如何把握课程难点的讲授,值

中,往往无法详尽地介绍所有内容,需要突出重 得深入探讨。这一部分内容教师采用“归纳法”,

点,对某些章节适当选择。 在讲解过程中围绕语义描述和计算问题,结合具

例如,运行时环境中有关源程序语言相关问 体实例寻求解决技术,阐述语法制导定义和翻译

题的讨论、非局部命名的访问、参数传递等高级 的作用,强调这些技术将运用于解决类型分析和

程序语言设计可略讲,向学生列举这些技术在哪 中间代码生成的语义问题。可以将语义规则求值

些相关课程、书籍或文献中找到参考,拓宽学生 方法归纳为 4 点:

思路,培养其自学能力。代码生成、代码优化等 (1)由下向上计算 S 属性定义:用带属性值

编译器后端技术限于学时数,往往涉及甚少,匆 的语法分析栈实现;

匆带过。而这一部分内容对于编译器构造十分重 (2)由上向下计算 L 属性定义:消除左递归

要,关系到生成代码的质量,也是现代编译技术 后引入继承属性,扩充递归的语法分析器,可以
的研究重点。在教学中可介绍代码优化的主要来 实现预测翻译器;
源、几种经典的优化方法,优化的主要数据结构 (3)由下向上计算继承属性:用加标记非终
和实现技术,让学生对这部分知识有所了解,便 结符的方法,使得嵌入产生式右部的语义动作全
于将来深入学习。 部出现在产生式末尾,从而能在归约之前执行语
又如,语法分析方法是编译教学的重点,详 义动作;
细介绍自顶向下分析和自底向上分析,LR 分析 (4)遍历分析树的翻译方法,上述 3 种翻译
中有 LR(0)、SLR、LR(1)、LALR 不同方法,若 方法均和语法分析同时进行,但不是所有的 SDD
拘泥于教材逐一讲授,学生较难接受,没有头 都能在语法分析同时完成,给出一般化的求值方
绪。教师注重讲授方法,在讲解过程中不断提出 法,先建立带语义动作的语法分析树,后遍历执
问题,寻求解决技术及其背后的原理。在语法分 行语义动作,要求属性依赖关系图无环。
析讲授中先介绍递归子程序法,可以用该方法编 这一讲解方法能更好地帮助学生理解抽象的
写某些语法的语法分析器,但这必须对于每个文 问题,提高分析和综合能力。
计 算 机 教 育
68 Computer Education 2013

3 精心设计实践环节 (3)提供编译器源代码。编译器构造是一个
具有相当规模和相当复杂度的系统,对于本科学
编译原理是实践性很强的课程,要真正理
生独立动手编写小型语言的编译器是有难度的。
解编译系统,单纯依靠课堂讲解理论知识是不够
为了帮助学生掌握,结合一个小型语言编译器构
的。实验课程是培养学生实践能力,巩固和验证
造的完整实例,提供编译器构造的源代码,要
所学理论知识,培养学生分析问题、解决问题能
求学生对源代码进行分析、扩充和改造,有助于
力的重要环节。通过实验环节,使学生对编译程
学生的理解和掌握编译原理的构造技术。例如
序各功能部分间的接口有更好地理解,对算法的
Alfred Aho 著的“编译原理(第 2 版)
”和“编译
实现细节更明了。
原理(本科教学版)”附录均给出了一个用 Java
在理想的情况下,完成一个完整的编译系统
语言实现的完整的编译器前端 [3],包括:源语言
构造,从词法分析到目标代码生成,直至汇编程
的文法描述、词法分析器、语法分析器、符号表
序的执行,这有助于真正理解整个编译过程,以
和类型、表达式的中间代码、布尔表达式的跳转
及系统的运行过程。但在实际教学过程中,限于
代码、控制流语句的中间代码,实现源程序到等
课时安排,实验课和课堂讲授同步进行,通常只
价中间代码的转换。Kenneth C. Louden 编著的
能完成到中间代码生成阶段。编译程序构造是复
“编译原理与实践”以 Tiny 语言编译程序作为范
杂的程序开发,不可能在课堂教学中把所有细节
例 [4],结合各章内容讲解 Tiny 语言编译程序中
讲清楚,学生往往难以入手,在有限的时间内,
的相关部分的实现方法。
实验的效果不好。为了达到好的实验效果,促进
学生对编译原理的理解,教师从以下几个方面开 4 对课程发展的思考
展实验环节教学实践:
(1)注重自动工具的使用。利用 Lex/Yacc 编译 为培养高素质的计算机专业人才,重视软件

器自动生成工具,先实现简单的程序(如算术表达 开发能力的培养至关重要。在编译原理课程中强

式的转换 / 求值、HTML 文件转化成纯文本文件、 调理论知识的综合应用和编程实践能力的训练,

C 源程序格式化转化)
,所需知识限于正则表达式 要求学生针对特定语言(如 C 语言的子集),从

和自动生成工具本身的使用方法,对语义分析知 文法出发,设计一个编译器构造方案,并以此为

识要求较少,可以提供相关的资料和网上相关教 基础开发满足要求的编译器,将其看作软件开发

程,学生易于入手。目的是使学生体会到编译原 的综合训练的重要一环。

理的实用性,提高学习兴趣,并获得编译器自动 编译原理课程的实践是在理论基础知识的指

生成工具的使用经验,提高解决实际问题的能力。 导下进行。学生在学习基本理论后进行实验系统

(2)分阶段进行实验。根据课程的特点和大 的设计与实现;教师在掌握系统总体构成和基本

纲的要求,可以设置 4 个阶段的实验内容,词 原理、方法的基础上提出实验的基本要求。鼓励

法分析器的设计实现、由上向下递归下降分析器 学生选择适当的方法进行系统设计,包括选择自

的设计实现、利用工具生成的自底向上语法分析 动化生成方法。为实现相应效果,要求学生在每

器、语义分析和中间代码生成器的设计实现。每 个实验之前应完成设计、描述解决方法并给出算

个阶段需要利用之前得到的实验成果,逐步完成 法、编写出源程序、给出测试实例,实验完成后

编译器系统的构造,通过明确的阶段划分,接口 要求提交。学生对编译课程内容积极投入,绝大

的定义,提高编译原理实验的完成质量。 (下转第77页)
第 18 期 教育与教学研究 77

3 结 语 景不同,全面提高教学水平,提高学生能力存在
着不少困难。他山之石,可以攻玉,如何把国外
了解和借鉴国外大学的培养制度和经验,可 大学先进的教育理念和方法融入到我国教育的培
以促进和改善国内教育的发展,同时也需要结合 养体系中,借鉴他山之玉,积极促进我国教育
我国教育的实情和学生的特点,因材施教。我国 的国际化进程,是需要我们不断探讨和研究的
软件学院学生众多,教学资源相对紧张,学生背 问题。

参考文献:
[1] 张尧学, 吴爱华. 关于我国信息化教育的几点看法[J]. 计算机教育, 2008(5): 3-7.
[2] 周玲, 孙艳丽, 康小燕. 回归工程服务社会: 美国大学工程教育的案例分析与思考[J]. 清华大学教育研究, 2011(6): 117-124.
[3] 莫亮金, 刘少雪. 美国计算机科学与工程专业本科和硕士研究生课程设置特点分析 [J]. 中国大学教育, 2010(1): 86-89.

(见习编辑:刘丽丽)

(上接第68页)

多数学生都能够在有限时间内独立完成词法分析 5 结 语
和语法分析的实验,较优秀的学生能够独立完成
正所谓“教学相长”,提高编译原理课程教
中间代码生成的实验。
在教学过程中也发现了一些不足,编译原 学质量,需要教学双方的共同努力,互相促进。

理的教学和实验对后端工作不够深入,尤其是实 对学生而言,要提高自身学习积极性,敢于提出

验,往往到中间代码生成阶段已经接近学期末, 问题、解决问题;对教师而言,在讲授知识的同
目标代码(汇编代码)生成、寄存器分配、优化 时,要注重学生能力的培养,激发学生的学习兴
等没有充分时间进行,对综合运用 C 语言、计算 趣,充实教学内容,提升教学质量,在教学实践
机组成原理、汇编等知识锻炼不够。 中不断思考、探索、实践和总结。

参考文献:
[1] Aho A, Sethi R, Ullman J D. 编译原理[M]. 赵建华, 译. 2版. 北京: 机械工业出版社, 2009.
[2] 张昱, 陈意云, 郑启龙. 编译原理课程的教学方法和教材建设[J]. 中国大学教育, 2005(7): 61-62.
[3] Aho A, Sethi R, Ullman J D. 编译原理[M].赵建华, 译. 本科教学版. 北京: 机械工业出版社, 2009.
[4] Louden K C. 编译原理与实践[M]. 冯博琴, 冯岚, 译. 北京: 机械工业出版社, 2001: 373-380.

(编辑:赵廓)

You might also like