Linux之父话糙理不糙

孟岩的原文
===================================================

Linux之父话糙理不糙


 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++,把底层的事情都忘掉,专心专意做好应用层的设计才是正道。

网友的评论
===================================================

注解
最后两条是俺发的,发完后一浏览,嗨,同样的意思前边的人都说过了:)不过既然发了就留下吧,哈哈,以示对相同意见的支持 :)

 

#      duyanning 发表于2007-09-10 08:57:53  IP: 221.11.38.*
也太搞笑了吧,总拿全功能的std::string跟几乎啥也不能干的char*作比较,谁规定你只要用C++处理字符串就得用std::string了?
拜托,如果你的需求很单纯,如果你有很在意效率,你完全可以不用全能的std::string,但这并能作为你创造适合你需要的your::string从而提升抽象层次的借口。

Torvalds理糙人更糙,我彻底失望了。

#      duyanning 发表于2007-09-10 10:01:11  IP: 221.11.38.*
应当搞清楚,作为操作系统内核级的开发者,在不清楚自己所用的std::string实现都在背后做了些什么的情况下就敢用,这是他自己素质的问题,而不是他所用std::string实现的问题。

如果不清楚std::string是怎样实现的,而std::string的行为对于你的程序又很关键的话,就请去调查,去弄清楚,然后选择要不要用,而不是抱怨std::string背着你如何如何。

假如他选择的不是C++的std::string而是某个用C写的字符串函数包,那他是不是也要因为不清楚这个字符串函数包的具体实现而要对“一切抽象及复用”进行否定呢?

Torvalds仅仅是在敌视C++吗?
他已经把他自己放在一切计算最根本的“抽象”的对立面上了。

Torvalds长期以来对于C++和C++用户的侮辱让他看起来更像是个小丑。
#     wzhou1974 发表于2007-09-10 13:44:16  IP: 13.187.241.*
c/c++个人所爱,不必太在意。Torvalds固然起头了Linux OS并维护者它,但Linux被如此的广泛应用,已经成为一个公共产品,似乎不在应该由Torvalds的好恶来决定或影响Linux OS的发展。我们中国人应该特有体会,毛泽东是中国的缔造者,固然伟大,但国家是公器,发展由人民决定为好。Linux OS几乎也成公器,对它的发展也实在应该民主的决定为好。不是不相信Torvalds本人,而是根本不相信个人。受害太深矣!
#     yevv 发表于2007-09-10 14:40:45  IP: 222.129.27.*
在9月份《程序员》杂志上刊登的一篇《微软架构师谈编程语言发展》的文章里,Brian Beckman直截了当地说,C++语言主要是用来开发别的语言的。这话片面一点,如果改成 “C++语言主要是用来支持别的语言的”,那就大体没错了。

------------------------------------------------------
如果一改,也就是100步和50步的关系吧

#   yevv 发表于2007-09-10 14:53:06  IP: 222.129.27.*

另外:举的下面这个例子
std::string s(“Linux Torvalds");
std::string scopy = s;

说高手也看不出来个子午卯酉来,那高手大可自己实现一个比标准库漂亮些的string,自己用阿,这样模块化效果获得了,自己实现的总不至于不知道子午卯酉了吧,如果再不知道,那就等醒醒酒再说,应该还是比char *用的舒服,还清晰,呵呵,如果非要用标准库,还不愿意查相关资料,回过头来还抱怨,那又能怨谁呢
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值