linux之父炮轰C++ 有感

Linux之父Linus Torvalds为了Linux内核开发而专门打造的版本控制软件Git 已 经引起了业界的广泛关注。昨天,有一位Dmitry Kakurin老兄在查看了源代码之后,发现使用的是纯C而非C++,表示不可理解,他直言:“别拿可移植性说事儿,这是屁话 (BS,bullshit)。“(此外,他还批评 Git 蛮力地直接操作文本,既啰嗦又易错,而且很难跟上高层代码逻辑。)


这个BS引起了Torvalds的强 烈反应 ,他用 *YOU* are full of bullshit.“(你才满嘴屁话呢)作为自己反驳的开场白。接着,他先转向了对C++的罕见的火药味十足的炮轰:

”C ++是一种糟糕的(horrible)语言。而且因为有大量不够标准的程序员在使用而使情况更糟,以至于极容易产生彻头彻尾的垃圾(total and utter crap)。老实说,选择C就是为了把C++程序员踢出去。……我有这样的结论,任何喜欢用C++而不是C开发项目的程序员可能都是我希望踢出去的人,免 得他们来搞乱我参与的项目。C++会导致非常非常糟糕的设计选择。你们这些C++程序员总是一上来就用语言的那些‘漂亮的’库特性比如STL、Boost 和其他彻头彻尾的垃圾,这可能对你们的程序有所‘帮助’,但是却会导致:

“——当库无法工作时无穷无尽的折磨(别跟我说什么STL尤其是Boost很稳定而且可移植性很好,那全是屁话,而且一点都不可笑)

"——低效的抽象编程模型,可能在两年之后你会注意到有些抽象效果不怎么样,但是所有代码已经依赖于围绕它设计的‘漂亮’对象模型了,如果不重写应用程 序,就无法改正。

”也就是说,使用优秀的、高效的、系统级的和可移植的C++的唯一方式,最终还是限于使用C本身具有的所有特性。项目限制只用C,意味着参与的人不会捣 乱,也意味着会得到许多真正懂得底层问题,而不会折腾那些白痴‘对象模型’垃圾的程序员。

"所以,我很抱歉,但是对于Git这样效率是主要目标的软件,C++的所谓优点只是巨大的错误。而我们将看不到这一点的人排除在外却成了一个巨大的附加优 势。

" 如果你想要用C++写的版本控制系统,去玩Monotone吧。他们确实使用了‘真格的数据库’,使用了‘漂亮的面向对象库’、使用了‘漂亮的C++抽象 ’。可是说老实话,所有这些对某些计算机专业人士而言富于吸引力的设计决定,其最终结果确是一堆可怕、难以维护的垃圾。“

Torvalds和Dmitry Kakurin争论继续中。
对Torvalds的回击,Dmitry反唇相讥 :“随 着只用C编程的恐龙们逐渐灭绝,你很快就会发现只剩下自己一个人在固执己见。用Git贡献者的数量是说明不了问题的。显然C++开发者也能够 贡献C代码。但是以为他们喜欢这种方式,那可就错了。

“没有C的时候我用汇编编程。然后在C++诞生之前,我转向了C。现在我使用C++和C#,而且不再走回头路。差劲的程序员用任何语言都写 不出好程序。但是为了将差劲的贡献者拒之门外这样一个没谱的理由而惩罚优秀的开发者,这简直是胡闹。”

只过了10几分钟,Torvalds就回贴了 :“和你不同的 是,我实实在在地给出了不喜欢C++的原因,而且指出了它可能导致的各种问题的一些例子。而你呢,没有给出一条像样的使用C++的理由。事实上,Git比 其他软件配置管理软件都要好,而好的品味(taste)和C正是原因之一。

       对上面的最后一句话,Torvalds后来又做了如下补充:
        ”说得更具体一些:
        “——简单和清晰的核心数据结构, 非常 精益(lean)且颇具雄心的暧昧管理着它们,将”简单 胜于花哨”
           这一方法发挥到极致。
        ”——有意识地不抽象数据结构和算法,因为它们恰恰是Git核心的 全部要素 (whole point)。

        ”如果你想用更花哨的语言,C++绝对是最糟糕的选择。如果想要真正的高级特性,那就选择有垃圾回收或
                  者好的系统集成的,而不是既缺乏C的简约(sparseness)又缺乏C的直接而且 没有重要概念的高层                  绑定(high-level bindings to important concepts)的东西。

        “一言以蔽之,C++正处在困境当中,它既无法帮助原型化或者简单的GUI编程足够简化从而真正可用,又                  不是C那样积极地鼓励你使用简单和直接的语言构造的精益系统编程语言。

                   (另一位同学插了一句:这还没有提到很难找到两个C++编译器支持同样的特性。)

 

“这与什么恐龙毫无关系。好的品味永远不会过时。将C与汇编语言相提并论,恰恰说明你对自己所讨论的问题缺乏起码的概念(don't have a friggin idea)。"

争 论还在继续。半个小时之后,半小时后,Dmitry回帖
“我说过,这是一种信仰问题。因此,任何讲道理和争论都会无穷无尽,而且也毫无意义,就像任何其他宗教问题一样。"

”我来讲讲Git开发应该使用C++的理由(而不是一般意义上C++对任何项目都更好的理由,这种说法同样也是毫无意义的):

“1. 好的String类能够大大提高代码的可读性(而且代码也会显著减少)
"2. 好的Buffer类——理由同上
”3. 管理内存和文件/套接字/锁句柄的智能指针和智能句柄
“就目前而言,通过这种繁琐的宏管理字符串和内存,很难看出高层逻辑。

接下来他的语气变得缓和,甚至最后还用了一个笑脸:

"以我之见,Git具有非常漂亮的高层设计(对象数据库,使用散列,数据和元数据的简单而且容易访问的存储。)向你赞一个!

“但是具体实现方式——C和shell脚本的混合、自底向上发展出来的命令行界面就很一般了m
”我可没有将C与汇编语言相提并论。我只是要指出我曾经用许多不同的语言编程,目睹了糟糕的程序员用任何语言都会写出差劲的代码。因此这实际上是与语言无 关的。:-)


