Linux之父话糙理不糙

原创 2007年09月08日 14:33:00
     Linus Torvalds曾经在十多年前尝试用C++来开发Linux内核,由于种种原因,很快失败了。自那时起他就不时表达对C++的不满。刘江blog上的记录的这个事件只是最近的一次而已。尽管言辞激烈,但其实话糙理不糙。

     时至今日,在一般的场合下,C和C++语言的主要用途就是系统级软件的开发。具体地说,C/C++写平台、工具和基础库,支持高层的语言来完成应用逻辑。 在9月份《程序员》杂志上刊登的一篇《微软架构师谈编程语言发展》的文章里,Brian Beckman直截了当地说,C++语言主要是用来开发别的语言的。这话片面一点,如果改成 “C++语言主要是用来支持别的语言的”,那就大体没错了。

     做系统软件开发的时候,重要的是理解系统的运作方式,那些漂亮的抽象手法和高级特性是次要的。

     有一个有趣的现象,不少做系统软件的老手,在用过一段C++之后,又回到C。因为在这个层次上,C++对于C的优势就不突出了。那些高级的抽象结构往往是 不必要的,反而是由于抽象层次的提高,使得开发者要弄清楚“下面实际发生的事情”变得不太容易了。所以很多老手实际上觉得用C语言控制力更强一些,更得心 应手一些。真正的C语言高手,对于语言和编译器都很熟悉了,基本上在写C时候就已经知道编译器优化以后产生汇编代码是个什么样子,甚至可以改变C代码来引 导编译器产生最优化的机器码。而C++的机制很丰富,很多机制是为了满足高层应用和框架的需求而准备的,在这个层次上发挥不出来,反而把清晰性给牺牲掉 了。很多时候,一个简单的语句,到底背后会发生什么,即使是老手也说不清。比如:

     std::string s(“Linux Torvalds");
     std::string scopy = s;

     上面这段代码不过是创建两个内容相同的字符串副本,但是没有任何一个人能够在不了解更多信息的情况下清楚地描述背后所发生的事情,因为不同的STL对于 string的实现方式不同,因此在copy assignment时表现也不同,有的可能是简单地复制字符串对象,有的可能具有ref-counting机制,需要创建对象、设定对象值、增加引用计 数,有的没有考虑线程安全性,有的考虑了线程安全性,还得加锁解锁,对不起,加解锁也还有很多做法。创建新的string对象时,有时还需要调用内存分配 器,而这个东西的实现又五花八门,有的直接new char[],有的从内建的memory pool申请,memeory pool是不是线程安全的?对不起,这次
可能又要涉及加解锁问题。memeory pool会不会已经满了?要不要次第调用new/malloc申请新的内存块?总之,后面的事情够多够复杂,没有相当功力,对平台了解不够深入,很难说出个子午卯酉来。

      一个字符串复制尚且如此,别的高级特性就更不用说了。所以很多人宁可麻烦一点,也不愿意使用C++,这还是可以理解的。

      就我个人来说,我还是愿意用C++的,特别是在C里写一遍又一遍realloc的时候,就想起 string::operator+=()的好处来了。大概是STL给我的印象太深了,写算法程序的时候,不用STL就觉得不爽,一个transform 就可以搞定的事情,非要用for循环,这会让我感觉浑身不自在。所以一般情况下,拿到一个什么问题,我还是会用C++去解决的。对我来说, Torvalds的话其实是很中肯的,即使是用C++,也要尽可能搞清楚其背后发生的事情,这样在写low level程序的时候才会有把握。如果是设计应用级别的程序,就尽可能不用C/C++,把底层的事情都忘掉,专心专意做好应用层的设计才是正道。
 
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Functional Programming应译为“泛函程序设计”

一直以来,functional programming在程序设计领域里被翻译为“函数式程序设计”。这种译法非常不精确,所以即使是历来对翻译不太讲究的软件技术界,也不大情愿接受。 由于在C等语言中,没有...
  • myan
  • myan
  • 2004-06-11 12:12
  • 8103

Web才是老大!

《2007年Web开发技术预言》是一篇难得的好新闻。仔细读读这篇文章,并且搞清楚人家在说什么,我看比忙着去追问吴莹莹同学加盟的公司够不够大有意义得多。这篇文章里赞美聚合技术的时候提到了语义Web,点了...
  • myan
  • myan
  • 2006-12-12 00:50
  • 30252

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Ruby中的Continuation

下午gigix给我大致讲了一点continuation的东西,说实话我还没有很好的理解。也许透彻理解需要熟悉Lisp。不过我记得Ruby里有continuation。Ruby我略知一二,所以查了查相关...
  • myan
  • myan
  • 2005-08-09 22:59
  • 3966

用C设计,用C++编码

昨天晚上看到刘江的blog又补充了好几大段,今天早上又看到云风的人肉trackback,果然还是这种话题引人关注。      云风先是提了一下所谓C++带来的思想包袱(文言文曰“心智包袱”)问题,然...
  • myan
  • myan
  • 2007-09-10 11:32
  • 44338

理解矩阵(三)

理解矩阵(一)        理解矩阵(二)        这两篇文章发表于去年的4月。在第二部分结束的时候,我说:   ...
  • myan
  • myan
  • 2007-11-03 21:42
  • 101760

《精通正则表达式》书评

IT产业新技术日新月异,令人目不暇给,然而在这其中,真正称得上伟大东西的却寥寥无几。1998年,被誉为“软件世界的爱迪生”,发明了BSD、 TCP/IP、csh、vi和NFS的SUN首席科学家Bill...
  • myan
  • myan
  • 2007-07-23 18:37
  • 14292

Ruby 1.9不会杀死Python

松本行宏如约于圣诞节发布了Ruby 1.9。根据Ruby的惯例,小数点后面第一位如果是单数,那么就表明这是一个实验版本,不推荐用于产品环境。所谓“产品环境”,对于目前的Ruby来说,基本上就是Ruby...
  • myan
  • myan
  • 2008-01-07 11:46
  • 69725
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)