基于Clang+LLVM 架构的编译原理课程教学探索
2020-02-26谢红侠刘明明
刘 兵,张 辰,谢红侠,刘明明
(1.中国矿业大学 计算机科学与技术学院,江苏 徐州 221116;2.江苏建筑职业技术学院 智能制造学院,江苏 徐州 221008)
0 引 言
编译原理是计算机科学与技术专业综合性和实践性都很强的课程,根据工程教育认证标准的要求,需要强化学生对系统软件的规划、组织、设计和实现的综合能力和素质,训练其对大型软件工程实施的技术与能力。针对本科编译原理课程教学特点的开源案例驱动的教学模式,即“案例—理论—概念”的模式通过将任务驱动与案例教学深度融合,以任务为载体,将开源编译器案例与相应理论知识、基本原理有机结合,锻炼学生自主学习、团队协作能力,保障工程教育认证标准的真正落地。
1 工程教育认证背景下的编译原理教学现状分析
面向工程教育认证标准,编译原理课程以培养具有系统软件开发与软件工程实施能力的人才为导向[1-3]。工程教育质量关注课程的培养目标、毕业要求、课程体系和课程教学。要求从经验型的粗放办学到科学精细化办学的转变、面向学科培养人才到面向社会需求培养人才的转变、教为中心到学为中心的转变、追求教了什么到追求学生学到了什么的转变,始终以学生的学习和发展为中心,全面提升学生的工程技术创新能力。
然而,当前编译原理课程的实践环节缺乏有效的开源编译代码支撑,传统的GCC 编译器代码较为复杂,很难要求学生在短期实践环节掌握。从知识传授到能力培养的转换方法不足。本科编译课程的教学内容与实践是“两层皮”,教学内容以教师传授为主,理论知识缺乏与实际案例的结合,学生很难与实际使用的语言进行关联理解,而实践环节往往缺乏对开源编译器的分析,实验内容面向简单的虚拟语言,学生很难对熟悉的高级程序语言进行验证性实验。此外,本科编译教学内容繁多,涉及编译各阶段使用的多种模型和算法。学生不仅要学习语言学相关理论,而且还需要学习词法分析方法、语法分析以及中间代码生成和优化等。这些模型和算法组装成一个完整的编译器系统变得非常困难,如果没有开源编译器和案例的支撑,学生很难在短时期内将种类繁多的分析算法进行整合、调试和运行。最后,尽管当前有些章节内容对高级程序语言(如C++)的编译实例进行了介绍,但不够深入、系统和全面,缺乏面向开源编译器的系统性知识体系组织,从而导致学生出现学习编译原理没有用的错觉。综上,当前分片式的教学内容组织难以满足工程教育认证所要求的提高复杂工程问题解决能力的要求[4-6],因此,如何围绕这一目标开展编译原理课程教学,是当前编译原理教学改革面临的突出问题。
2 面向工程教育认证的编译原理课程体系建设
2.1 课程达成度目标定位
为学生达到“对本领域复杂工程问题具有分析、设计和实现等能力”的专业培养目标奠定基础,具体目标如下:
(1)使学生掌握职业生涯中反复用到的基础理论和基本方法,以用于解决难度较大的问题,处理复杂系统的设计与实现。对于毕业要求一达成提供支撑。
(2)强化学生数字化、算法、模块化等专业核心意识,对自顶向下、自底向上、递归求解、模块化等典型方法的掌握,培养其包括功能划分、多模块协调、形式化描述、程序实现等在内的复杂系统设计实现能力。对于毕业要求一的达成提供支撑。
(3)培养学生选择适当的模型,以形式化的方法去描述语言及其翻译子系统,将它们用于系统的设计与实现的能力。对于毕业要求一的达成提供支撑。
(4)使学生经历复杂系统的设计与实现,培养其对多种方法、工具、环境的比较、评价和选择能力。方法选择:选择实现词法、语法分析的方法;实现途径选择:直接设计实现、使用某种自动生成工具设计实现(自学);工具与环境选择:使用的开发语言和环境;比较与评价:通过按组完成系统设计与实现培养学生团队协作能力。学生需要在分工、设计、实现、口头和书面报告等环节中相互协调、相互配合。对毕业要求二的达成提供一定的支撑。
基于以上分析,课程目标的制订见表1。
表1 课程目标的制订
2.2 开源案例与任务驱动相结合的教学方法运用
面向工程教育认证标准,编译原理课程以培养具有系统软件开发与软件工程实施能力的人才为导向[1-3]。重点培养具有以下3 方面素质的人才:一是理论性的,主要是对编译原理中模型的理解和运用;二是实践性的,主要是分析掌握开源编译器系统软件的能力;三是应用性的,主要利用编译原理中的方法解决具体行业应用问题的能力。为了实现工程教育认证所要求的解决复杂工程问题的要求,选择Clang+LLVM 编译器组织教学。课程体系的构建步骤如图1 所示。
以Clang+LLVM 为例组织教学,不仅可以让学生更深刻地理解编译器整体框架和编译的一般流程,还能锻炼学生独立分析和改进编译系统软件的水平,开拓学生独立承担科研任务的能力。通过课程知识体系与案例的融合,并与完成任务的相关知识串接起来,呈现一条明确的学习线索,同时结合案例,强调课程的基本原理和方法。学生易于建立对编译器的整体概念。通过典型案例引领、任务驱动学习模式设计,使课程学习贴近工作实际,学生学习兴趣浓厚,通过任务来驱动学生知识构建并提升编程和解决实际问题的能力。课程内容系统性更强,经典案例全面覆盖这些重要知识点。根据课程的知识体系,学生根据周教学目标对应学习目标,并对新知识进行自主探究式学习。同时学生进行分组,进行团体协作学习,共同完成项目任务。学生的团队合作意识显著提高,能力差的同学也能够通过主动学习和小组交流提高编程能力,能够完成要求的可视化编译子程序。
该教学方法以工程教育认证标准为导向,以开源案例为载体,形成开源案例与任务驱动结合的教学模式。根据教学内容组织,提出学生学习目标和学习任务。教师需要引导学生以任务为主线,对相关任务进行自主学习,鼓励学生协作,锻炼团队合作精神,共同完成任务,以学生为主体进行师生互动,具体方式如下。
(1)教师通过案例引出任务和目标。教师需要精心设计案例与任务的对应关系,并细化各教学阶段的任务,通过理论介绍与引导,对任务进行分工,同时要对每个阶段的任务进行评价和总结。
(2)学生为主体完成任务。学生通过理论知识学习和教师引导,明确各阶段任务,通过自主学习和协作学习,分析研究各阶段任务,最后通过教师的评价反馈进行总结和提高。
2.3 基于Clang+LLVM 的教学案例设计
LLVM 是一个完整的编译器架构,也可以认为它是一个用于开发编译器、解释器相关的库,是构架编译器(compiler)的框架系统。Clang 是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器。相比于传统的GCC 编译器,Clang 是一个高度模块化开发的轻量级编译器。以轻量级的Clang+LLVM 架构组织教学,不仅可以让学生更深刻地理解编译器整体框架和编译的一般流程,还能锻炼学生独立分析和改进编译系统软件的水平,开拓学生独立承担科研任务的能力,具体步骤如下。
(1)面向开源编译器的教学内容的划分。根据课程的知识体系,以Clang+LLVM 编译器为平台,以开源案例驱动的教学内容组织为核心,将编译器划分为一个个模块。
(2)局部到整体的教学内容组织。LLVM 整体架构中各个子模块又相对独立,分别对应不同的具体子阶段,既能给学生提供整体概念,又能通过具体的案例库设计实现学生对编译系统各阶段功能的掌握。
(3)课堂教学与实践环节的有机融合。在教学内容划分的基础上,将每个子模块与实践环节相对应,明确学习和研究的目标。
3 面向工程教育认证的评价机制
3.1 课程目标与考核内容
课程评价是工程教育认证的重要组成部分。课程评价仍然要以学生产出为导向,分析目标的达成度和改进措施。要综合考虑学生在解决复杂工程问题过程中所体现的认知、态度、表达、实践能力等多方面因素。要重视过程评价,在任务驱动的基础上,发挥学生的主体作用,提高学生完成任务的积极性,并根据完成的情况进行分析评价,从而改变过去以期末考试为单一的评价方式,变单一评价为综合评价。真正充分发挥课程评价机制的反馈、导向和激励功能,完成工程教育认证的目标。本课程采用过程考核和结课考试(闭卷)相结合的评价方式。教师根据课程进度安排课外作业和随堂测验等过程考核,过程考核成绩占课程最终成绩比例为30%,结课考试成绩占课程最终成绩比例为70%。最终成绩按百分制给出,60 分为及格。课程目标、考核内容与评价方式见表2。
3.2 过程考核评定标准
编译技术课程平时成绩由1 次随堂测验、3次课后作业和实验环节组成,随堂测验的内容包括有限自动机、正规表达式及正规文法理论;课程实验主要考核词法分析、语法分析和中间代码生成的设计与实现。随堂测验、课后作业均按照百分制计分,每次各占平时成绩的25%。
1)随堂测试评定。
随堂测验教师课前出题、课堂考试、限时答题。采取了书面答题的形式,考试提交纸质答案。具体评定标准见表3。
2)课后作业评定。
作业评定依据包括:①对问题的理解是否准确,特别是解决问题的思路是否正确;②算法分析与分析表构造是否正确,书写是否准确和规范。具体评定标准见表4。
表3 课堂测试评定标准
表4 作业评定标准
3)实践环节评价。
在实验教学环节,同样以Clang+LLVM 编译器为平台,通过对开源案例与实验任务进行分阶段的设计,把整个编译阶段划分成一个个独立的子任务。针对每个任务,对学生进行分组,以工程项目的形式组织开发团队,利用软件工程管理方法对项目开发进行管理,设置学生在项目开发过程中的角色定位。在项目开发中锻炼学生的自主开发能力、团队协作能力、项目管理能力以及复杂工程问题解决能力,不仅可以加深对课堂知识的理解,而且能够在解决问题中自主、探究和协作学习,巧妙地把工程教育认证标准与实验教学环节相对应。我们通过过程评价机制对实践环节进行综合评价,引导学生由易到难、由浅入深、由局部到整体逐步深入地掌握课程要求的知识体系和工程实践能力。
4 结 语
面向工程教育认证的编译原理课程教学改革,推动了开源编译器案例驱动的教学体系建设,有力地促进了课程教学与工程实践的深度融合,实践证明能够更有效地培养学生解决编译器复杂工程问题的创新实践能力。然而,需要注意的是,教学评价是整个工程教育认证中的重要一环,新的教学体系需要根据教学效果和达成度进行持续改进,促进教学质量的不断提升。