谈谈编程语言(二)——诱惑的观点

  

        (二)出来了……

        有一个很常见并且很多人都相信的观点,那就是编程语言都是相通的。引申义就是如果掌握其中一门语言,就能很快学会其他的语言。比如学会了C,那么就知道C++Java的函数在使用之前都要先声明啊,代码都包在大括号里头啊,你看我很快就能学会。我认为这个观点流行的原因是它具有诱惑力,许多程序员看着那么多种语言眼花缭乱甚至心里有点恐慌,当看到这句话的时候就会松一大口气:你看其实只要学其中一种就可以搞定所有的语言了。这在潜意识里就大大降低了技术的学习成本。毕竟技术发展日新月异,如果有一个观点让大家觉得减少了学习成本,那么它的流行也就可以理解了。

        但是且慢,这是对的吗?熟悉一门语言就可以轻易通晓其他语言了吗?

        很遗憾,我本人不认为这是正确的,原因有二。

 

        首先有个很浅显的道理,如果世界上编程语言都差不多,那么为什么还会诞生出那么多种各色各样的编程语言?事实是,不同的编程语言之 间差异很大,大到超出一般人想象。

        编程语言都融入了语言设计者的思想,其中一个关键的区别在于语言的抽象级别。C以过程为单位,Java一切皆对象,Lisp程序则是由一个个函数搭建起来。相比之下,C更靠近机器,Lisp抽象级别更高。举个例子,写一个函数foo,函数foo以一个列表lst和另一个函数op为参数,foo所作的事就是对列表lst中的每一个元素调用op,生成一个新的列表并返回。

        用C++如何来完成这个任务?(注:这段代码在VS2010中能编译运行,GCC却不可以,有知道原因的高手请不吝赐教)

template<typename T>

list<T> foo(list<T> lst, T(*op)(T)) {

  list<T> result;

  for (list<T>::iterator iter = lst.begin(); 

      iter != lst.end(); 

      ++iter)

    result.push_back(op(*iter));

  return result;

}


 


        再来看看Scheme如何解决问题。

 

(define (foo lst op)

  (if (null? lst)

      '()

      (cons (op (car lst)) (foo (cdr lst) op))))

        对比之下差别非常明显。C++其实和C一样,还是很靠近机器。完成这么一个小任务用到了模板和指针。使用模板是为了适应各种数据类型,因为不同的数据类型占用不同的空间,编译器得知道,用函数指针是为了告诉编译器函数的地址。所以C升级到了C++却还是摆脱不了这些低级的概念。

 

        至于Scheme……完成这种任务简单的不像话。如果想看懂这段代码,花个十来分钟把Scheme7个基本元素弄明白就行了。在Scheme里编程,一切都是表(list),再加上本身支持高阶函数和动态类型,因此轻而易举的完成了这个任务,几乎完全不涉及计算机那些底层的概念。相比之下抽象级别就比C++高了。

        正是这个区别的存在,使不同语言之间实际的差异比看上去要大。

 

        第二个原因跟人有关。人都是有惰性的,程序员当然也不例外。一个程序员如果长期用一种语言编程,思维必定受其影响。那么思考的抽象级别也就被限制了。就比如刚才两段代码,熟悉C++的程序员很可能认为Scheme的思维方式难以理解,Scheme程序员则觉得用C++思维受限。我自己也有这种困惑。大一之后几乎一年没动Scheme,后来想跟TomScheme写个定理证明机,结果是我们两个坐了一晚上都在干瞪眼(o(╯□╰)o)不过我想Scheme程序员理解C++代码会更容易,因为计算机总是比人笨的~

        程序员看待自己熟悉的语言可能有种温床的气息,熟悉意味着安全感。转到不熟悉的语言不仅要扭转固有的成见去接受新思想,甚至是有风险的。这些因素更“激发”了程序员的惰性。

 

        综上所述,无论是基于语言之间本身的差异,还是基于人类自身的惰性,掌握其中一门语言,就能很快学会其他的语言这句话我都不认为是正确的。

        当然面对这如此多的语言也不用太悲观。刚才说过,Scheme程序员更容易理解C++代码,因为我认为SchemeC++更高级。还有一个原因就是更高级的语言使程序员更专注于编程的本质(essence),如果抓住了本质,那么面对低级语言的时候去应付那些机器的历史遗留问题也只是个技巧性的话题。另外,成功人士比一般人更能克服惰性,优秀的程序员则是不断地学习。既然这个世界有那么丰富的思想,索性勤快一点,所谓他山之石,可以攻玉。

 

——TT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值