编译原理课程教学实践探究

2018-12-30 04:05侯书东常家琦
关键词:编译器原理教学方式

侯书东,常家琦,刘 恒

(安徽工业大学 计算机科学与技术学院,安徽 马鞍山 243002)

编译原理作为计算机类专业的传统核心课程,对学生专业系统能力的培养具有重要意义。编译原理课程的重要性在于:编译器的开发是计算机软件开发的一个综合;解决问题的思想方法有利于计算思维的培养,对于计算机专业素养形成十分必要[1]。

一、传统编译原理课程教学中存在的问题

计算机类专业本科生学习本专业的第一门语言课程是C语言。C语言由于其类型不安全性,容易出现一些难以捉摸的错误,使得学生难以定位和解决问题。如果能让学生根据编译器提供的提示信息,精确定位程序中的错误类型和位置,把编译原理中所学用于实际C语言编程需求,这既完成了课程的教学内容,也提升了学生的软件编程和系统分析的能力。

从普通高等院校的编译原理教学实际出发,其课程覆盖范围一般仅限于编译器的前端,即词法分析、语法分析和语法制导翻译等内容[2]。这其中包括大量抽象且逻辑复杂的理论知识点,如形式语言理论、正规式、有限自动机、上下文无关文法、属性文法和语法制导翻译等。传统的教学方式强调知识点的灌输,让学生解决孤立的单一问题,缺乏各知识点之间的关联。这种“只见树木,不见森林”的教学方式会极大地削弱学生的学习积极性,导致整体效果不佳。

理论教学的重要性不言而喻,然而面对当前社会“碎片化学习”,要确保授课效果的高质量,需要对课堂内容的选择和教学方式的安排进行精心设计。尤为重要的是激发学生的学习热情,实现从被动接受到主动学习过程的角色转换。

二、以实践为导向的互助式编译原理教学

(一)理论与实践相衔接

理论知识的来源一般都有其确定的问题背景。脱离实际问题来进行理论教学,对学生实际能力的提升没有益处。编译原理课程中的大量理论知识,存在一种衔接递进的关系,每个知识点的引入和拓展,都是对于现实遇到问题的解决路径再现。因此,整个授课过程就在重现这种解决方案演变的变化历程。而实现这一目标的关键之处,是教师从之前的“站到讲台前”变到现在的“坐在学生中”。这一变化绝不仅仅是简单地将所有问题留给学生,从“讲授”变成“答疑”,而是从问题设计、思考启迪、讨论引导到过程管理等各方面都对教师提高了要求。特别是现代高级语言发展日新月异,各种新问题层出不穷,如何在面对开放性的未知问题时,从系统和整体的角度给出学生解决问题的方式方法,而不是给出具体每个问题的回答[3],这是对教师能力的一种新考验。

计算机类专业课程教学的目的,归根结底是以培养和提升学生们现实动手能力为主题。“考试高分”仅是手段,“实践高手”才是目的。通过精心设计的问题场景,激发学生的学习兴趣,逐步引导讨论内容,得到初步解决方案,再层层优化,最后比较与经典方法的优劣之处。这样的理论与实践交叉的教学方式,可以让学生从根源上理解并掌握理论技术的来龙去脉,避免繁杂的死记硬背以及理论与实践脱节,在实践中学习和总结规律。

在编译原理课程教学里,以词法分析为例阐述如何从正规式构造等价自动机的内容必不可少。在先修的高级语言课程中,学生只需知道如何运用正规式。而在本课程学习中,则需进一步掌握正规式的实现原理。正规式的实现方式主要有非确定有限自动机(NFA)和确定有限自动机(DFA)两种引擎方式。在教学过程中,常规流程都是给定正规式,构造其NFA,在此基础上转化为DFA,最后进行最简化处理。这在无形中向学生暗示了DFA才是词法分析实现的最终手段,其实不然,两种引擎方式各有其优缺点和应用场景。DFA是文本主导,执行速度快,可以确保匹配最长的可能字符串,满足结果一致性。NFA是表达式主导,需要反复的吃、吐字符,存在着大量的回溯过程,速度慢。但是其特性丰富,可以捕获子表达式匹配和匹配的反向引用。子表达式编写方式不同,对于DFA是无差异的,但是对NFA的控制方式是不同的。如果能从编码实现的角度考虑这两种方式的异同,启迪学生的独立思考能力,其教学效果要明显优于枯燥的理论知识传授。

