面向航空航天特色新工科的编译原理教学改革探索

2021-10-28 07:51杨志斌王立松
软件导刊 2021年10期
关键词:编译器航空航天课程设计

杨志斌,周 勇,王立松

(南京航空航天大学计算机科学与技术学院,江苏南京 210016)

0 引言

2017 年2 月以来,教育部基于国家近期的战略发展要求,积极推进“新工科”建设,尤其针对工业软件、系统软件、人工智能等方面核心技术人才需求日益迫切的问题,提出培养多元化、创新型的卓越工程人才[1]。作为行业特色鲜明的部属高校和工科优势高校,聚焦国家发展战略,努力探索航空航天特色新工科人才培养体系建设,培养满足行业当前与未来发展需要的高素质工程人才,是南京航空航天大学应有的职责[2]。未来航空电子、航天器等安全关键系统呈现软件定义化、智能化、网络化等发展趋势,复杂的应用环境、多变的任务需求,给这类系统中的软件研发带来新的挑战。通用软件工程人才不能完全胜任相关工作,因此目前急需培养面向高安全系统领域的软件工程专门人才[3]。

编译原理是软件工程专业课程体系中的关键课程。其理论课程内容比较抽象,学生在学习过程中需要不断地建立计算机系统观,课程设计又需要学生具备较强的架构设计、编程实现、测试、文档撰写等软件工程能力,因此学生学习这门课程会有一定难度。同时,编译原理课程内容十分重要,编译程序的原理、方法和技术已广泛应用于一些非编译系统中。近年来,模型驱动开发方法逐渐成为航空航天领域软件设计与开发的重要手段,其中模型转换、代码自动生成等技术都是编译原理知识的具体应用。为此,很多学者对编译原理课程教学进行了研究。例如,崔光宇[4]总结了编译原理教学现状,包括学生对课程的认识模糊、编译原理理论抽象、算法较为复杂、程序设计要求较高等;孙守卿[5]研究基于工程教育专业认证的编译原理课程改革,针对课程标准、教学内容、教学模式、考核形式等给出了相应措施;刘兵等[6]根据工程教育专业认证对复杂工程问题解决能力的要求,以Clang+LLVM 作为编译器实例化案例,以C++语言作为教学语言,提出一种适合编译原理课程的实例化驱动混合教学模式;谌志群等[7]设计新工科背景下的编译原理课程工程案例,提出以工程案例作为课堂教学与产业需求之间的结合点,将课程知识点融入到工程案例中。

相比已有工作,本文主要针对航空航天特色新工科背景下的软件工程创新型人才培养进行思考与探索,以编译原理课程为例,研究面向航空航天领域软件工程的科研教学相互促进机制,提出“将科研引入课堂、将学生带出课堂”的教学改革思路,让学生带着“学有所用”的心态去上课,从而提升学习兴趣;给出面向复杂工程能力培养的编译原理课程改革方案,凝练与重构理论教学主线,提出两级课程设计实验体系,以培养学生的计算机系统能力与软件工程能力,同时提升其解决复杂工程问题的能力。根据学生的学习成效和反馈,表明课程改革有效提高了教学质量。

1 教学改革总体目标

以解决安全关键领域的软件高可靠性、高安全性问题为目标,通过高安全系统软件工程学科人才培养,让学生从学会写小规模软件(Student Software)到学会写高质量大规模工业软件(Industrial Software),并深刻理解只有在软件工程理论与技术方面打下良好基础,才能有效保障软件的可靠性和安全性。

作为南京航空航天大学软件工程专业的学生,需要培养两个通用能力,即计算机系统能力和软件工程能力,如图1 所示。

首先,目前各课程大多独立进行设计与实施,知识体系规划缺乏系统性,使学生不能很好地建立完整的计算机系统观念[8]。按照教育部计算机类指导委员会给出的定义,计算机系统能力是指理解计算机系统的整体性、关联性、层次性、动态性和开放性,并综合运用多种知识与技术完成系统开发的能力。对于本科生而言,主要体现在能够自主设计一个CPU、操作系统(内核)或编译器。其次,当学生编写小型软件时,其往往更关注于数据结构与算法层面。按照工程教育认证、新工科的要求,学会解决复杂工程问题成为本科人才培养的一个重要趋势[9]。华为公司2019 年1 号文曾经提出,需全面提升软件人才的软件工程实践能力,打造可信的高质量产品。航空航天特色新工科培养的人才将来要面对的是面向不同领域的大规模软件,可能包括百万行甚至千万行代码,尤其针对航空航天领域的大规模高可靠软件,此时软件工程能力成为一种重要而又通用的能力。