Torvalds则依然怒气未消,他反驳Dmitry对Git用宏管理字符 串和内存的批评
"完全是屁话。字符串/内存管理根本无关紧要。还是去看看源代码吧(我敢打赌你没有看过)。这不是重要的部分,而且也不复杂。唯一真正重要的部分是设计 。有些部分之所以是用 ' 原型化语言 ' 编写,恰恰是因为它们不是核心部分,而且会被C慢慢地替换掉。C++可没有办法 替 换shell脚本或者Perl代码。而且C++也没办法让真正核心的部分变得更好。

" 显然你这一辈子已经经历了 ' 汇编-> C -> C++/C# ' 的转变过程,你将我这样一直坚持用C的比作 ' 恐龙 ',似乎这是一种向更好/更现代的语言不可避免的演进。这是毫无根据的,因为C在很多方面都远远优于C++(更优于C#),包括可移植性,还有接口和低层 支持。

"你当然可以用任何语言编写糟糕的代码。但是,有些语言,尤其是带有一些心理 (mental) 包袱的语言本身就非常糟糕。你这样的新手跑来指出一些绝 对无关紧要 的补丁特性(【刘江按】此处应该指C++对C的增强特性),用它们作为一种语言优越的论据(这些东西语言原作者都不喜欢),这一 事实本身恰恰说明你满脑子都是糊涂概念,应该好好醒悟一下了。

"对于Git核心代码真正重要 的,是诸如这样的事情:编写自己的对象 分配代码,使内存占用尽可能小,从而能够高效地记录百万对象的标志。这实际上是为树形关系的多个对象编写本质上非常优化的分析程序,因为这里没有 任何抽象。这绝对是在原始内存字节一级上的。

"这些事情能够用C之外的语言编写吗?当然可以。但是那些认为C++字符串处理这样的高级特性很重要的人肯定是写不出来的。

"事实上,这正是 C擅长的事情。不仅指语言本身,还包括一种必需的心态 (mentality)。C最大的优点之一,就是它不会使你认为程序是什么 高层的东西。正是后一种心态会使你明显偏向其他语言,但实际上从Git的角度看来,所谓 ' 高层 ' 恰恰是错误的。"


Dmitry回帖:
我不仅看过源代码,而且还做过很多调试工作。我发现的问题大多数都与处理Windows上的路径(也就是字符串处理)有关。

他表示不再纠缠于“C与C++孰优孰劣”的讨论,而是介绍了一下自己的出发点:

我的目的是使用Git。当有些功能无法使用时,我想能够在尽可能最短时间和花费最小的力气进行改正并贡献改正的代码。对我来说,这只是我主要工作的一种消 遣而已。

而Git用C编写这一事实,对这一目的毫无好处。建议使用C++是现有C代码基础的唯一出路。所以,虽然C++可能从学术上来讲并非最佳选择,但是唯一切 合实际的选择。

“除了其他已经尝试过了的政体之外,民主是政体的最差形式。”
——温斯顿 丘吉尔

现在,我认识到自己只是一个不太活跃的贡献者,但我希望自己的声音能够被人听到。而那些承担开发和维护Git主要重任的人也应该发出自己的声音。


此后,Torvalds没有再发言,大概是认为自己已经大获全胜。而另外一些Git贡献者继续对Dmitry进行反驳,可以看出,Torvalds的看法 并不是他的私见。Theodore Tso说

“我认为字符串处理是C++会找来大麻烦的地方之一。糟糕的程序员(原文为idiot)会这样写代码:

 a = b + "/share/
" + c + serial_num;

“其中你肯定无法弄清到底分配了多少内存,因为有类型强制转换、重载的操作符(感谢上帝,在C++中你可以重载逗号操作符!),而当这种东西出现在 内循环中,结果将是性能上的大灾难,而且原因 还不明显!

另外还有同学讽刺,说的确有不少C++程序员贡献代码,但是反而需要核心的C程序员花费更多时间去修改和删除。



看完颇有感触 : Torvalds的想法确实是有一些道理的,虽然C++可以很“方便”的完成很多功能,可以省很多事,但是它的弊端也同样明显,编译器默认的帮你做了太多 事情,很多在C里不可思议的语法,在C++中只用一个重载帮你完成了,也就是说,如果不充分的了解编译器,不了解C++的话,编出的代码是极难调试的. 在这3年的C++使用经验上,我越来越感觉,当一个工程到一定规模的时候,不管你的设计多么的优秀,用c++实现的代码非常难以维护,且不说C++非常难 学(事实上现在说精通C++的人大多都只会C++皮毛而已),培养这样一个人才就非常不容易了,而且大型工程里几千个类是很平常的事,这里面千丝万缕的关 系就算是这个工程的架构师恐怕都很难搞明白了.  

我的总结是C++只适合写小型的应用,大型的代码,对工程质量要求比较苛刻的场合下,C恐怕是唯一的选择.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值