也谈C++
Posted on 11 Feb 2012, tagged c++
programming
近段时间有不少谈及C++的文章,其中酷壳的陈皓写了一篇《Why C++?王者归来》,介绍了Herb的一个演讲,说到语言的下一个时期又将是C++的时期。但是对于这些,我却是不甚同意。关于语言的战争从来没有停止过,这里只是我自己的想法,欢迎大家一起讨论。
一、运行性能问题
1.性能真的那么重要吗?
文中所提到的一个使用C++的主要理由,就是语言在机器上运行的性能问题。其实若论性能,非汇编莫属。但是由于汇编语言的晦涩,和硬件的关联紧密所造成的不可移植性,使得现在使用汇编的场合是非常之少,除非是极其追求性能的地方。由此我们不由想到,难道语言的运行效率真的那么重要吗?
现在的硬件性能每几个月就翻一番,现在一部普通的智能手机的运算速度,已经可以赶上十几年前的几台电脑加一起。有编写和调试C++代码的时间,也许更快的机器都已经出来了。所以性能问题,不能一概而论,需要性能的时候着重考虑性能问题,而当性能不是那么重要的时候,也许开发的效率才是考虑的主要问题。
说到效率,文中说到了手机平台,那么我这里也说一下手机平台吧。一直发展迅猛,把曾经的霸主塞班系统拉下马,现在和ios平分天下的手机系统是什么?Android系统。而众所周知,Android系统的架构就是中间有一层Java虚拟机,而Android系统上大部分应用,也都是用Java开发的。其实一个平台能迅猛发展非常重要的一点是什么?就是这个平台上的应用。ios就是凭借着其优秀的游戏应用起家。而Android作为后来者,能快速开发应用的能力是必不可少的,因此使用Java这种能快速开发的语言,可以说是一个明智之举。虽然Android也有C和C++的接口,但是我们日常使用的大部分应用都是Java开发的,有谁觉得性能很差吗?
其实很多程序员都信奉这样一条准则:“宁花机器十分钟,不花程序员一分钟。”程序员的时间是宝贵的,逻辑、架构、规划都是从程序员的脑子中出来的,而一些无聊的工作,完全可以交给机器去实现。把程序员从繁重的工作中解脱出来,让机器做机器应该做的事情,才是正确的做法。
但是,无可避免的,在一些地方确实需要考虑到效率问题,然而,C++的效率真的高吗?
2.C++的运行性能
说到运行性能,现在首先想到的肯定是C语言。虽然很多人认为C语言晦涩,但是我一直觉得C语言是一个很优秀的语言。C语言和硬件的结合可以说是在高级语言里最紧密的了。开发很多嵌入式的设备,人们第一个想到的就是C语言,可没谁会说去用C++吧。
有人说正因为C语言太晦涩,为了解决这个问题,再加上面向对象的思想,所以有了C++。然而相对于庞杂的C++来说,C语言反而是简单的。并且,完全的面向对象思想,也不一定适用于所有场合。现在有很多对C++不是很精通的程序员,对STL和泛型的滥用,不仅造成代码的质量低下,而且阅读起来也有一定的困难。一个用C++写的程序,绝对不会有一个用纯C写的程序一样的效率,也不一定有用C语言好写,这个问题在Linus的几封邮件里,有着直言不讳的叙述。
二、C++的抽象能力
上面说到了,C++的运行效率肯定是不如C语言的。原作者认为C++会流行的主要原因,就是C++比C语言有着更多的抽象能力。那么我们不如就比一下抽象的能力,包括C语言这种比较低级的语言,和Python、Perl这种比较高级的脚本语言。
1.和C语言比较
C++能做到的C语言真的做不到吗?答案是否定的。很多开源软件都是用纯C写出来的,若是有兴趣,不妨去看看他们是怎么写的,其中的模块化,丝毫不逊于C++写出来的东西,而且比C++要透明、简洁很多。
2.和Python、Perl等脚本语言的比较
类似于Python的高级语言类库丰富,支持动态类型、垃圾回收等高级特性,因而省去了程序员很多的麻烦。对于C++来说,这些东西都是需要自己去做的。另外,对于可以解释执行的语言,我们可以快速写一些东西来检测自己的一些想法。也许大公司都喜欢先写规划啊,什么都计划好,然后再写代码,可是对于很多黑客和高手来说,一边想一边写一边检测,才是最喜欢的编码方式。
三、结论
综合上面的考虑,C++和C语言比起来,只是多了很多面向对象的东西,相对于添加的这点功能而言,我觉得是得不偿失的,这使语言变得更混乱。可以说C++的初衷是好的,希望功能强大,什么都可以做。然而一个语言,如果能够专心做好一件事情,有时候是更值得使用的。
上面所说的,也不能完全否定C++的优点。例如在桌面环境这种天生就比较适合面向对象的思维的应用来所。然而在追求效率的地方,C语言则更加合适,在效率不是那么重要的地方,使用其它高级语言来节省程序员的时间才是更好的做法。