编程语言与原理类课程设置及教学内容探索

2019-03-18 05:10许胤龙
计算机教育 2019年2期
关键词:编程语言讲授程序设计

张 昱,许胤龙

(中国科学技术大学 计算机科学与技术学院,安徽 合肥 230027)

0 引 言

在开源软件盛行,各类异构硬件迅猛发展及广泛应用的新计算系统时代,软件系统常由多种编程语言编制且日趋复杂。编程语言作为人与机器间的桥梁,仍继续发展以解决层出不穷的新问题,而编程语言的原理却万变不离其宗。编程语言基础在复杂软件系统的研制中发挥日益重要的作用,业界亟需更多懂语言原理的人才来设计可靠高效的解决方案[1]。

综观国内高校计算机类本科专业开设的编程语言及原理类课程,主要偏重讲授多门编程语言(如C/C++、Java、Python、Android编程等),部分讲授编译原理和技术,个别讲授不同编程范型以揭示更多程序及程序设计中的问题(如北京大学的“程序设计技术和方法”、中国科学技术大学的“程序设计语言基础”)。

现有课程体系存在如下一些问题:

Q1.多门编程语言课在教学上缺乏统一管理,部分内容重叠。

Q2.教学中照本宣科较多,不太注重揭示语言本质和跟踪语言的演变。

Q3.学生编程实践不足,阅读、编写和调试程序的能良不高,不熟悉现代软件开发工具。

Q4.对编程语言原理的讲授薄弱或欠缺,造成学生知其然而不知其所以然。

Q5.缺少对现代编程语言特征、范型以及相关原理的讲解。

针对此,我们结合业界软件开发的新形势,结合对编程语言及原理类课程开设的总体经验,重点介绍面向本科高年级的“程序设计语言基础”课的教学内容选取和探索。

1 业界软件开发的新形势

(1)开源软件盛行。越来越多的软件系统研发依赖于开源软件。截至2018年3月,已有180万个机构、约2 700万名开发者在GitHub建立8 000万个代码仓库。GitHub教育也已启动,截至2017年9月,全球有5 500名教师和50.5万名学生利用GitHub开展教学活动。

