linux之父炮轰C++ 有感

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


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

” 显然你这一辈子已经经历了 ‘ 汇编-> C -> C++/C# ‘ 的转变过程,你将我这样一直坚持用C的比作 ‘ 恐龙 ‘,似乎这是一种向更好/更现代的语言不可避免的演进。这是毫无根据的,因为C在很多方面都远远优于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)会这样写代码:

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

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

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

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

文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览113427 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2010年2月26日
下一篇 2010年2月26日

相关推荐