APP下载

案例与项目相结合的编译原理教学改革

2024-02-07高雪瑶张春祥

高教学刊 2024年3期
关键词:工程教育案例库案例分析

高雪瑶 张春祥

摘  要:该文剖释传统编译原理教学过程中存在的问题,在新工科和工程教育认证背景下,面向OBE理念建立案例库,充分利用多种教学平台和线上、线下教学资源,综合使用主动学习、启发式教学、翻转课堂等方法进行授课。以项目实践为驱动,以案例分析为导引,提高学生自主学习能力,提升授课质量,促使学生的计算机专业素质得到全面发展。

关键词:编译原理;新工科;工程教育;案例库;案例分析

中图分类号:G642      文献标志码:A          文章编号:2096-000X(2024)03-0064-04

Abstract: This paper analyzes the problems existing in traditional teaching process of Compiling Principles. Under the background of new engineering and engineering education certification, a case library is built facing OBE concept. Various teaching platforms, online and offline teaching resources are used, and active learning, heuristic teaching, flipped classroom and other methods are used for teaching. Driven by project practice and guided by case analysis, we aim to enhance students'self-learning ability, improve the teaching quality, and promote comprehensive development of students'computer professional qualities.

Keywords: Compiling Principles; new engineering; engineering education; case library; case analysis

编译原理是计算机专业培养计划中的一门核心专业课程,旨在培养学生系统分析和软件设计的能力,培养学生的实际动手能力。在新工科和工程教育认证背景下[1-2],编译原理教学过程必须以学生为中心,巩固理论知识,加强实践教学,注重学生创新意识的培养。为了达到新工科人才培养目标[3],必须对编译原理的教学方法和教学模式进行改革,以案例和项目实践为导向,将案例教学和项目实践教学贯穿于整个编译原理知识的传授过程之中,使学生更好地掌握编译技术,为今后工作打下坚实的基础。

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

编译原理是计算机专业的主干课程,也是后继课程的基础。编译原理是一门很有用的课程,在项目开发、科学研究中都很有用处。

编译原理课程的教学内容丰富,理论十分抽象,能够培养学生严谨的逻辑思维。此外,编译原理除了有自身的一套完整的理论体系之外,还包含大量的理论知识,诸如形式语言与自动机、离散数学中的图和大量重用的算法等。对于本科生而言,学习这些理论知识本身就具有一定的难度,更不要说再学好其上层的编译原理知识了。

此外,编译程序是一个大型的且十分复杂的软件系统。在实现编译程序时需要涉及到多门课程,例如,C++程序设计语言、算法、数据结构、离散数学和软件体系结构等。其实践的综合性与连贯性都很强,学生实验和实践的难度都很大。目前,很多教师对编译课程的实验和实践环节重视不够,在安排编译原理的项目实践和实验时也比较随意,从而导致学生学习效果很差。

二  面向实践教学的编译原理课程改革

根据新工科建设理念和面向工程教育认证的要求,哈尔滨理工大学计算机科学与技术专业积极开展编译原理课程的教学改革工作。根据新工科人才培养的要求,课程组建设了编译原理案例库,构建了基于项目实践的编译原理教学模式,给出了融合多种教学资源和教学方法的编译原理授课模式,提供了融合线上、线下资源的编译原理课程评价体系。

(一)  编译原理教学案例建设

编译原理是一门原理性和实践性都很强的课程,应以学生为中心,根据学生的知识基础和个人兴趣,设计教学案例[4-5]。编译原理主要讲述了编译器的实现技术,主要涉及词法分析器、语法分析器、句法分析器、中间代码生成与优化器和目标代码转换器等几个部分。梳理编译原理的课程体系,抽出所有的知识点,理清知识点之间的关联关系。针对每一个知识点,设计一个教学案例。所设计的案例应该是短小精悍的,既能够反映出知识点所包含的教学内容,又便于学生实现。合理安排教学案例的顺序,讲解案例。通过这些案例启发学生主动思维,介绍案例背后的相关编译理论和实现技术。通过讲解案例,能够将编译原理的知识点形象地呈现在学生面前。在剖析案例的时候,应该由“表”及“里”地分析,逐层撥开问题的表象,引出问题的本质,归结到对应的编译知识点上。讲解编译知识点的运用过程,给出案例的求解过程,使学生掌握运用编译技术来实现案例的全过程[6]。