Fig.1 Computer system ability and software engineering ability training for emerging engineering图1 面向新工科的计算机系统能力与软件工程能力培养

编译原理是软件工程专业的重要课程,在学习过程中,学生需要具备计算机系统观及较强的软件工程能力,才能解决复杂的工程问题[10]。笔者在安全关键软件系统开发与验证技术研究中大量使用了编译原理相关技术,因此在具体教学过程中使课题组的科学研究与教学相互促进,让学生带着“学有所用”的心态去上课,令其学习兴趣更加浓厚。同时,通过把书本知识与科研实践进行对比,可提升学生的学习效果。另外,凝练与重构理论教学主线,提出两级课程设计实验体系,以锻炼学生的计算机系统能力与软件工程能力。

2 科研教学相促改革实践

一流的科学研究与一流的教学教育是“双一流”建设的重要基石,依赖于高水平的科研及教学创新能力。在教学实践过程中,本文围绕教学改革目标,实施“将科研引入课堂、将学生带出课堂”的对策,让学生感受到“枯燥”“难度大”的编译原理知识在航空航天领域软件工程研究或系统开发中的重要应用,以提升学生的学习兴趣与学习效果。

(1)引入机制方面。课题组研究涉及模型驱动开发、形式化设计与验证、代码自动生成、逆向工程、安全关键智能软件建模与验证等,编译原理课程中的形式语言、自动机、编译过程、编译优化等知识是课题组研究的重要基础。笔者将自己的研究方法及研究思维方式引入教学中,训练学生的科研思维能力。例如,在讲解运行时存储空间组织与优化技术时,让学生了解时间可预测多核处理器以及多线程程序分析等方面的研究。每一章都会进行总结,包括基本知识及外延知识。

在实际教学过程中,适度调整理论课程教学内容,减少已有课程中的冗余内容,在课程中增加模型驱动、高安全软件设计等新研究进展,并邀请国内航空航天研究所的工程师及法国教授到学校进行授课。尤其是在学期末通过沙龙形式总结编译原理课程中实行的科研与教学相促机制的探索,介绍课题组研制的安全关键软件形式化设计与验证系统(10 万行代码规模)及其在航天领域的应用,简要分析系统中使用的编译技术,让学生体会到编译原理知识在工程研究或系统开发中的重要应用。

(2)带出机制方面。首先,构建本科生新型导师制,切实构建本科生进入科研实验室及参与导师科研项目的学习团队组建机制、学术指导机制、激励评价机制,激发学生创新意识,培养学生的科学探究能力和工程实践能力。同时依托“高安全系统的软件开发与验证技术”工信部重点实验室成立了安全软件小组。近5 年来,已有30 余名优秀本科生在学习编译原理课程的同时参与到课题组科研中,共参加了国家自然科学基金、国防基础科研重点项目、装发重大项目子课题、江苏省自然科学基金等课题的研究,并基于项目研究组队参加校级科创竞赛,起到了切实的教学与科研相互促进的效果。

其次,由于课题组项目大多是与航空航天研究所联合申请并共同完成的,因此学校进一步探索企业导师的教学方式。到课题组参与科研的本科生中,有15 位学生在企业导师的指导下,到航天804 所、航天706 所、航空631 所等单位进行现场学习与交流。

学生们都感受到从编译原理课程理论学习到进入课题组参与实际科研项目,知识衔接比较顺畅,学有所用,同时又在课题中扩展了视野。

3 面向复杂工程能力培养的教学改革实践

为了在编译原理课程教学中实践“科研教学相互促进”的教学理念,本文在编译原理理论教学与课程设计等方面进行了改革。

3.1 课程理论教学

在理论教学过程中,主要从4 个方面进行教学优化:

(1)凝练与重构教学主线。在理论层面,分为语言定义(正规文法、上下文无关文法、中间语言、目标语言)和机器识别(有限自动机识别词法、下推自动机识别语法、虚拟机执行中间语言、CPU 执行目标语言)两个层次;在编译程序实现层面,与理论知识对应,通过程序实现的方式逐步实现文法定义、词法分析、语法分析、语义分析、中间程序生成、目标程序生成等编译步骤,并在最终的课程设计中构造一个完整的编译器,使学生清晰了解编译理论与实现技术之间的对应关系。

(2)开阔学生视野。在授课过程中介绍编译原理知识与主流编译器的对照,如VC、GCC、LLVM、Clang 等,提高学生的学习兴趣。

(3)强化计算机系统思维。梳理编译原理与程序设计、汇编语言、计算机硬件(尤其是存储、多核处理器)、操作系统等课程之间的有机联系。

