肖祥省
(海南广播电视大学 信息办,海南 海口 570208)
编程语言选择与C/C++程序设计分层次教学探索
肖祥省
(海南广播电视大学 信息办,海南 海口 570208)
编程语言教学一直是在校生程序设计课程薄弱环节,大学生在校期间至少要掌握一门编程语言,C/C++作为本科生必修课程,其教学效果直接影响学习者的编程愿望、后续语言学习速度与质量。就如何根据学生所学专业、数学基础及个人兴趣等选学编程语言和探索C/C++语言程序设计的分层次教学方式,为学生学好编程语言和提高其使用兴趣创造有利条件。
编程语言;派生语言;分层次教学;开发平台
随着计算机硬件飞速发展和性价比提高,促使计算机应用领域越来越广,所需编写的程序种类和数量也越来越多,为了适应开发各种不同形式与领域的应用程序,人们创造了多种编程语言。即每种语言都有其各自适用范围,而课堂教学受教学时间限制不可能对所有编程语言面面俱到。另外,学过的编程语言越多,对从事软件开发的人来说有一定帮助,但不能说其编程水平就越高。以下所述语言均指计算机编程语言。
编程是程序员必备技能,与所用编程语言和应用对象密切相关。在加入程序员这个行列或学习编程语言前,需要对编程语言有一个大致了解,这对刚入行的学生和从事编程语言教学的教师来说都很重要,因为学会并能熟练使用一门编程语言要花费大量时间和精力。要学会一门编程语言不难,难在能熟练使用和运用它去处理实际问题。根据笔者体会、长期观察和统计分析发现,学会首门编程语言所花费时间一般要大于掌握一门语言后再学其他3门高级语言所需要的总时间,即掌握首门语言可以成为学习其他语言的基础。掌握首门语言并能熟练使用一般要经历一年以上时间,学了不用或不能派上用场就会至少造成一年的时间浪费。人一生能有多少年,程序员职业生涯又有多少年?但有些教育单位未考虑这些,先后为学生设置C、VB、JAVA、C++等几门编程课。由于首门语言编程需要一年的时间去磨练,所以说一旦选错对象就有可能永远落后于人,以后对学编程产生无用的感慨,部分人未能学好而永远与编程无缘。另外,很多人学而不精,掌握了多种编程语言仍不能动手编程或不能派上用场,有些人最后被迫放弃对编程语言的学习和提高,这对学习者来说既是损失,也是遗憾。当然,没有建立编程理念,是不可能把许多重复的人工计算或比较过程让程序去处理,也就不可能把人从繁重的体力劳动中解放出来。
编程语言的选择涉及到编程语言学习和应用编程两个方面选择,而不是单指某一方面,在此偏重于前者,旨在为初学者和教学者提供方向和实施方法依据。对编程语言的分类方法有多种,故会产生不同的分类结果:
(一)按编程语言等级
用于计算机编程语言总的来说可以分成机器语言、汇编语言和高级语言三大类。通用编程语言是指后两类,且先有汇编语言,后有高级语言。 高级语言是绝大多数编程者的首选语言。和汇编语言相比,它不但将许多机器指令合成为单条指令,并且去掉了许多无关的细节,如堆栈、寄存器使用等,这样就大大简化了程序中的指令。同时,由于省略了很多细节,编程者也就不需要有太多硬件知识。高级语言是相对于汇编语言而言,它并不是特指某一种具体语言,而是指许多种语言,如C、C++、Java[1]等。
(二)按程序执行方式
高级语言所编制的程序是不能直接被计算机识别和执行的,必须经过转换才能被执行,根据转换方式可将它们分为:解释式和编译式两种。脚本语言是一种解释式语言,是以文本方式存放的语言,如Vbscript、Javascript、Perl、Python等。C、 C++、Delphi等属于编译式语言。
Java和C#很特殊,其程序也需要编译,但没有直接编译成机器码,而是编译成伪码或中间码,然后用解释方式执行字节码,即是以上两者结合体。
结构化查询语言(Structured Query Language—SQL)是为关系数据库管理系统开发的一种查询语言,可以将其归类到脚本语言之列。
(三)按应用程序实现方式
有面向过程和面向对象语言之分。C、Pascal等语言是面向过程的编程语言,C的开发通常会定义大量函数和结构体。面向对象方法(Object-Oriented Method)是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,简称OOP (Object-Oriented Program)方法。Java、C++属面向对象的编程语言,也能编写面向过程的程序。总的说来,面向过程编程以业务的处理流程来思考,重在每个步骤功能的实现;面向对象编程以对象的属性和行为来思考,重在抽象和对象间的协作问题,但每个行为的实现流程又用到了面向过程的处理思路,即面向对象包含了面向过程;反之,则不成立。
按照使用方式分为过程式语言和非过程式语言;按照应用范围分为通用和专用语言;按照组成性质分为顺序语言、并发语言和分布式语言。
TIOBE每月对编程语言进行排行,2014年7月编程语言用户占有率排行榜[3]详见表1。前三甲是C、Java、Objective-C;后两名的占比与第一名差别分别是1.457%、6.851%,即用户数差别较明显;用户数超过4%的共有6种编程语言,后3者依次是C++、(Visual)Basic、C#。Basic由去年的第7名跃升到第5名,其原因可能与Excel编程有关;而PHP由去年的第5名降为第7名。Javascript和Transact-SQL与去年相比均有小幅度上升,但都在第8名Python之后。从排行榜中,我们还可以看到另一有趣现象:前6名有5种是C和其派生语言。今年9月前5名排名不变,但C#取代Basic的位置,即前6名全部是C和其派生语言,这足以说明C的强势。
从前面排行榜可知,能用于计算机编程的语言较多,而能用于软件开发的平台就更多。因为,一种编程语言可能有多个编译环境、即开发平台。例如C或C++语言的编译环境有Microsoft Visual Studio,Borland C++,Embarcadero CodeGear RAD Studio 2010, Borland C++ Builder,Turbo C,Watcom C++ ,GNU DJGPP C++,Lccwin32 C Compiler,Microsoft C,Eclipse,GCC等,同一个平台又有多个版本供用户选择。这些编译环境既与操作系统和编程语言相关,又对编程效率和后期维护成本影响较大。在前面列出的编程环境中,有些是专为C语言编译服务的,而有些可同时支持多种语言的编译,前者如Turbo C,后者如Microsoft Visual Studio、Embarcadero CodeGear RAD Studio 2010。
目前,流行的计算机软件开发平台有:Microsoft Visual Studio、GCC、Eclipse;现有的手机开发平台有:Mac OS(苹果的)、Linux(很基础,安卓就是基于他派生的)、BlackBerry(黑莓)、Windows Mobile(微软)、Android(安卓)。
为了学好编程,除了知道其排行情况外,还有必要对各语言的学习难易度程度和适用领域进行了解,从而根据自己的爱好和特长确定学习目标。
编程语言学习难易度:高级语言比汇编语言简单、易学;结构化语言比面向对象语言简单、易学;脚本或解释式语言比编译式语言简单、易学;面向对象语言中:C++ 和 Visual C++比其他同类语言要复杂些,其余的语言难易度差异不大。
目前流行且用户数最多的前四种语言学习难度从易到难依次是Java、C 、Objective-C 、C++,其他三种都是从C派生出来的,选学C是不错的选择,有句话形容C语言是计算机中的英语。很多人是先学C再学其他语言,但是为了就业可以先学Java,因为C的语法和书写格式与其相似,学会它再学C就容易多了。总之,会一门语言后,再学其他同宗的派生语言就不难了。另外,学SQL与其他高级语言的选择并不冲突,在数据库类的应用系统他们是紧密结合的,但不能作为一门独立的编程语言去学习。
对多数人来说,掌握一门编程语言并能熟练使用已属不易,要同时掌握多种编程语言和开发平台就更难。但软件开发往往是多种语言和多方面知识的结合,编程语言和开发平台又无时无刻不在变化。故学习新的编程语言之前,必须慎重考虑,否则语言掌握了也不一定能派上用场。因为有些编程语言在慢慢地退出舞台,又有新的编程语言渐渐流行。前者如Fortran、Foxpro、Basic、Pascal,后者如Java、C#。即在开发一个大型应用系统或学习一种新的编程语言前必须考虑所选语言发展趋势和历史背景,否则所开发项目有可能提前退役;另外,任何一种语言有其特别适用场所,也有其不能胜任方面,故语言更新在所难免。前提是必须掌握和灵活运用一门编程语言后才能快速自学,否则事倍功半、都是半桶水,任何编程都无法胜任。与其这样漫无目的学多门语言,还不如选择一门实用的语言学好、学精,学以致用才能提高其编程水平和自学其他语言能力。
自计算机诞生以来,其操作系统、编程语言和开发平台经历了无数次变革,对长期从事软件开发、又使用过多种编程语言的人来说,深刻体会了每次操作系统、编程语言或开发平台变迁所带来的痛苦。虽然各种语言都能用于编程,但开发效率、维护成本、延续时间和系统性能差异较大,其开发成果不同语言之间难以共享,主要原因是各种语言的语法、关键字和书写格式等互不兼容。虽然有部分语言可以编译成库文件供共享使用,但基本上是同一类语言或基于用同一公司的开发平台编译。在笔者所用过的多种语言中,个人感觉只有C及其部分派生语言的源代码能够供多个系统和多个开发平台借用(注意:不是共享),而Basic、Foxpro和Power Builder等成果则只能用于当前项目和操作系统,用它们所编的程序和源代码即将成为垃圾,笔者建议尽早取消开设此类语言教学课程。希望跨系统的编程或所开发的产品能运行在多个操作系统,就更应该选择C/C++或Java语言。有些人说C已走进坟墓,但笔者认为C是最有生命力的编程语言:从前面分析的用户占有率和42年的发展历史亦说明了这点,还有各个操作系统均有其编译环境,并且操作系统和驱动程序的开发都离不开C,以前的代码稍加修改即可用在其他平台或其派生语言中,又是C++、Objective-C 、C#和Java的祖先。但其也有明显不足:只能面向过程、无法胜任图形界面和面向对象的程序开发。
经过以上对比,相信大家对编程语言有了一定认识,具体选用则应考虑自身所学专业、特长和兴趣志向等因素:想从事企业应用开发工作,可以选择Java、C#或PHP;想从事电子、通讯领域开发工作,可以选择C++、Objective-C或C;想从事加密、解密、操作系统底层开发,应该选择C或C++。
编程语言在领域运用没有绝对界限;各种语言都有其适用范围,没有一种语言能包打天下;一个软件系统中,可能是多个编程语言的结合;一个软件工程师,往往需要掌握一门以上编程语言和几种开发环境,但没必要把所有语言和流行开发平台都学会,也不能时刻跟着市场走,专学热门语言[4]和开发平台。从效益最大化方面考虑宜选用C及其派生语言,开发平台宜选择Eclipse。语言只是工具,开发平台是环境,能灵活应用才是目的。
可供选择的编程语言多,但C/C++已确定为在校大学生必修课程,为了不影响学生今后发展和对编程产生恐惧,应以引进门和培养编程思路、兴趣为主,有必要根据学生层次、所学专业、兴趣、将来的工作对象、数理逻辑能力差异分层次教学,没必要让所有的人完整地掌握C++语言的各个方面,即使是资深程序员也很难掌握和熟练使用其全部功能。为此把C++分为五个教学层次:一是完整的C++;二是去掉模板和指针的C++;三是完整的C;四是去掉指针的C;五是最简化的C,即去掉指针和自定义数据类型的C。各层次学习难度从前到后逐渐降低,具体选择方法详见表2。
表2:分层次教学内容与专业、基础、兴趣之间关系
表2是对C/C++学习层次和学习者进行了分类,前三个层次仅适用于在校本科生。另外,在学编程之前,应先学计算机文化基础[2]。这样设计教学层次的理由有:1.Java和C#是C++语言去掉指针和模板的语言,并没有影响他们被广泛应用;去掉了指针的C语言其学习难度系数等同于PASCAL,也不会影响其使用C语言编写普通应用程序,虽然C文件操作用到了指针,仅在定义时用到,其后使用无实际的指针运算和类型转换;对于不从事软件加密、解密和与机器硬件打交道的人来说,没必要学指针这个深奥、难懂的内容;省略指针、结构体和枚举等自定义数据类型,C的学习难度即与简单易学的Basic和Foxpro等同,其差异仅是运行模式的不同;需要与硬件打交道或软件加密、解密、自动控制的人是少数,有一定语言基础和兴趣后再补学指针部分或C++也就容易多了。据观察或分析他人的源代码:发现有些用C语言开发的人仅掌握第五层,仍能写出一定规模的应用系统,这进一步验证了分层教学的意义。
进行数据库应用系统开发,需要学C++、C#或Java,有了前三个层次之一的基础,再学他们就轻而易举了。无论首门编程语言选哪种,课时设置均应分为三个部分:理论教学、上机操作和综合实训。首门编程语言教学总课时应不少于80。理论教学与上机操作宜同步进行;综合实训是为了提高其语言应用和编程能力而设计的,可以是具体的项目开发,也可以是开源系统的源代码或实现流程的分析,以及这两者的结合。当然不同的人会有不同见解,故本结果仅作为学生或教学单位选择首门编程语言的参考,至于你的决策,自然会仁者见仁,智者见智。
开发平台教学首选Eclipse ,其次是微软的Visual Studio,再次是GCC。主要原因Eclipse是开源系统,能运行于多个操作系统,而后两者只能用于单一的操作系统。在课堂教学中,应集中精力对语言知识结构进行详细阐述,但不应把太多时间放在对语句语法的讲解上。以应用为主,当遇到实际编程时,需对所要解决的实际问题进行深入剖析,积极引导学生如何把问题转化为解决思路和如何选择正确的算法或实现过程。
限于篇幅和时间,有些地方未能更详细地加以说明,也难免存在不足,望指正。
[1]阳雪峰,陈文臣.Java Web2.0 :基于Spring、Struts、Hibernate轻量级架构开发[M].北京:机械工业出版社 ,2009.
[2]肖祥省,杨秋黎等.计算机文化基础[M].北京:人民邮电出版社,2005.
[3]TIOBE编程语言排行榜[EB/OL].http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
[4]计算机编程语言选择的困惑[EB/OL].http://express.ruanko.com / ruanko-express_1 / webpage / tech-overnight_1.html
(责任编辑:赵 峰)
Research on the Choice of Programming Language andC/C++ Hierarchical Teaching
XIAO Xiang-sheng
(Information Office,Hainan Radio & TV University,Haikou 570208,China)
Teaching of programming language is always the Achilles’ heel in the program design course at university education.Students need to master at least one programming language during the period of undergraduate study.With C/C++’s compulsory and fundamental role in undergraduates’ programming study,the teaching quality of C/C++ course directly affects students' interest in programming,speed and quality of learning more programming languages subsequently.This paper addresses how to select proper programming language according to student’s major,quantitative foundation and individual’s interest and explores the hierarchical teaching of C/C++ program design to create favorable conditions for students mastering programming language and growing interest in practicing it.
programming language; derivation language; hierarchical teaching; development platform
2014-11-18
肖祥省,男,汉族,湖南邵阳人。硕士。海南广播电视大学信息办高级工程师。主要研究方向:网络信息安全、软件设计。2015年第1期
TP312;G426
A
1009-9743(2015)01-0138-05
10.13803/j.cnki.issn1009-9743.2015.01.031