编译器的设计宜采用管道过滤器模式,即一个部分处理一项任务,一个阶段的输出是另一个阶段的输入。编译原理的所有知识点可以围绕编译器各个部分进行归纳,所有案例应该按照各个部分的知识点进行组织。根据编译原理课程的知识体系结构图,绘制出案例的组织结构图。分析知识点之间的上下位关系,将对应的案例进行有机组织。对于关系紧密的知识点,应该分析其之间的关联关系,设计一个案例将所有知识点囊括进去。编译原理重要知识点之间的关联关系,如图1所示。对于正规式、正规文法、NFA、DFA和NFA的确定化和DFA的最小化这些知识点,存在着相互的关联关系,可以设计一个案例来讲解这几个知识点,让学生掌握正规式、正规文法、NFA之间的转换过程,NFA的确定化过程和DFA的最小化过程。将LL(1)文法的判定过程分解为FIRST集计算、FOLLOW集计算和Select集计算,可以设计一个运算较多的案例来讲解这几个知识点,让学生弄清楚和掌握LL(1)文法的判定过程。LR(0)文法需要构造LR(0)分析表,建立LR(0)分析表需要构造识别文法活前缀和可归前缀的NFA。在构造识别文法活前缀和可归前缀的NFA时,主要的方法包括:从特殊到一般的构造方法、活前缀和可归前缀的一般计算方法和项目集规范族构造法。因此,设计一个LR(0)文法,通过使用3种不同方法来构造其分析表,让学生掌握LR(0)文法的判定、分析表的构造和句子属于文法的判别过程。

编译原理的案例设计应该是一个复杂且系统化的工程。需要借鉴其他课程案例设计的优秀经验,最终形成精简、行之有效、系统和全面的案例库。在学习过程中,让学生有针对性地主动地去学习解决案例所需要的编译技术,使学生自主地从各种资料中去学习编译原理的相关知识点。

在教学过程中,首先描述案例所涉及的问题,然后介绍解决案例所使用的相关的编译技术。让学生对案例进行分析、讨论和复现,掌握案例的求解过程。同时,让学生对现有案例进行扩展、改进和创新。每个学生都要针对现有的知识点,去设计一个独有的案例。让学生对自己设计的案例进行分析、讲解和剖析,总结出自己特有的部分。通过对比所有学生设计的案例,寻找更好的、更具有代表性的和更典型的案例来扩充教学案例库。

(二)  基于项目实践的编译原理教学

以线上、线下教学资源为基础,指导学生开展编译原理项目实践,提高学生的学习成效[7]。编译原理的主要知识内容包括:语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。编译器的实现代码主要包括:词法分析模块、语法分析模块、语义分析模块、中间代码生成模块、目标代码生成模块、错误管理模块和表格管理模块。知识点与编译器的模块相对应[8]。在学习编译原理之前,所有的学生都已经学习了C++语言。从编码和执行效率角度看,C++是一门实现编译器的理想语言。学生在实现编译器的同时,不仅能够掌握编译技术,还能熟悉练习C++语言。让学生全程参与编译器项目的开发过程,突出“做中学习、做为学习、做即是学习”的思想,将编译原理中难以理解的逻辑和算法融入到学生能体会、能感受的具体系统代码中,变枯燥的学习过程为有趣的发现和创造过程,激发学生的好奇心,培养学生的创造潜力。随着编译课程的讲解,整个项目分阶段实施。每一阶段都有具体的实现模块与代码,让学生能从运行起来的工具上去学习和感受编译技术。从实际应用讲解知识点,让学生给出编译器的设计方案并开发自己的编译器,尝试在解决问题的过程中运用知识,从而达到学习知识的目的。

