APP下载

基于计算机系统能力培养的程序语言选用分析

2020-12-07罗先录周富肯艾广燚向燕飞

软件工程 2020年11期
关键词:编程语言计算机系统程序设计

罗先录 周富肯 艾广燚 向燕飞

摘  要:计算机类专业的学生掌握编程解决问题的基本技能,是基本的专业素质。算法是程序设计的灵魂,是用系统方法描述解决问题的方法,是从编程通向计算思维的必由之路。计算机类专业的“系统能力”,是计算机类专业相较于其他专业的核心竞争力。本文总结了六年来采用不同编程语言进行教学的比较,讨论了如何贯通专业学生的这些专业基本素质和核心能力,为我们进行教学时编程语言选择提供了基于系统能力的可行方案。

关键词:程序设计;数据结构与算法;计算机系统;编程语言

中图分类号:TP312     文献标识码:A

Abstract: It is a professional quality for learners of computer majors to master basic skills of problem solving with programming. Algorithm, the soul of program design, is a stepwise procedure for solving problems systematically, and is the only access to computational thinking. "System Ability" is the core competitiveness of computer majors compared with other majors. This paper summarizes and compares teaching with different programming languages over the past six years, and then discusses how to enhance both professional qualities and core abilities of computer major students. The result of the paper provides a feasible scheme for programming language selection of teaching for cultivation of students' system capability.

Keywords: program design; data structure; algorithm; computer systems; programming language

1   引言(Introduction)

數据结构与算法课程曾经用伪代码教学,旨在掌握算法思维本身。现在基本采用一门具体的编程语言进行教学,可能是Linus Torvalds说:“Talk is cheap,show me the code.”,也可能是程序执行时间比算法复杂度分析更有感觉。当前计算机系统能力的培养也是一个倒逼的动力,因为体验代码的执行、调试程序的bug,是让学生深入理解计算机系统,加强工程能力培养的必由之路[1-4]。

目前,计算机类专业的程序设计基础和数据结构与算法这两门课程的教学,选择同一门编程语言进行两门课程的连续教学是较好的选择。这样为学生“学好一门编程语言”+“计算思维”这个主线提供了很好的条件[5]。

那么是让学生自主选择课程的这一门编程语言,还是根据专业课程体系的需要进行设定,这是我们进行课程体系设计的时候容易引起争论的话题。我们根据TIOBE编程语言排行榜以及网上招聘和地区人才需求,“所学即所用”“一点打透”等原则,在学生中试行了学生自由选择排名前列的几种编程语言进行这两门课程的教学。现在根据计算机系统能力建设的趋势,回归了简单的C语言路线。这又会让人想起发明C语言的Dennis M. Richie说:“Keep it simple stupid”[6]。我们做了一些思考和总结,供专家和同行们参考。

2  面向对象编程语言的特点(Characteristics of object oriented programming language)

我们以Java语言为例来说明用面向对象编程语言来进行程序设计基础+数据结构与算法课程教学的特点。Java的优势在于实现了面向对象的主要技术(封装、继承与多态、接口等),而放弃了容易引起混乱的技术(例如多继承)。

(1)封装。在数据结构与算法课程教学中,数据抽象是首先要面对的主题。现在的面向对象技术已经很成熟,如果选择将数据成员(数据结构)设为私有属性隐藏起来,通过调用公有成员方法(算法)访问私有数据,Java完成了定义自己的数据类型(数据抽象)和对这些数据操作的封装。数据类型和相关操作(算法)有了密切相关性,定义了一个类的数据成员(数据结构)之后,相应的算法就是同一个类中的各种方法,就可以创建对象,以及派生出更多的细分、实用的类。

(2)泛型。泛型是Java 5以上版本提供的支持这一目标的方式之一。泛型也就是参数化类型,例如Stack是某种元素的栈,而Stack处理的就是String对象。同理,Queue就是处理Date对象[7]。

算法中经常需要进行对象的大小比较,一般采用两种方法实现泛型,从而实现对象间可比较。一是用Object表示泛型,二是用Comparable接口类型表示泛型。用Comparable接口类型表示泛型时(从JDK 1.5开始,在java.lang.Comparable中使用了泛型),需要定义对象为Comparable接口的实例,然后调用Comparable的compareTo方法(需要重写)就可以进行对象间的比较操作[8]。

3.3   计算机系统角度的C语言

从程序员角度的计算机系统看,C语言版本的优势还在于可以深刻理解计算机系统,这个是当前计算机教育的一个趋势[1-3]。2010年,教育部高等学校计算机类专业教学指导会组织高校的资深计算机教育专家成立“计算机类专业系统能力培养研究专家组”,研究组经过对国内外计算机专业的课程体系、用人单位的需求及技术的发展,提出了“计算机类专业系统能力培养专业课程体系”。并分批设立了试点高校。如果是计算机系统能力试点学校,就会了解目前所有的计算机系统基础之类的課程和教材,都是采用了C语言举例[1,2] ,特别是其中最著名的CMU教材《深入理解计算机系统》就是采用了C语言作为例子贯穿整个教学[10]。我们以南京大学袁春风《计算机系统基础》为主教材,同时参考CMU的《深入理解计算机系统》,加入了第四批试点高校行列。我们结合这几年进行程序设计基础+数据结构,以及后续的计算机系统基础课程这三门课连续教学中的一些主要概念的逐级提升或者延伸、最后得以澄清的经验体会来说明这个选择的优点。

