说它是糟糕程序员的垃圾语言

更新时间:02-08 教程 由 留井 分享

说它是糟糕程序员的垃圾语言?

亮点是,糟糕程序员(重点,要考)的垃圾语言!

也就是说,C++也许是精致程序员的宝,而糟粕程序员无疑会使其变为垃圾语言。

所以,linux之父说的没毛病啊!开个玩笑,其实事件由来是两个高手间的争论。

Linux之父Linus Torvalds为Linux内核开发而专门打造的版本控制软件Git,已经引起了业界的广泛关注。有位Dmitry Kakurin老兄在查看了源码后,发现其使用的是纯C而非C++,表示不可理解,便吐槽道:

“别拿可移植性说事儿,这是屁话(BS,bullshit)。”

(此外,他还批评Git工程中蛮力地直接读写文本的方式,既繁琐又易错,而且使对上层逻辑的理解变得非常困难。)

这个吐槽引起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脚本的混合、自底向上发展出来的命令行界面,就很一般了。

我可没有将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程序员花费更多时间去修改和删除。

声明:关于《说它是糟糕程序员的垃圾语言》以上内容仅供参考,若您的权利被侵害,请联系13825271@qq.com
本文网址:http://www.25820.com/tutorial/14_2301915.html