在项目实施过程中,分为项目实施前、项目实施中和项目实施后三个阶段。利用腾讯会议、慕课堂、QQ群等线上课堂发布项目实践要求和知识点预习及讨论话题,引导学生自主学习。同时,教师提出编译器项目需求。根据学生掌握知识的程度和编程能力的优劣进行分组,并选择一名组长负责本组学生活动的调度安排和任务分配。每一组设计开发一个编译器。教师整理项目实践教学案例,分析教学原则,整合教学过程,实现学习与实践的有机结合。根据课前项目需求,各组分阶段进行设计开发。学生参考线上提供的教学资源,进行設计开发。整个开发过程要严格遵守软件工程的流程,即需求分析、概要设计、详细设计、代码实现和测试。组内所有的学生都要参与其中。在整个实施过程中,教师可以讲解教学案例来为学生的设计开发作知识准备。对项目需求进行整体分析,对涉及的重点难点进行讲解。对各个小组的实际进度情况进行跟踪指导,及时解决项目实施过程中学生遇到的各种问题,如果出现共性问题,作统一分析讲解。课程组每周召开教学研讨会,根据学生项目实施的情况,及时调整教学方法和教学内容。在项目结束之后,通过答辩检查各组的成果。每组选择一名同学讲解自己编译器的设计开发情况。教师通过提问了解项目完成情况和每一个学生所作的工作,并给出成绩。

通过项目实践,坚持“教、学、做”一体化教学模式,将教学过程“以教师为主”转变为“以学生为中心”。学生通过设计开发编译器,根据需要自主学习编译技术的相关知识,将所学到的知识用于构建编译器,能从具体代码去直观地理解编译过程,从而使学生更好地掌握和应用编译知识。同时,在整个项目实施过程中,锻炼了学生项目开发能力和编程能力。

(三)  融合线上、线下多种教学资源的编译原理授课模式

案例能够让学生掌握编译原理细微的知识点,项目则能让学生在编译器的构建过程中将散落的知识点集成起来,形成整个知识体系结构。一个是微观的,一个是宏观的,二者相互呼应,相互补充。应该充分利用线上、线下多种教学平台,来提高教学质量。在授课过程中,采用主动学习、翻转课堂、启发式教学、案例教学和项目驱动教学等多种授课方法[9-10]。在班级课程群中,分享编译知识点的相关案例。课前,要求学生自主学习这些案例。学生通过查阅资料,去寻找解决这些案例的相关编译知识。通过问题倒推的方式,去学习编译知识。带着问题去学习编译原理知识,会更有针对性、目标性和方向性。在课堂上,采用翻转课堂授课方式,让学生介绍案例,阐述案例所关联的知识点。让学生使用知识点去求解案例,给出案例求解的完整过程。教师对学生的讲解过程进行点评,指出其中的不足,给出改进意见。课后,要求学生重新实现案例,掌握编译原理的相关知识点。

编译原理课程的一个重要特点是理论与实际紧密结合,教学内容中的很多知识点直接可通过编程实现作为编译器的一个组成部件。编译器包括:词法分析部件、语法分析部件、句法分析部件、中间代码生成部件、中间代码优化部件和目标代码生成部件。需要梳理编译器各个组成部件与案例之间的对应关系。

将案例按照编译器组成部件进行组织。在同一个编译器组成部件下,明确案例之间的先后关系,确定案例之间的上下位次序。画出编译器组成部件与案例、知识点之间的关联关系。让学生上机通过编程实现案例对应的程序代码。通过组装案例代码一步步地实现编译器的组成部件。在授课过程中,采用启发式引导、案例教学法、分析对比法和项目驱动法引导学生一步步地实现编译器的组成部件。通过演示程序,给学生以直观的印象。在演示词法分析部件时,让学生观察它是如何将源程序划分为单词序列的;在演示语法分析部件时,让学生观察它是如何指出源程序中的语法错误的;在演示中间代码生成部件时,让学生观察它是如何将源代码转化为三元组的形式;在演示中间代码优化部件时,让学生观察它是如何精简三元组的;在演示目标代码生成部件时,让学生观察它是如何将三元组转换成目标代码的。当编程实现所有组成部件之后,通过组装就构建了高级程序语言的编译器。通过演示编译器,让学生了解源程序代码转化为目标程序代码的全过程。在整个项目实施过程中,通过翻转课堂让学生自主设计实现编译器。采用启发式教学手段,让学生将编译任务分为一个个的案例,然后将案例转化为知识点进行实现。在编译器实现过程中,利用项目驱动教学手段,引导学生带着问题去主动学习编译原理的相关知识点与技术。采用讨论教学方法,让学生参与课程的学习过程。编译项目、案例与教学方法之间的关系如图2所示。

三  融合线上、线下资源建立编译原理课程评价体系