构的访问 数组和指针(结构体、链表) 线性表、栈、队列、树和图等抽象数据类型等都有两种结构的实现方式 顺序实现的数组首地址以及循环模式和链式实现的链式访问模式的比较 在汇编代码级理解各种数据访问模式的本质

栈(stack) 在调试运行递归函数时观察调用的函数栈 LIFO问题的解决模式,熟悉栈的底层实现和运用 操作系统的栈是一个特定内存区域,和数据结构的栈一样遵循先进后出的规则 数据结构的栈和操作系统函数调用栈的区别、函数调用栈的耗时和溢出是线索

堆(heap) 动态内存分配函数malloc/free(面向对象编程语言的new)的使用 一种特殊的二叉树数据结构,以数组方式连续存储 操作系统的堆是一个特定的动态内存分配区域(运行时才知道大小需求) 操作系统的堆(栈)强调数据生命周期,而数据结构的堆(栈)强调数据组织

排序算法

中的归并

排序 多项式加法等简单运用 递归实现或者非递归实现 额外空间的分配,需要理解内存的分配和回收的代价 从系统角度理解“以空间换时间”和“以时间换空间”的权衡

堆排序和

快速排序

比较 两个变量比较和交换的方法 对于同样的数据,排序过程中,堆排序算法的交换次数要多于快速排序 快速排序中数据是局部顺序访问,堆排序是跳跃访问,对CPU缓存不友好 从系统角度理解算法快慢的根本原因

文件 文件建立/打开/关闭、读/写、文件指针移动 内部排序和外部排序 Cache、内存、I/O的读写 Cache/内存/硬盘等存储层次结构的效率和配合

这样的例子还可以不断总结很多,运用C语言实现的例子,就很容易阐述清楚这些概念背后的内涵与延伸,让学生深入理解计算机系统的运行机制,逐步形成计算机专业的核心能力。

4   结论(Conclusion)

对于一般专业学生来说,面向解决问题的模式,学会一种编程语言后进一步学习算法和数据结构,用一种语言学习这两门课程是一个很顺利的学习进阶道路,目前的教材和师资的成熟度也支持这样的做法。对于计算机类专业学生来说,用C语言进行这两门课程的学习,对于后续专业核心课程的学习,将会起到很好地理解与掌握计算机系统的作用。特别是目前的计算机教育更强调计算机系统能力的培养的形势下,更是一个必然的选择。

参考文献(References)

[1] 王志英,周兴社,袁春风,等.计算机专业学生系统能力培养和系统课程体系设置研究[J].计算机教育,2013(09):1-6.

[2] 臧斌宇,彭远红.反思、借鉴、融合、提升—探寻计算机系统能力培养之道[J].计算机教育,2015(21):1-2.

[3] 袁春风,王帅.大学计算机专业教育应重视“系统观”培养[J].中国大学教学,2013(12):41-46.

[4] 尚凤军.面向计算机系统能力培养的课程和实践体系研究[C]. Proceedings of the 3rd International Conference on Applied Social Science Research(ICASSR 2015), 2015:4-5.

[5] 汤伟.《数据结构》和《C语言程序设计》新教学模式研究[J].科技资讯,2017,15(24):170-171.

[6] Brian W. kernighan, Dennis M. Ritchie. The C Programming Language(Second Edition)[M]. New Jersey:Pearson Education International,1998:23-189.

[7] Robert Sedgewick, Kevin Wayne. 谢路云,译.算法(第4版)[M].北京:人民邮电出版社,2014:38-107.

[8] 刘小晶,杜选,朱蓉,等.数据结构-Java语言描述[M].北京:清华大学出版社,2015:23-64.

[9] 陈越,何钦铭,徐镜春,等.数据结构(第二版)[M].北京:高等教育出版社,2019:73-276.

[10] Randal E. Bryant, David R. O'Hallarond. 龚奕利,贺莲,译.深入理解计算机系统[M].北京:机械工业出版社,2018:99-276.

猜你喜欢

编程语言计算机系统程序设计
压力-体积转换在CFC编程语言中的实现解析
基于Visual Studio Code的C语言程序设计实践教学探索
Java编程语言的特点与应用
从细节入手,谈PLC程序设计技巧
IBM推出可与人类“辩论”的计算机系统
浅谈不同编程语言对计算机软件开发的影响
高职高专院校C语言程序设计教学改革探索
分布处理计算机系统研究
面向对象Web开发编程语言的的评估方法
MIMD 并行计算机系统结构与定量分析