| Linux之父话糙理不糙 | 不得不看的两次从C++回归C的高手评论C++ | C语言是否该扔进垃圾桶 |
| 为什么每个程序员都应该学习C语言? | 每个程序员都应该学习C语言?我可不这么认为 | C语言已经死了,5个需要忘却它的理由 |
| 用C设计 用C++编码 | 为什么使用C++ | C++0x:崭新的C++,还是另一个Java? |
| 编程语言的三大定理 | 动态语言为何难堪重任 | 动态语言面面观 |
——当库无法工作时无穷无尽的折磨(别跟我说什么STL尤其是Boost很稳定而且可移植性很好,那全是屁话,而且一点都不可笑)
——低效的抽象编程模型,可能在两年之后你会注意到有些抽象效果不怎么样,但是所有代码已经依赖于围绕它设计的‘漂亮’对象模型了,如果不重写应用程序,就无法改正。
所以,我很抱歉,但是对于Git这样效率是主要目标的软件,C++的所谓优点只是巨大的错误。而我们将看不到这一点的人排除在外却成了一个巨大的附加优势。如果你想要用C++写的版本控制系统,去玩Monotone吧。他们确实使用了‘真格的数据库’,使用了‘漂亮的面向对象库’、使用了‘漂亮的C++抽象’。可是说老实话,所有这些对某些计算机专业人士而言富于吸引力的设计决定,其最终结果确是一堆可怕、难以维护的垃圾。”
【070907更新】Torvalds和Dmitry Kakurin争论继续中。对Torvalds的回击,Dmitry反唇相讥:
没有C的时候我用汇编编程。然后在C++诞生之前,我转向了C。现在我使用C++和C#,而且不再走回头路。差劲的程序员用任何语言都写不出好程序。但是为了将差劲的贡献者拒之门外这样一个没谱的理由而惩罚优秀的开发者,这简直是胡闹。”
对上面的最后一句话,Torvalds后来又做了如下补充:
“说得更具体一些:
——简单和清晰的核心数据结构, 非常精益(lean)且颇具雄心的暧昧管理着它们,将“简单胜于花哨”这一方法发挥到极致。
——有意识地不抽象数据结构和算法,因为它们恰恰是Git核心的全部要素(whole point)。
我来讲讲Git开发应该使用C++的理由(而不是一般意义上C++对任何项目都更好的理由,这种说法同样也是毫无意义的):
1. 好的String类能够大大提高代码的可读性(而且代码也会显著减少)
2. 好的Buffer类——理由同上
3. 管理内存和文件/套接字/锁句柄的智能指针和智能句柄
就目前而言,通过这种繁琐的宏管理字符串和内存,很难看出高层逻辑。”
接下来他的语气变得缓和,甚至最后还用了一个笑脸:
“以我之见,Git具有非常漂亮的高层设计(对象数据库,使用散列,数据和元数据的简单而且容易访问的存储。)向你赞一个!
但是具体实现方式——C和shell脚本的混合、自底向上发展出来的命令行界面就很一般了。
我可没有将C与汇编语言相提并论。我只是要指出我曾经用许多不同的语言编程,目睹了糟糕的程序员用任何语言都会写出差劲的代码。因此这实际上是与语言无关的。”
显然你这一辈子已经经历了 ' 汇编-> C -> C++/C# ' 的转变过程,你将我这样一直坚持用C的比作 ' 恐龙 ',似乎这是一种向更好/更现代的语言不可避免的演进。这是毫无根据的,因为C在很多方面都远远优于C++(更优于C#),包括可移植性,还有接口和低层支持。
你当然可以用任何语言编写糟糕的代码。但是,有些语言,尤其是带有一些心理(mental)包袱的语言本身就非常糟糕。你这样的新手跑来指出一些绝对无关紧要的补丁特性(此处应该指C++对C的增强特性),用它们作为一种语言优越的论据(这些东西语言原作者都不喜欢),这一事实本身恰恰说明你满脑子都是糊涂概念,应该好好醒悟一下了。
对于Git核心代码真正重要的,是诸如这样的事情:编写自己的对象分配代码,使内存占用尽可能小,从而能够高效地记录百万对象的标志。这实际上是为树形关系的多个对象编写本质上非常优化的分析程序,因为这里没有任何抽象。这绝对是在原始内存字节一级上的。
这些事情能够用C之外的语言编写吗?当然可以。但是那些认为C++字符串处理这样的高级特性很重要的人肯定是写不出来的。
事实上,这正是C擅长的事情。不仅指语言本身,还包括一种必需的心态(mentality)。C最大的优点之一,就是它不会使你认为程序是什么高层的东西。正是后一种心态会使你明显偏向其他语言,但实际上从Git的角度看来,所谓 ' 高层 ' 恰恰是错误的。”
他表示不再纠缠于“C与C++孰优孰劣”的讨论,而是介绍了一下自己的出发点:
“我的目的是使用Git。当有些功能无法使用时,我想能够在尽可能最短时间和花费最小的力气进行改正并贡献改正的代码。对我来说,这只是我主要工作的一种消遣而已。
而Git用C编写这一事实,对这一目的毫无好处。建议使用C++是现有C代码基础的唯一出路。所以,虽然C++可能从学术上来讲并非最佳选择,但是唯一切合实际的选择。
“除了其他已经尝试过了的政体之外,民主是政体的最差形式。”
——温斯顿 丘吉尔
现在,我认识到自己只是一个不太活跃的贡献者,但我希望自己的声音能够被人听到。而那些承担开发和维护Git主要重任的人也应该发出自己的声音。”
“我认为字符串处理是C++会找来×××烦的地方之一。糟糕的程序员(原文为idiot)会这样写代码:
a = b + "/share/" + c + serial_num; |
Dmitry有一点是肯定正确的,语言之争更多的是一种类似宗教信仰上的,所以很难有结果,也没有太多实际意义。这种争论因为出自高手之间,所以还是会透露出很多重要的信息。比如:
1. 对于要求性能高的系统编程领域,C++其实未必胜过C,而且事实上,也确实有很多此类项目是选择C作为主要语言的。C的生命力目前仍然毋庸置疑。
2. C++目前确实处于一种被夹攻的态势,一方面在企业级系统开发(数据密集、业务规则复杂多变)中,C++已经基本被Java和C#等淘汰出局,另一方面在系统编程和嵌入式等更接近硬件的领域,又遭到C的强烈狙击。
3. OO技术并非one-size-fits-all。
……(大家补充)
必须看到的是,C语言作为一种古老的语言,其局限性也是很明显的,比如已经成为安全问题渊薮的缓冲区溢出。C的标准库也存在各种各样的问题。对于更加贴近现实世界的众多项目,没有面向对象机制,显然会影响开发效率。(有关C标准库源码层次的分析,图灵将出版著名C/C++专家Plauger的《C标准库》一书。)而且,即使是C程序员所引以为豪的性能优势,现在也岌岌可危了(参见C++之父Stroustrup的文章中相关的比较)。
| Position Sep 2007 |
Position Sep 2006 |
Delta in Position | Programming Language | Ratings Sep 2007 |
Delta Sep 2006 |
Status |
|---|---|---|---|---|---|---|
| 1 | 1 | ![]() |
Java | 21.701% | +0.17% | A |
| 2 | 2 | ![]() |
C | 14.908% | -3.15% | A |
| 3 | 4 | |
(Visual) Basic | 10.748% | +0.12% | A |
| 4 | 5 | |
PHP | 10.204% | +1.08% | A |
| 5 | 3 | ![]() |
C++ | 9.938% | -0.82% | A |
| 6 | 6 | ![]() |
Perl | 5.416% | -0.01% | A |
| 7 | 8 | |
C# | 3.583% | +0.59% | A |
| 8 | 7 | |
Python | 3.025% | -0.12% | A |
| 9 | 9 | ![]() |
JavaScript | 2.722% | +0.28% | A |
| 10 | 13 | ![]() ![]() |
Ruby | 2.065% | +1.13% | A |
“在通用编程语言中,C和Python是半紧凑的;Perl、Java、Emacs Lisp和shell则不是(尤其是真正的shell编程要求你知道半打sed和awk这样的其他工具)。C++是反紧凑的——语言的设计者承认,他并不指望任何一个程序员能够完全理解这一语言。”
下一篇:java程序员需要练就的孤独九剑
-
从C语言角度,看待C++继承实现
从C语言角度,看待C++继承实现
父类 析构函数 构造函数 -
从C语言角度,看待C++封装实现
从C语言角度,看待C++封装实现
封装 成员函数 标识符 -
C++面向对象:C++的垃圾回收
垃圾收集是编程语言中 使用的内存管理技术之一。它是一种自动内存管理技术,作为许多编程语言的功能添加。垃圾收集器收集或回收分配给变量
c++ 算法 内存管理 垃圾收集器 引用计数


