MOOC平台提供了很多编译原理的教学和实践课程,学生可以从中获取自主学习的资料。在每一段教學和实践视频之后,都有小测,可以要求学生在学习之后作答。教师利用MOOC堂的统计功能实时观察学生观看教学和实践视频的情况,观察学生小测成绩,客观地度量每一个学生的课前学习成效。为每一个学生建立一个课前学习成绩单。根据每次课前学习的成绩,及时调整授课内容和授课方式。

课堂上,根据听课情况和学习反馈情况,为每一个学生建立一个课堂学习成绩单。减少期末考试环节所占的比重,增加平时环节、实验环节和实践环节的占比。增加过程性考核的次数。在实验环节中,细化实验过程的考核,不止考察最终的实验结果,更注重阶段性考核,考察学生对每一个知识点掌握的情况。在实践环节中,注重学生的项目设计和程序编写能力的考核。通过答辩的形式,考查学生编译器体系结构的设计情况。通过程序演示和代码讲解,考查学生编程语言的掌握情况。同样,在项目实践考核中,也要增加过程性考核和考核的次数,进一步细化学生对知识点掌握程度的考察。

课后,要求学生完成MOOC平台上所发布的测试试题,来考核学生课堂的学习成效。课后测试应该在每节课后都进行一次,测试题的数量大,覆盖的课程知识点要多,试题的类型要多元化。同时,要定期安排一次阶段性的课后大考,以检验学生的整个学习情况。为每一个学生建立一个课后学习成绩单。

综合课前学习成绩单、课堂学习成绩单和课后学习成绩单,来为每一位学生打一个分数。在课程成绩考核时,应该鼓励学生多参加“蓝桥杯”、ACM大赛和大学生创新创业大赛,以提高学生的动手能力,并将大赛成绩适度地计入学生平时成绩之中。

期末考试所出的试题类型要多,覆盖知识点要广。尽量出一些答案不唯一的题目,以提高学生的创新能力。

四  结束语

本文通过分析编译原理教学中存在的重理论轻实践的问题,为适应人才培养的需要,建设了编译原理案例库。以开发编译器项目为驱动,为案例分析为导引,设计了一种基于项目实践的编译原理新型教学方法。给出了融合线上、线下多种教学资源和多种教学方法的编译原理授课模式,建立了编译原理课程评价新体系。

参考文献:

[1] 杨志斌,周勇,王立松.面向航空航天特色新工科的编译原理教学改革探索[J].软件导刊,2021,20(10):232-235.

[2] 赵晓,孙连山.聚焦培养工程能力的编译原理实验教学改革[J].电脑与电信,2023(Z1):8-11.

[3] 谌志群,王荣波,黄孝喜.新工科背景下编译原理课程工程案例设计[J].计算机时代,2020(12):91-93,96.

[4] 张卓.互动式案例教学法在“编译原理”中的应用[J].工业和信息化教育,2021(2):61-65.

[5] 计卫星,王贵珍.基于开源社区的编译原理课程构建[J].中国大学教学,2021(Z1):46-53.

[6] 韩敬利,夏青,宋丽华,等.基于函数式编程的编译原理理实一体化“金课”建设[J].计算机教育,2023(2):44-48.

[7] 韩玉艳,王玉亭,李成友.浅谈编译原理“互联网+”线上多样化教学[J].大学教育,2021(7):95-97.

[8] 张昱,黄奕桐.编译原理课程的在线综合性软件实践构建与实施[J].计算机教育,2021(4):41-45,50.

[9] 刘洪娟,宋经平,韩春燕.编译原理慕课建设与混合式教学设计[J].计算机教育,2020(4):98-101.

[10] 杨旭.新工科背景下基于混合式教学的编译原理课程教学改革探析[J].计算机产品与流通,2019(12):225.

猜你喜欢

工程教育案例库案例分析
心血管外科教学案例库的建设及应用研究
国内首个海事司法案例库正式上线
基于实践应用的基坑工程设计案例库建设研究
MTI朝鲜语同声传译教学案例库建设研究
基于CDIO理念的计算机类人才培养模式改革探索
基于工程思维的Java程序设计课程教学研究
父亲缺失案例分析
冷库建筑火灾特点及调查方法研究
金属材料类工程教育人才培养初探
高校图书馆阅读推广案例分析