以编译原理课程教学中语法分析中的算符优先分析为例,在讨论终结符之间的优先关系时,与传统认知是有一定区别的。此处有必要回顾“离散数学”中对于“关系”的定义。回顾恒等关系的定义,需要同时满足自反性、对称性和传递性。显然,算符之间的优先关系是可以不满足这三种性质的。以四则运算为例,存在+>+,即加号的优先级是大于加号的,不满足自反性。同时,由于(=),而不存在)=(,所以不满足对称性。另外,同时存在+<(、(<+和+>+同时成立,不符合传递性的性质。这中间的区别就在于不仅需要考虑待比较的两个算符,算符出现的先后顺序也至关重要。至此,算符之间的优先级,与自然数的大小比较、或者与线程调度中的优先级等概念中的区别之处自然显现。这也引出了后续算符优先函数的方便与不足之处。这种先后课程之间知识点的贯通,既加深了对已有知识的理解,同时也更新了知识图谱。

(二)编译器设计实现方案

编译原理课程教学理想情况,学生应该能够独立自主完成小型编译系统的构造。实际教学中,学生只需吃透关键的几条原理知识,如NFA的确定化,LL(1)文法中FIRST和FOLLOW集合的构造,LR(1)文法中识别活前缀DFA构造等,基本上已经满足了课程考试要求。然而,仅靠理论学习对实现一个基础编译器来说是远远不足的。相比较于学生对理论知识的接受程度,学生自主动手完成编译系统的能力缺乏就更为明显。如何面对全体学生,制定出一套适用的实践方案,是课程实际效用的关键。

对于编译原理课程复杂实现机理可以在后续过程中逐步展开,串联起数据结构、操作系统、组成原理等一系列关联课程,让其学而有物。对于学有余力的学生,可以提高要求,让其完成类C编译器。对于确实难以独立完成的,最基本的要求是可以复现课程演示的四则运算。要求不同,体现在设计语言的复杂度不同。囿于师资力量薄弱,对于编译器的设计要求以前端为主,关于目标代码生成了解即可,不做具体要求。

以布尔表达式的翻译模式为例,通过语法制导翻译内容的学习,对于条件表达式中的短路规则的设计初衷已了然于胸。然而如何最小化跳转语句的出现,掌握回填技术的使用,乃至初涉独立于机器的优化过程,对于编译器实现质量的优劣影响至远。仅仅明白基本原理的应用,缺乏对软件实现细节的敏感度和执行效率的考量,很难满足实用性的要求。特别是在面对“流量决定一切”的时代,用户体验对于产品品质的要求日益挑剔,任何细节之处的忽略都可能面临致命的打击。不求功能的复杂全面,但求体验的流畅舒适,在系统设计实现的全过程中,将用户需求作为第一位,对于端正学生的学习和工作态度,是一次很好的锻炼机会。

三、结语

通过精心设计的问题引导与自动化编译工具,逐步展开编译器设计的主要内容,教学既不失课程的专业性要求又吸引了学生的兴趣点,能有效提升学生的综合实践能力。在后续教学改革中,借助慕课、反转等多样教学形式,增加课堂讨论、启发、互动的过程,最大限度地激发学生的学习热情,仍需不断地探索和尝试。

猜你喜欢
编译器原理教学方式
基于包络解调原理的低转速滚动轴承故障诊断
面向理想性能空间的跨架构编译分析方法
优化教学方式 提升初中语文教学质量
高校钢琴教学方式拓展的思考与实践
灵活采用教学方式 提升语文教学效率
以“问题化教学”为导向 有效转变物理教学方式
基于电力系统备自投实现功能原理概述
运行速度大突破华为《方舟编译器》详解
优化编译器的设计
基于ARM嵌入式平台的x86译码SOC架构设计