基于开源社区的编译原理课程构建
2021-03-31计卫星王贵珍
计卫星 王贵珍
摘 要:目前我国高等教育从规模扩展全面转向内涵式发展,改进培养模式和方法,提高各领域人才培养质量,一流课程建设是关键之举。本文详细阐述了在“云大物智”等新技术快速演进的新时期如何基于开源社区构建编译原理研究型课程,具体包括在现有研究型课程定义的基础上进一步明确研究型课程的具体特征,说明基于开源社区构建编译原理研究型课程的原因和具体方案,结合基于问题的学习和U型七步法给出教学组织与实施的具体步骤,最后通过实践说明方案的可行性。
关键词:编译原理;课程建设;开源生态;人才培养
一、引言
经过长时间的积累和孕育,中国的芯片制造和系统软件研发步入了一个新的历史发展阶段,各种国产芯片呈现百花齐放的良好局面,不仅出现了面向服务器、桌面系统和智能终端的各类芯片,而且部分企业也已经制订了“生产一批、研制一批、规划一批”的长远发展路线图。虽然大部分芯片的研制基于已有的指令架构,并且融合了开源资源,但是正在逐渐形成具有自身特色和差异性的产品体系。芯片和系统软件也逐步向开源靠拢,产学研正在大力推动开源社区的建设和发展。在此基础上,源于国内的开源协议和代码托管平台逐渐走进普通开发者的视野。从整体上看,国产芯片和系统软件正在融合形成一体化开发生态的良好趋势,部分头部IT企业更加重视人才生态体系建设的重要性,不断加大资源投入,加速构建和形成产学研一体化的开源人才生态。
在此背景下,随着智能技术的不断发展和受国际形势的影响,编译器及其社区建设也正在逐渐发生改变。例如华为公司开源了部分方舟编译器的源码,并大力打造基于方舟和鸿蒙系统的开源社区。人工智能技术的发展,特别是深度神经网络及大量加速芯片的出现,推动了TVM等开源项目的创建和不断发展。各大公司也在基于自己的芯片设计和实现支撑智能应用快速构建的工具链软件,量子计算机的不断突破推动相关编程语言和仿真工具的快速发展。程序设计语言和编译理论与技术也迎来了在新的历史时期再次发展和应用的新机遇。与传统编译技术相比,目前以及将来的需求与应用贴合得更加紧密,并且面向的问题也更加抽象和复杂,这就对编译人才的培养提出了新的需求。
首先,编译人才的培养应紧跟时代发展和技术进步,注重应用的引领发展作用。随着“云大物智”的不断发展和成熟,应用不仅驱动了计算机体系架构的发展变化,也逐步在影响系统软件的地位和作用。关注应用的发展和未来趋势,能够预先布局人才培养,引领技术发展。例如量子计算正逐步走进大众视野,面向量子计算机的编程语言和工具链也逐步成为大家关注的热点。
其次,编译人才的培养应面向产业需求,走产学研相结合的发展路线,让“所学即所用”更早地贯彻到教学过程中。直接面向产业实际需求,让学生能够直观地感受学习的有用性和实用性。同时要让“科研引领教学”成为潮流,培养学生的超前创新意识以及引领技术发展和进步的领导和责任意识。
最后,编译人才的培养要面向现实,直面课堂学习和工程实践之间的差异性。教学的组织实施面临众多的问题,这些问题既有整体设计、全局规划不到位的原因,也有资源受限、时间和空间受限的实际情况,如何调和二者之间的矛盾是解决问题的关键。
满足产业需求是整体教学设计的基础和出发点,科教融合是核心理念,产学协同是教学组织实施的具体路线。本文基于开源生态,探讨编译原理研究型课程的革新方案,考虑到学生学习特点和时间特点,提出基于开源社区的编译课程建设与人才培养方案,兼顾学校理论学习与工业强度训练,实现创新与实践相结合,形成具有特色的编译人才培养路径。
本文首先对研究型课程的基本概念和内涵进行阐述,接下来讨论基于开源社区进行研究型课程建设以及编译人才培养的优势与特点,而后详细阐述对应的课程教学方案设计与实施方式,最后通过一学期的教学实践对所提出的方法进行验证。
二、研究型课程内涵
行为主义、认知主义、建构主义和人本主义是教育心理学的四种代表流派,其中建构主义认为学习的过程是学习者主动建构知识的过程,学习是建构内在心理表征的过程,学习者并不是把知识从外界搬到记忆中,而是以原有的经验为基础,通过与外界的相互作用来建构新的理解。因此学习活动不是由教师单纯向学生传递知识,也不是学生被动地接受信息的过程,而是学生凭借原有的知识和经验,通过与外界的互动,主动地生成信息内在表示的过程。建构主义的主要应用是探究式学习,亦即研究型教学。研究型教学首先是一种新型的教学模式。所谓教学模式,就是在一定教学思想指导下,为实现教学目标而建立的比较稳定的教学操作程序及理论化的教学结构[1]。
目前关于研究型教学并没有统一的认识[2-4],其中文章[5]给出的具体定义为:“以课程内容和学生的知识经验为基础,在教学过程中选择恰当的科学问题为载体,以学生为中心创设情境,引导学生充分参与、主动探究,使学生能够自主地发现问题、研究问题和解决问题,并从中体验资料收集、方案设计、方案研讨、实验验证、得出结论完整的科学研究过程,进而学习科学知识、掌握研究方法,并培养其创新能力和探究精神。”文章[6]认为研究型教学模式则是以知识传授为依托,以能力培养为主要内容,把学习、研究、实践有机结合以引导学生深度参与、主动发挥创造性地运用知识和能力,自主地发现问题、研究问题和解决问题,在研讨中积累知识、培养能力和锻炼思维,同时养成科学研究的精神和科学态度,以培养高层次、复合型、多样化的高素质创新型人才的一种教学模式。文献[7]也给出了类似的定义。
沈其华等人对近年一项面向二十多所研究型大学的调研结果进行分析,梳理了这些研究型大学课程改革的主要议题和重点,总结了5个关键词,它们分别是:科教融合、学术素养、学科交叉、国际联结和社区参与。其中科教融合要求在微观的课程设计和教学实施层面,建立以科研成果为主导的教学、以科研方法训练为导向的教学、基于科研项目的教学和由教学研究支撑的教学等几个路径,使得科研项目不再游离于专业核心课程之外;学术素养主要指的是学术写作和表达交流的能力,学术素养的培养主要体现为在专业的主干、核心课程中打造相关的阅读、写作与表达训练模块;学科交叉则主要是指部分学校对于本科生交叉学科学习的有效性进行了自审,对如何保持课程深度与广度之间的平衡展开了讨論;国际联结主要强调培养“全球公民”意识,提高所有在校生的跨文化意识和技能;社区参与是指大学通过和地方以及国家组织、社团和社区的合作,拓展活动和影响边界、进行知识传播与创造,许多大学都认识到,从本科教学和学生发展的角度,社区参与能够培养学生的社会责任心,提高其应用知识、解决复杂实践问题的能力,促进全面发展,以及提供潜在的就业创业机会等[8]。这是对课程观察的结果,从其中的论述不难发现,科教融合与学术素养其实对应着问题导向的教学模式,国际联结和社区参与在问题的解决方式和参与深度上给出了具体的要求。
关于研究型教学的设计与组织实施,文章[5]同样也提出课程教学应以PBL(Problem Based Learning)策略为主线,以“专题研讨”和“案例研讨”为主要教学方法,并将有助于开展研究型教学的多种启发式、互动式教学方法有机结合。无论是“专题研讨”,还是“案例研讨”,都是以问题为先导,由问题的解决而引发讨论。因此,在授课过程中结合课程内容精心创设情境引出问题,注重培养计算思维和创新能力,帮助学生学会如何学习,符合研究型教学理念,有效地提高了课堂教学效果和课程教学质量。关于问题的研讨过程,文章[9]提出了U型七步探究法,老师充当教练,学习中的问题可以由老师事先设定或者从讨论组中征集,然后指定某组一位学生作为案主,依次进行“定题(确定问题)、躬问(提出问题)、探究(讨论问题)、定见(找出真正的问题)、解析(解决问题)、反思(自己是否存在这样的问题)、心得(本次收获)”这七步,使每个学生都能在U型七步探究中获得受益。
综上所述,我们发现研究型课程是以知识传授为依托,以培养学生的创新能力和探究精神为主要目标,通过创设情境和提出问题,引导学生充分参与、主动探究,学习科学知识,掌握研究方法,培养能力和锻炼思维,养成科学研究的精神和科学态度的一种教学模式。科教融合、学科交叉、国际联结和社区参与是研究型课程应具有的基本特征。
三、基于开源社区的编译原理研究型课程设计
软件的开源运动始于对专有代码限制的回应,是一种分散的软件开发模式,鼓励开放式协作。随着互联网的兴起,开源软件得到快速的发展,许多大型企业和机构纷纷支持开源运动的发展。开源社区是一个由来自世界各地的贡献者组成的松散的、临时的社区,社区成员对满足一个共同的需求有着共同的兴趣,使用一个高效的协作开发环境完成从小型项目到大型项目的开发,并且组织架构和协作方式随着时间的推移逐步形成。例如,github是全球知名的开源项目托管平台,目前有4000万名活跃开发人员,2018年10月到2019年10月总计有4400万个新项目创建,这其中包括170万名在校学习的学生。目前有3.1万名教师使用github向学生讲授实际生产环境中的开发流程,并且这一数字在快速增长中。开源项目的参与者通常是全球各地的维护者、开发人员、研究人员、设计者、写作人员以及其他类型的人员,平均情况下,github上每个项目有来自41个国家和地区的贡献者参与。开源项目之间也存在着广泛的关联,最流行的50个项目平均每个被360万个项目使用[10]。
目前大部分高级程序设计语言的实现从一开始就是开源的,现在能够从开源社区获取到的高级程序设计语言实现包括C/C++,Java,Ruby,Haskell,Python,Go,Rust等,并且同一个高级程序设计语言可能存在多个开源项目的不同实现,例如Ruby有C语言版本的、Java版本的以及基于.net版本的。Python对应有Cpython,Jython,IronPython和PyPy等。基于开源社区进行编译原理研究型课程建设有众多优势,主要包括:
·开源项目大多是计算机科研成果的实现载体,也易于科研成果的植入和再现,例如LLVM是一个研究项目,后来逐渐演化为工业级的编译器;
·开源项目源码和文档易于获取,具有活跃的开放社区,方便学生获取资源和与社区互动;
·开源社区代表着先进技术发展的趋势,学习和探究开源项目易于向工业强度项目过渡;
·开源项目已有建设基础,方便问题的设置以及构建增量型的探究问题,减少了对学时的要求;
·优秀的学生学习成果能够在开源社区共享,提高学生的参与感和成就感,推动开源项目的持续发展,培养学生的开源意识;
·开源社区是一个开放的国际型社区,多方多员参与,能够提升国际视野,培养开源意识。
因此,基于开源社区构建的编译原理研究型课程能够满足科教融合、国际联结和社区参与等基本特征。以开源项目为参与和探究对象,在具体操作上,结合教学内容又分为4个不同的层次设置研究问题,包括分析现有开源项目的工作原理和实现技术路径,发现现有开源系统中存在的问题并提出改进建议,基于现有开源系统的问题进行增量设计与实现,创建有影响力的可持续发展的开源项目。目前玩具型教学实践一直受到工业界的质疑,但是在实际教学过程中实施工业强度的教学实践又存在众多的困难。首先是教学学时非常有限,没有足够的时间从头开始构建工业强度的实际项目;其次,工业强度的项目难度比较高,不适合于所有的学生学习和实践。因此通过不同层次的分解和组织能够覆盖不同学生群体,以学生为中心实现个性化培养。
结合研究型课程的定义以及基于问题学习的方法,依托开源社区进行研究型课程建设的主要思路如图1所示。首先,场景创设与问题设计要从课程教学内容出发,结合身边的热点事件和现象,充分考虑和利用开源资源进行构建。一方面,结合身边的热点事件能够激发学生的学习兴趣,提高解决实际问题的能力;另一方面,以开源社区为依托,能够使得问题的研究与实践更接地气,易于在有限的学时内完成教学组织和实施,也能使学生更早接触开源社区,培养开源精神。其次,在具体教与学的过程中,课程教学和问题研究都是以问题为中心,课程教学重在介绍问题的起源、发展与现状,从知识体系和问题解决思路上进行引导;而问题研究则以某个开源项目为依托,重在学习和閱读相关文档和源码,自我学习、思考与动手实践,与开源社区的交互、讨论与合作等方面。最后,问题的研究成果作为课程评价的一部分计入课程成绩,而这也能反过来有效推动研究成果的产出。更为重要的是,学生对特定问题的研究与实践成果可以反馈到开源社区,例如提交最新发现的bug,为开源项目编制文档,在开源项目的基础上贡献新的代码,甚至创建新的开源项目并持续建设。这些提交的内容一旦被开源社区所接受,将极大地激励学生对相关问题的进一步学习和探讨。
针对编译原理课程的具体教学内容,大量的开源项目贯穿整个编译教学过程,这里既有重量级的项目(例如GCC和LLVM),也有轻量级的(例如lcc和Vlint等)。以Soot为例,Soot是一个Java代码分析框架,现在随着Soot的不断优化改进,Soot已经成为一个广泛应用于Java 程序分析和优化的通用框架。Soot提供4种类型的代码中间表示形式:Baf,Jimple,Shimple和Grimp。基于Soot框架,能够方便地完成全局方法调用图的构建,结合其IFDS数据流分析框架,可以完成到达定值等数据流问题的实现,进一步拓展可以在全局方法调用图和数据流分析的基础上基于该框架构建代码缺陷分析工具。由于空间有限,图2仅仅罗列了很少部分开源项目。如前所述,每个语言几乎都能找到开源实现,并且存在非常多的编译分析框架和工具,其他开源项目也可以成为编译分析和优化的对象,因此实际可用的开源项目远远超出图中所列的部分。
四、编译原理研究型课程实施方案
针对编译原理教学目标和教学内容,按照U型七步探究法给出教学组织与实施方案。在研究型课程教学的过程中,教师和学生各有分工,且互相合作,课上课下有衔接,线上线下相结合,具体方案如图3所示。
首先,在开课前教师围绕教学内容创设情境、提出问题、调研开源项目并完成教案设计。在这里情境创设应选择学生身边发生的,易于代入的事件和人物,并在此基础上提出初步问题。还需要根据教学内容和所提出的问题选择合适的开源项目供学生进行学习、分析和实践。在面向大规模学生群体授课时,开源项目的选择应具有层次性,能够满足不同学生的需求。也可以根据需要构建新的开源项目,由教师进行项目管理,多名学生联合参与完成。
其次,教师开课后在适当的时间抛出情境、问题和资料,留出一定的时间给学生做调研与实践。最重要的是在课堂上进行组织讨论,经过课堂上的讨论和思想的碰撞,要求学生在课后进行深入调研、总结和验证。
最后,教师对这段教学活动进行评价和总结。除了课堂上的展示之外,学生还应该积极向开源社区反馈经与教师确认后有价值的成果,积极参与开源项目建设,以获得开源社区的认可。
与U型七步法中的定题、提问、探究、定见、解析、反思、心得相对应,其中定题和提问由教师在开课前完成,探究和定见是对问题的进一步深入和分析,由教师和学生互相配合、由浅入深、从课上到课下完成,而问题的解析是通过同学课堂讨论和教师引导、结合开源项目实际调研、分析和实践完成。最后教师和学生都要进行反思,学生对问题进行总结、巩固深化,教师对教学效果进行评价和总结,以便于完成课程的持续改进。
在这个过程中,开源项目是老师和学生工作的对象。学生不再是被动的知识接受者,而是主动的思考者、探究者和建构者,他们通过研究开源项目主动发现和重构知识;教师成为教学活动的设计者、组织者、参与者、指导者和帮助者,主要做法是以不同粒度的“问题”为主线来进行组织和设计,使学生在问题调研的过程中更主动、更广泛、更深入地激活自己的原有经验,帮助理解当前的问题情境,通过分析推理得到新结论,从而构建自己的新知识,丰富自己的实践经验。
采用“问题导向式教学”策略进行编译原理课程教学设计,其核心思想是强调把学习设置在复杂的、有意义的问题情境中,通过让学生合作解决真实世界中的现实问题,来探究隐含于问题背后的科学知识。以教学内容为基础,设计明确适当的学习场景来开展“问题导向式教学”,提出切合实际的“現实问题”,这二者是能否成功实施研究型教学的关键。场景应与当前的热点相关,与时代发展相符,场景决定了问题的代入是否成功,现实问题要有一定的挑战性,也要符合学生当前的学习时限和未来工作与研究需要。如前所述,解决实际问题,符合近工业强度,实现国际联结,开源项目是非常好的切入点。下面以运行时系统和程序设计语言为例简单介绍笔者在实践中提出的两个问题。
(1)华为为什么要构建自己的编译器?2019年8月,华为部分开源了方舟编译器的源码,在此之前已经有较多的新闻报道,甚至一度成为大家讨论的热点问题。在此背景下深入探讨方舟编译器出现的背景,有利于学生对编译器以及计算机系统工作过程的深入理解。这一问题的解析可以贯穿整个教学过程,覆盖编译引论、前端实现、中间代码呈现、运行时系统构建、目标代码生成等各个教学环节。在解析方舟编译器部分开源代码的基础上,还可以为其实现新的前端,构建一个轻量级的虚拟机对中间代码进行解释执行,甚至可以在后端没有发布出来之前,将其MAPLE代码翻译到ARM或者x86等平台上执行。为了引导学生完成工作,教师需要讲授相关的原理,提供相关的源码和文档资料,并给出建议的分析重点、分析方法和工具、实现技术路径,需要解决的关键问题等。
(2)什么样的编程语言适合青少年学习?随着大数据技术和人工智能技术的深入发展和普及,目前关于青少年计算思维培养和编程教育的广告随处可见,各个教育机构和研究机构也纷纷推出了自己的培训方案。很多家长在为小孩学习C++还是学习Python而苦恼,除此之外,还有Scratch之类的图形化编程语言。基于此场景构建的初步问题就是什么样的编程语言适合青少年学习。在这个问题的调研中,需要了解目前流行的编程语言有哪些,有何不同,分别适合于哪些应用领域和人群?进一步的延伸讨论问题包括什么是一个好的编程语言,为什么会有这么多编程语言?在实践阶段可以对目前主流程序设计语言进行调研、对比分析,并对现有的语言进行改造和扩展,当然也可以引导学生设计并实现适合于青少年学习的新的编程语言。在这个过程中涉及的开源项目包括Scratch,Python以及各种IDE和OJ系统。
五、教学实践及其效果
笔者基于上述思路进行了实践,首先搭建了一个半开源的编译器实现框架BIT-MiniCC,要求大部分学生在实践中基于该开源项目进行增量开发。此外,在小部分学生中进行了深入实践,针对相应的场景和问题,成立了7个研究小组,分别从程序设计语言比较与分析、新语言设计与实现、已有语言实现分析、数据库软件中用到的编译原理技术等方面进行深入研究。在课程结束的时候,7个研究小组中,有1个小组向开源社区提交了问题,2个研究小组对已有的开源项目进行深入分析,1个小组对已有的开源项目进行了升级改造,3个研究小组建立自己的开源项目。
如图4所示,通过对课程教学过程中完成基础实验部分使用的开源项目BIT-MiniCC进行统计分析,发现接近85%的同学选择使用了该项目作为增量开发的基础,也有少部分同学由于对BIT-MiniCC开发使用的Java语言不熟悉,选择使用了自己更为熟悉的C/C++或者Python进行开发,还有部分同学前期自己开发,但是后期感觉时间压力比较大,所以转为使用开源框架提高开发效率。
图5展示了在课程学习过程中大家对开源项目的使用情况,普遍使用比较多的是词法和语法自动生成工具,以及学习和分析已有编译器LLVM,GCC,Python的内部具体实现方式,还有JSON解析、MIPS和RISC-V模拟器等相关开源项目。目前大部分获取阅读、修改和提交主要集中在BIT-MiniCC上,也有部分同学将自己的完整实现进行了开源。
最后,基于开源社区的显著变化就是,由于大家了解了开源项目实现过程中使用的中间代码的多样性,部分同学还对部分开源项目进行了深入的分析,因此在编译课程实验中就有了更多的选择。其中最大的变化是更多的同学选择了华为方舟编译器的MAPLE IR进行课程实验。
六、结语
国产自主化计算机系统的快速发展离不开开源社区的建设和运营,因此基于开源社区进行研究型课程的建设具有良好的根基,并且符合研究型课程的科教融合、国际联结和社区参与等基本特征。本文虽然对研究型课程的定义和特征作了进一步的推演,但是其内涵和外延还有待进一步深入研究和明确。基于开源社区和U型七步法构建的研究型课程教学方案是在一流课程建设背景下的一次重要尝试,所给出的方案在局部进行了教学实践并取得了显著的效果,对其他研究型课程建设具有较好的参考价值。
参考文献:
[1]陈琦,刘儒德. 当代教育心理学[M]. 北京:北京师范大学出版社,2007.
[2]卞素萍. 美國研究型教学的启示[J]. 江苏高教,2019(11):65-68.
[3]李彩飞. 马克思主义基本原理概论课研究型教学的模式创新与功能价值[J]. 教学研究,2017,40(2):73-77.
[4]叶国荣,陈达强,吴碧艳. 高校本科生教育中研究型教学模式探讨[J]. 中国高教研究,2009(3):90-91.
[5]李春,邹逢兴,周宗潭,等.《计算机硬件技术基础》精品课程研究型教学探索与实践[J]. 高等教育研究学报,2013,36(1):26-29.
[6]李晓东,李玉川,李晓萌. “功能高分子材料”研究型课程初探[C]. Proceedings of 2018.
[7]席酉民. 研究型教学:并非在传统教学中加点研究佐料[J]. 中国高等教育,2016(21):42-44.
[8]里瑟琦智库. 欧美研究型大学本科课程改革的五个关键词[EB/OL]. http://www.idmresearch.com/news/html/?3558.html, 2020.
[9]殷开梁. 研究型教学的新方法——U型7步探究法[J]. 化学教育,2019,40(4):40-42.
[10] Github. The State of the Octoverse[EB/OL]. https://octoverse.github.com/, 2020.
[责任编辑:余大品]