(4)突出编译原理在软件工程,尤其是航空航天领域软件工程中的应用。编译原理与技术是模型驱动开发方法、模型转换的重要基础,并扩展介绍程序语言的形式语义、编译器验证等知识。

3.2 课程设计

编译原理课程设计主要培养学生的工程实践能力,遵循建构主义学习论。编译原理课程采用两级实验体系,如表1 所示。

Table 1 Experiments framework of the compiler principles course表1 编译原理实验体系

(1)在理论知识学习过程中,根据课程进度逐步实现文法定义、词法分析、语法分析、语义分析、中间程序生成、目标程序生成等编译步骤,并在课程设计中构造一个完整的编译器。其中,词法分析中的正规文法与非确定有限自动机的等价转换、非确定有限自动机的确定化与最小化,以及语法分析中的自上而下分析LL(1)和自下而上分析LR(0)、SLR(1)必须实现,其它算法学生可根据自己兴趣进行选择。平时的编译模块实现过程主要是帮助学生进行理论学习,加深对理论知识的理解。

(2)在最后的课程设计中,使学生对编译过程有比较完整的认识,能够快速地对整个编译程序进行重构、改进、优化与测试,进一步锻炼学生的团队协作、答辩表达、文档撰写等能力。

两级实验体系体现了理论课程与课程设计之间的紧密联系。第一级实验主要是在理论课授课过程中,学生逐步动手实现编译过程中的关键算法,第二级实验是在前者的基础上,完成编译器的架构设计、功能实现、优化与测试。

针对复杂工程能力培养问题,一方面,编译器设计与实现本身就是一个复杂的工程问题,通过课程设计,学生逐渐体会使用软件工程化思想进行编译器实现;另一方面,在编译器代码优化与测试阶段,给学生讲解软件安全性、可靠性在航空航天领域的重要性,代码优化、严格测试及编译器验证等工作都是提高航空航天软件质量的有效手段。

4 教学改革结果反馈

通过连续5 年在南京航空航天大学计算机学院软件工程专业的编译原理课程中实施教学改革,根据学生学习成效与学习反馈,表明教学改革很好地提高了教学质量。以2020 年度为例,如表2、表3 所示,编译原理理论考试80 分以上的人数占比为67.2%,且“工程知识”和“问题分析”的毕业要求达成度分别为0.755 269 和0.830 24。

Table 2 Statistical data of the scores of compiler principles(2020)表2 2020 年软件工程专业编译原理课程成绩统计

Table 3 Achieved degree of the compiler principles course(2020)表3 2020 年软件工程专业编译原理课程达成度分析

每一学年都会收集学生的学习反馈,用于持续改进教学。学生的主要反馈内容包括:在循序渐进的学习过程中将编译原理知识一点点融会贯通,由零化整,逐步了解编译具体过程并具备了构造一个简单编译器的能力;通过每一章的作业对课堂上学到的知识进行复习巩固,更加深入地理解了编译原理;通过平时的实验与课程设计,将在其它课程上学到的知识(如数据结构、计算机组成原理等)联系起来,亲自动手编程,锻炼了自己的系统开发能力;通过编译原理课程的学习,感受到了编译的重要性和培养计算机系统能力对一个软件工程专业学生的必要性;学术沙龙以及到课题组参与科研的形式,有助于了解编译理论知识在科研中的实际应用,学以致用才能学得更好。

5 结语

本文以航空航天特色新工科背景下软件工程创新型人才培养为目标,以编译原理课程为例,研究面向航空航天领域软件工程的科研教学相促机制,实施“将科研引入课堂、将学生带出课堂”的教学改革思路,让学生带着“学有所用”的心态去上课,令其学习兴趣更加浓厚;开展面向复杂工程能力培养的编译原理课程改革,凝练与重构理论教学主线,提出两级课程设计实验体系,培养学生的计算机系统能力与软件工程能力,从而提升其解决复杂工程问题的能力。根据学生成绩与学习反馈,表明课程改革有效提高了教学质量。本文提出的教学实践经验虽然以软件工程学科的编译原理课程为例,但在一定程度上也适合于其它课程及其它学科。

猜你喜欢
编译器航空航天课程设计
第十五届航空航天月桂奖
第十五届航空航天月桂奖
基于相异编译器的安全计算机平台交叉编译环境设计
龙凤元素系列课程设计
基于Articulate Storyline的微课程设计与开发
一飞冲天——中国航空航天史
通用NC代码编译器的设计与实现
基于自动化系统的PLC课程设计
开放大学课程设计与资源开发
编译器无关性编码在微控制器中的优势