标题:一些思索:为什么是C ,而不是C++ —— 理想和现实的博弈。 出处:Felix021 时间:Mon, 29 Jun 2009 17:00:11 +0000 作者:felix021 地址:https://www.felix021.com/blog/read.php?1676 内容: 一直觉得C++做到了一件看似不可能的任务: 实现了完整的OO(甚至还有多继承),同时提供了对泛型几近完美的支持,还保证了足够的效率。 相比之下, Java对OO的支持的确很好,但是它对泛型的支持,我觉得只能用丑陋来形容;同时它还提供了让我难以接受的效率。 Sandy在用Java开发他的手机游戏时就遇到了种种问题, 我也无法接受它"把一切都封装好只为让开发更简单"这样的Bullshit。 事实上一切都变复杂了。 C没有提供对OO的支持,也没有提供对泛型的直接支持;效率的确可观,但是用于开发,似乎很费劲。 对于开发人员,为一个安全数组写一大段基于malloc/realloc和需要强制类型的转换的代码似乎很累,而且可读性也差。 而C++的vector使用起来就相当省事,代码也更加清晰易读。 所以曾经有一段时间感到有点纳闷,为什么那么多大项目是用C开发的,而不是C++? "历史遗留问题"似乎解释不通,比如Linux源代码是经过了几次完全的重写,其间C++已经发展得比较完善了。 回过头来想想另一件事情: 如果你经常逛一些偏开发类的论坛(比如CSDN?),并看到过那些有"纯正血统"的Java程序员的言论 你就会知道那些人如同不学无术的八旗子弟一般不堪; 尤其是他们对指针的理解,那根本就是P话,而且一点都不好笑。 这里不是想嘲笑他们有多么粗俗浅陋,毕竟没有学C不一定是他们的错。 这只是个类比,C和C++的对比,在一些方面与C/C++和Java的对比还是很相似的。 Linux之父Linus对C++嗤之以鼻,甚至因此和某人大吵一架,并毫不保留地表达了他对C++以及C++程序员的蔑视。 引用 ...(Git)项目限制只用C,意味着参与的人不会捣乱,也意味着会得到许多真正懂得底层问题,而不会折腾那些白痴‘对象模型’垃圾的程序员。...所以,我很抱歉,但是对于Git这样效率是主要目标的软件,C++的所谓优点只是巨大的错误。而我们将看不到这一点的人排除在外却成了一个巨大的附加优势。... 从普通开发者的角度看来,一个提供完整OOP支持的语言不仅提高了开发效率、增加代码可读性,还为代码重用带来了极大的便利。这的确是现代大型系统开发需要的,但是它真的做到了吗? 你在学习C++的过程中可以很容易的学到如何继承一个类,可是你知道如果这个类的析构函数不是虚函数可能带来怎样的后果?你可以很容易地学到如何使用set/map,如何为它写一个简单的functor,可是你知道严格弱序化这个原则吗(Strict Weak Ordering)? 如果你不知道,没关系,这不是你的错,因为C++已经复杂到让人吃惊的地步了:STL中出现的traits和可以重载的逗号运算符都不算什么了,可是居然还能有boost这么变态的东西!甚至有人说,C++是唯一一门连语言之父都要别人教他怎么使用的语言了。 从某些角度来说,Java似乎做得更好:提供了丰富的类库以及完善的GC,你忘记了的东西通通交给它吧----可是你真的放心么?如果你知道Sandy仅仅因为String的问题就纠结了那么久,你就不会给出肯定答案了。我的看法是,Java只是把一切都变得复杂了(的确,我对Java有偏见,Sandy也是)。 最后回到C。不可否认,C标准库里的东西太少了,和现实不够接轨,不是类型安全的,只有指针没有引用也让代码看起来更ooxx... 但是仔细想想,其实C提供了一个足够简洁而完善的对底层的合理抽象,将控制一切的操作能力都交给你,让你能够不纠结于语言层面的复杂性,而将精力投入到功能的实现中去。 不要认为C不支持面向对象,不要认为这一点就限制了设计模式的使用----事实上,完全用C写就的Linux源代码是高度面向对象的,使用了令人惊叹的设计模式,达到了不可思议的效率和可扩展性。 做了这样的对比,不是想说C++和Java有多么不堪,至少从进化论的角度来说,他们都是成功的、优秀的。仔细思索,之所以Linus如此鄙视C++,并不是因为C++真的很差,而是因为C++的复杂性使得系统的设计变得更加复杂(特别是在要求高效率的地方,你用C++可能根本找不到效率损失于何处!),更为可怕的是,有那么多自以为是的程序员,以为学会了class a: public b就是学会了面向对象,以为学会了Observer模式的含义就真正掌握了设计模式,甚至以为学会了MFC就是学会了C++。如果这些人加入Linux内核的开发,那的的确确是一场灾难,而且极其可怕。 "的确有不少C++程序员贡献代码,但是反而需要核心的C程序员花费更多时间去修改和删除。" 最后,援引Linus的一句话作为结束:引用 C最大的优点之一,就是它不会使你认为程序是什么高层的东西。 Generated by Bo-blog 2.1.0