神话与谬误:争论C++前你应当知道什么

豆豆网   技术应用频道   2007年08月11日  【字号: 收藏本文

内容摘要:最近写了一篇关于C++0x Concepts的文章,意料之外地引起了一场小规模口水仗。回各位帖子的同时,回想这些年C++社群的大小争论,觉得有必要把一些长久以来在C++争论中出现的误解列举出来。

  有同学说,我只要一个能用的库就行了。但问题是,标准库能随便吗?标准库之所以不能随便,是因为像这样受众极其广泛的库可是要负责任的——将会有百万千万行代码都依赖它。如果标准库里面有bug,将会出现几百万上千万行workarounds,这些workarounds依赖于库的bug,为了保持向后兼容性,标准库甚至都不能修正这些bug。就连STL这样漂亮的抽象,迭代器区间还是闯了祸。另一方面,如果只是需要一个能用的库,C++社区有大量“能用”的库。姑且不说boost里面的了。

  Fallacy #3 ——C++的强处在于什么都能做

  一个最常见的论调就是,java的虚拟机也是C++做的,于是得出结论,java比C++弱,java没有C++好。 姑且不说“好”的定义标准是什么。就算java的虚拟机做的,那C++的第一个编译器还要用C写呢。C库里面的某些成分还要用汇编写呢。这个论据是站不住脚的。 其实,持这种论点的人是站错了位置,问错了问题。

  关键的问题不是一门语言能做什么,因为说到能做什么,汇编什么都能做。而是“在某个特定的领域,哪门语言表现更好”,人们的需求几乎总是对着某个特定的领域的。后者才是真正matter的问题。 从这个角度看,C++的市场其实只在效率这一块。有人可能会说,那效率这一块有C啊。问题是,C的抽象机制太弱。写架构简单的应用,或者写一些核心的(如驱动程序),没有面向对象结构的程序,容易。完全可以用C。但涉及到大型系统,比如.NET基层架构,一些3D游戏。必须用到面向对象或基于对象编程的领域,C在代码组织和抽象方面的弱点就暴露出来了。比如用C和宏来实现所谓OO,就正说明了C的抽象机制的薄弱。

  但是,C++的领土基本也就在这些地方了。简而言之就是所有“效率重要,且同时需要好的抽象机制的应用领域”。因为C++的优势就是无损效率的实现更好的抽象。 那C++既有效率又有更好的抽象机制,为什么C++不能取代java、不能取代python,不能取代ruby?或者至少当C++进化到更好的阶段的时候,比如C++0x就是一个大的进展(在语言方面),为什么作为一门语言,不能取代那些严重“偏科”的语言呢?

  原因有两方面。一方面,正因为“偏科”,所以有些语言才能在它们擅长的领域做得更好,乃至做到最好。“偏执狂才能生存”。人们的需求几乎总是在特定领域的,你说这时候人是愿意选用一门专门为这个领域而生的语言(ruby),还是愿意用一门general-purpose的语言(C++)?另一方面,就算C++在抽象机制上进化到了非常好,乃至于能在某些特定领域也表现不菲的话,由于市场早就被别的语言侵占,别的语言已经有了成百上千万行的代码基,别的语言的库已经发展到非常丰富的程度,别的语言的相关人才教育已经一代又一代,所以结果还是没得拼。 其实,从另一个角度来说,C++何尝不也是一门偏执的语言呢?C++的偏执就是效率,C的偏执也是效率,但C++提供更好的抽象,因此在这一块(效率+抽象),C++比C有优势。 C++的领土已经铸成,另一方面,C++的领土在可见的未来也不大可能缩水了。这是C++的现实,这个现实,至少在Bjarne看来,也没什么不好,因为它正反映了C++当时设计的意图——更好的C。我们也不用赶鸭子上架,非拿C++和其它语言比——适用的场合本就不同,没得比。 Fallacy #4 …

  事不过三,就此打住。况且,这三条难道还不够吗?如果你想到还有什么fallacy要补充的,请不吝回帖:) 我会考虑加到文章里面的:)

来源:天极    作者:刘未鹏    责编:豆豆技术应用

正在加载评论...