谈谈编程语言(四)——编程语言和方法,入门的选择

 

        几乎所有的软件学院(包括我的学院),在上导论性质的编程课时,都采用C语言(以下简称C)教学,而且主要是教授C的语法和使用。这意味着:

        一、C是大多数学生学的第一个编程语言;

        二、大多数学生在学校接触编程的时候,一开始主要精力集中在编程语言上。

        所以有两个疑问:

        一、用C教初学者合适吗?

        二、学编程的时候应该一开始就以编程语言为主吗?

        第一个问题,我的答案很明确,那就是不合适。而对于第二个问题,我认为初学者在初期应该以程序设计方法为主,而不是编程语言。

 

 

        刚刚去世的大师Dennis Ritchie当初设计C的时候,是为了实现(准确地说是改写)UNIX,换言之C被设计出来的初衷是为了编写操作系统。结果就是它近乎完美地到达了目的。C简洁高效,并且对机器进行了恰到好处的抽象:把连续的内存块抽象成数组,把单个(或数个)连续的内存单元抽象成变量和结构体,内存地址变成了指针。既保持了与计算机结构的一致性,又比较容易被程序员控制。所以C成为编写高效实用操作系统的不二选择:UnixLinuxWindowsMac OSMinix全部都由C和一些汇编)编写。C被称作高级汇编并非没有道理,我觉得没有汇编知识是不可能把C理解透彻的。

        Ritchie把自由度最大限度的留给了程序员,但并没有为初学者着想,且事实恰恰与之相反。

 

        C对初学者而言最有价值的内容是过程式的编程方法以及函数的概念。

        函数是初学者不能避免的,但是除了这些,C还有一大堆会分散初学者注意力的细节:

  • 变量和函数使用之前一定要声明;声明完了还不能用,还要定义!声明和定义的区别是什么?声明变量和函数的时候一定要写上类型,调用的时候却不用,导致调用形式和声明形式很不一样。
  • 指针与其它类型变量的一大差异在于它的声明形式与使用形式还不一样!输出的时候可以直接传入变量,输入的时候却要加上个&
  • 定义数组的时候一定要确定元素个数;使用的时候不能越过数组边界否则会报错;一维数组和指针在传入函数的时候是一样的;但大多数时候有绝对明显的区别! 
  • 运气差的话可能还会遇上整数溢出;
  • 还有那复杂起来绝对能令人抓狂的函数原型……

        这些points现在看来全都是理所当然,但谁敢说自己学C的时候没有被这些问题困扰过?

        当然这些并非C的缺陷,许多特性是Ritchie为了保持C的简洁以及对机器的控制力而有意为之,但却成了初学者纠缠的陷阱和前进的障碍。并不是说新生吃不得一点苦头,而是不应纠缠于语言细节,失去对编程思想的把握。这不仅分散了注意力,更重要的是扼杀了想象力!C终究是面向机器而不是面向人的编程语言。然而能够让编程者可以不用关心这些细节而把精力集中在解决问题上的编程语言是存在的,这样的语言才更适合初学者。

        综上所述,我认为用C教初学者绝不合适。甚至,C++也不合适,因为上述的不利因素同样存在。至于Java,Joel Spolsky早就发表了他的意见:Java语言学校是有危险性的。

 

 

        现在谈谈第二个问题:学习编程一开始的重心应该是编程方法而不是编程语言。“编程方法”这个词与“编程思想”、“编程风格”、“编程范式”以及“编程技术”都有相通甚至相同之处,因此下面我将混用这几个术语。

        所谓编程方法,或编程范式,或编程思想,是指某一类典型的编程风格,为程序员看待问题和程序提供一个视角,也决定了程序员对程序执行的看法。编程方法也可以理解为通过编程解决实际问题的方法。通常一个编程语言会支持一或多种编程范式。不同的编程范式能有效处理不同的问题,而有一些编程范式能处理的问题域比较大,因此广为流行(如结构化编程)。

        脱离编程语言谈编程方法是不切实际的,而忽略编程方法则无法用手上的语言设计出能有效解决问题的程序。编程方法虽然受制于编程语言的表示,却能够跨越编程语言的边界,因此编程方法的抽象层次要高于编程语言。初学者理应站在比较高的层次上开始学习生涯,原因是这样能够尽早接触程序设计的核心:用计算机解决实际问题。既然是核心知识,为什么不让学生更早地掌握呢?反观现在的课程大多数只是让学生在语言细节中挣扎,却忽视了更重要的知识。

        我的想法是学校应该为一年级新生设计这样一门编程导论课程:基于某个编程语言来教授编程方法。这种语言应该非常简单,只用2到3个课时就能让零基础的学生学会用;但这种语言同时要足够强大到能够展现各种编程方法,这门课的大部分时间让学生学习程序设计法方法。

        说了这么多,以编程思想为先的教学不仅有好处,更重要的是:这是可行的。前面说到存在让编程者集中精力解决问题的语言,Scheme就属于这样的语言,足够简单也足够强大。Scheme有多简单呢?美国有个ProgramByDesign计划,在数目超过600所的高中教授编程,对,高中。网上有许多Scheme的简明教程(宋国伟先生的Scheme语言概要()()就很不错,米国人也有很好的教程),这些教程的内容放在课堂上,也不会超过2到3个课时,但足够学生用这些简单的语言元素去学习和掌握编程方法。

 

——TT

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值