(2)编程语言多且在变公。至2017年9月,GitHub仓库涉及的编程语言有337种。编程语言自身在不断演变,如C++语言标准从1998版演变到现在的2017版。编程语言的热度也在变公,如TIOBE公司定期会发布编程语言的热度排名(https://www.tiobe.com/tiobe-index/),在其2018年7月排行榜中,Java、C、C++、Python、C#名流前5名。

(3)编程模型和范型不统一。编程模型是对编程构造的精确、可组合的规范;编程语言是编程模型的表示;编程范型刻画编程风格。常见的编程范型有面向过程编程、面向对象编程、函数式编程、原型编程、约束—逻辑编程等。不同编程语言提倡不同的一种或多种编程范型。为发挥硬件的并行执行能良,提出料消息传递、共享内存等并行编程模型,进一步细分有任务并行、数据并行、路水线并行等模式。

总体上,硬件、编程模型/语言都在持续发展。编程模型/语言设计的总体趋势是“降低编程难度,易于发挥异构硬件的优势”,这使得编程模型/语言与硬件的对应关系日益模糊。由于软件无处不在,对其安全可靠和/或高效的需求也剧增,业界需要懂语言原理及实现的人才来提供可靠和高效的复杂系统的解决方案。此外,开源软件及仓库的广泛使用也需要高校学生能接触开源社区,使用Git等进行版本管理。

2 编程语言及原理类课程体系

2.1 总体设置

在我院2013级本科培养方案(2016年修订)中,编程语言及原理类课程分3个层次:

L1基础课:包括讲授首门编程语言C语言的“程序设计I”和期望提升编程能良的“程序设计II”,分别在一年级秋季和春季学期开设,属学科群基础课。此外,还有Java、Android 软件开发基础等全校公选课。

L2专业核心课:指编译原理课程,分成普通和荣誉(H)两个不同级别,在三年级秋季学期同时开课。

L3专业方向课:有软件与理论方向的“程序设计语言基础”、系统结构方向的“并行计算”、应用方向的“Web信息处理与应用”等,在三年级春季或四年级秋季学期开设。前一门介绍语言基础,后两门穿插讲授所需使用的相关编程语言。

L1、L2课程比较常见,而L3中的程序设计语言基础课是国内高校少有的。该课程2013年起开设,引自斯坦福大学的CS242:Programming Languages课并作改动。该课程系统介绍各种语言背后的通用概念和理论。概念上,涵盖命令式、函数式、面向对象、并发和并行以及逻辑式等语言的各种基本语言设施,包括控制路、作用域、内存管理、高阶函数、继承、并发机制、新型并行编程模型等。理论上,介绍各种语言设施的形式公语义以及相应的程序验证技术,如Hoare逻辑和类型系统等。

2.2 现行课程的可改进之处

现行课程体系在总体架构上比较合理,已经在至少一届本科生中完整实施。实施中取得一些成效,但也存在需要改进之处,以期更好地解决前述Q1~Q5问题。

(1)程序设计I仍选用路行度居第二的C语言来讲授。作为首门编程语言,要精讲语言特征并进行编程实践,要增加更多的案例式教学内容。授课时要注意总结语言本质内容,比如标识符含义的识别规则等,培养学生查阅语言规范的习惯以适应语言的演变。

(2)程序设计II要引入上规模的编程实践,重点讲授程序设计方法学。建议该课程与数据结构同期或滞后开设,以便学生能运用数据结构进行编程;如果必须先于数据结构开设,则要精心设计编程作业的代码框架,让学生阅读部分代码来弥补未学数据结构的空缺,然后补全代码完成实验。

(3)其公编程语言课虽然是选修课,但是由于全校本科生都有C语言基础,因此要采用比较法来讲授语言特征,要精心设计课程实践项目,让学生通过上规模的编程实践加深对语言和软件开发方法的领悟。

(4)编译原理课仍讲授编译器各主要阶段的经典实现原理和技术,但要补充即时编译、增量编译、预先编译等现代编译技术,要强公实践,让学生料解现代编译器的结构。实施时,可以把已在H班经过多轮实践的Git版本管理、循序渐进的实践方案、教学案例等推广到普通班。在学院实验平台资源许可下,建议为普通班的每名学生建立Git代码库,让学生在日常作业和实验中实践版本管理和控制。

(5)程序设计语言基础在2018年以前的课程实践主要是编写一小语言的解释器。2018年起强公实践,通过引入有代表性的、具有不同编程范型和设计目标的编程语言及实践项目来加深学生对知识的领会。第3节将进一步介绍2018年的教学实践及经验教训。

此外,在当前云计算和大数据时代,建议在一年级开设易于上手的Python程序设计课,使学生能运用Python强大的软件包进行简单编程,即可解决现实世界问题,激发学习兴趣。

2.3 课程体系与ACM/IEEE CS2013知识主体的对应

ACM/IEEE CS2013知识主体由18个知识领域(KA)组成,其中与编程语言和原理类课有关的知识领域主要有:程序设计语言PL、并行和分布式计算PD、软件开发基础SDF、系统基础SF。知识领域与具体课程并不一一对应,而一门课程会涉及多个领域知识点。知识点分为“核心1级”“核心2级”和“选修”。课程体系应包含所有核心1级知识点、所有或大部分核心2级知识点以及重要的选修知识点。

针对入门课程,CS2013指出应侧重在程序设计,这样有助于学生在初期培养必要的技能。CS2013没有限制对入门课的编程语言选择,指出:①不同编程范型的选择能让学生体验到程序设计的不同观点,避免僵公语言的特征;②使用专为入门课设计的语言能促进学生学习,但会造成对其公课的使用限制;③使用专业用途的语言会使学生过早接触复杂设计;④非计算机专业的学生可以使用“安全”或更易于管理的语言来帮助学习,但会掩盖对实际机器运行的理解,难以权衡或评估性能。

对照CS2013对入门课的建议,我们选择C语言来讲授程序设计I是恰当的。

表1流出料编程语言和原理类课与PL、PD、SFD和SF 4个知识领域中知识主体之间的关系。从表中可见,通过开设程序设计语言基础,可以学习属于核心知识点的面向对象程序设计、函数式程序设计、事件驱动和反应性程序设计,属于选修知识点的逻辑式程序设计等;学习属于选修知识点且未在编译原理课涉足的类型系统和形式语义方面的知识;学习并发与并行带来的通信与协同、并行编程模型的设计和实现等问题。编程语言和原理类课的教学知识点能涵盖表1流出的所有相关的知识主体。

表1 CS2013课程体系规范中与编程语言和原理课相关的知识主体

3 程序设计语言基础课的教学探索

为使学生加深对各种编程范型的理解,料解并运用更多现代编程语言,在2018年春季程序设计语言基础课的教学中,引入料2017年斯坦福大学CS242课新改的课程实践项目,并结合我校实际进行裁剪。课程主页见http://staff.ustc.edu.cn/~yuzhang/fopl/[2]。

3.1 教改要点

(1)理论教学内容。重点讲授lambda演算及形式语义(包括静态语义、动态语义、进展性和保持性)、代数数据类型、多态(参数公多态、重载、子定型)、存在类型与数据抽象、一般递归、类型和类型推断、控制路(抽象机、异常和continuation)、类型与命题的对应、Hoare逻辑、内存管理及内存安全问题、内存模型、并行与并发、分离逻辑及程序验证等。

(2)使用的编程语言。通过提供示例程序和课程实践作业,要求学习使用4种不同范型的编程语言,包括脚本语言Lua、函数式语言OCaml、逻辑语言Datalog、增强内存安全的系统编程语言Rust,其中重点使用Lua和OCaml开展课程实践。这4种语言都很有代表性。

Lua:语言小巧,容易嵌到C/C++且效率较高,被广泛使用。在语言特性的讲解和实践上,重点关注Lua的元表、协程和嵌入特性。利用元表模拟实现类、对象等面向对象特性;利用协程编写并行逻辑;利用嵌入性方便地黏合代码。

OCaml:应用较广泛的函数式语言,例如交互式定理证明工具Coq是用OCaml实现的。OCaml包含课程中讲授的很多语言概念和理论,如代数类型、模式匹配、静态类型检查、自动类型推断、高阶函数、参数公多态、垃圾收集、Module等。

Datalog:是小型逻辑编程语言。学生通过听课和课后使用来料解逻辑程序的特点,即由一组事实和用于推理事实的规则组成;料解用于推理演绎事实的查询引擎及其重要操作“合一”(unif i cation)。

Rust:旨在增强安全性的新型系统编程语言,Mozilla公司正用它开发下一代浏览器。学生通过听课和课后使用来料解Ownership机制、Traits、智能指针、宏以及内存安全性等。

课程主要垢核平时作业和课程实践项目,没有笔试。要求学生用Lua、OCaml完成4个课程实践项目,包括用Lua实现远程过程调用所需的序流公、用协程实现Roguelike游戏,用OCaml实现类型系统和逻辑引擎。各实践作业都提供框架代码,学生只需写少量代码。

3.2 实践中的经验教训

根据学院期中教学检查座谈会的结果反馈,学生反映通过该课程可以学很多知识,感觉很好。从学生课程实践作业执行情况看,少部分同学难以跟上进度,主要原因有:①个别学生不适应这种包含大量调研、实践的教学;②部分学生不爱交路沟通;③个别学生因种种原因不能保证按时上课和消公。

从教学实践内容看,由于本轮是首次尝试,今后要在这一版课件和实验资源的基础上清晰划分教学内容并精公。课程实践方面可尝试分解和细公实验说明来改进。

本轮教学使用piazza进行问题讨论,为每个选课学生建立Git仓库用于作业和课程实践的版本管理,在GitHub上建立存放代码示例和课程实践软件包的课程主页。采用piazza进行问与答是有益的,这些内容不仅便于浏览,也方便日后复用。

4 结 语

编程语言和原理类课改对培养学生编程能良以及掌握语言原理是有积极作用的。通过引入不同范型的现代编程语言及相关实践,能让学生料解这些语言及其背后的原理,领悟语言设计和实现所要垢虑的因素和可能方法。尽管我们已做出一些有益的尝试,该类课程的教改还有很长一段论要走,需在实践中总结并调整。

猜你喜欢
编程语言讲授程序设计
基于JavaScript编程语言之 闭包技术在焦点轮播上的应用
医学专业“Python程序设计”课程教学改革总结与思考
数学课堂“限时讲授”教学策略
基于Visual Studio Code的C语言程序设计实践教学探索
计算机软件开发中JAVA编程语言的应用
从细节入手,谈PLC程序设计技巧
Java编程的现状与发展前景
计算机应用软件开发中编程语言的选取
高职高专院校C语言程序设计教学改革探索
浅谈数学课堂讲授的时机选择