Why C++ ? 王者归来

Why C++ ? 王者归来

因为又有人邀请我去Quora的C2C网站去回答问题去了,这回是 关于 @laiyonghao 的这篇有点争议的博文《2012 不宜进入的三个技术点》ActionScript,Thread 和 C++, C++争议的争议最大。(要我说,.NET比C++更需要慎重进入,呵)。我就在这里回复一下这个问题吧。

正好我一个月前看到一个视频,这个演讲视频还比较著名,这个演讲者是Exceptional C++ C++ Coding Standards 的作者,还是ISO C++ 委员会的Chair,C++/CLI首席架构师,还是Microsoft的软件架构师,他叫Herb Sutter,他的这个演讲视频是 C++ and Beyond 2011上的一次公开演讲,题目是——Why C++? (如果你觉得那里的视频比较慢,你可以看优酷上的视频)(英文听力好的同学可以看一样,因为都没有中文字幕)

我觉得这篇文章就足够可以说明很多问题了,所以,我把Herb的演讲幻灯片截了几页放到这里,并做上一些注释,算是一个演讲内容摘要吧。

1) 为什么C++?因为 Performance per $,也就是说performance 就是钱,这个分成三个方面,

  • 耗电,芯片的耗电量,移动设备的耗电量,家用电脑的耗电量都和钱有关系。
  • 资源,家用电脑和移动设备上的处理器资源有限,因为要让一般消费者买的起。
  • 体验,在更小的设备上会有更好的体验,有更好的体验就可以挣更多的钱。

移动设备上的耗电量相信用过智能手机的人都知道吧,Android手机的耗电量实在是太大了。就算是iPhone在开启Wifi和3G的情况下耗电量也很快。

2)C++的进化分成三个时代:

  • 1979 – 1989:研究C的对象能力。主要是为C++做准备
  • 1989 – 1999:C++成了主流。
  • 1999 – 2009:Coffee-based语言(Java, .NET)出现了,极大的提高了开发生产力。

对于第三个时代,Herb说了很多,他说这个并没有什么错,因为这个时候我们非常关注开发的生产力,这个非常重要,这就是为什么C++一下就失去优势的地方。但是是否这些Coffee-Based的语言可以做任重要的事呢?不行,很多时候,这是一个Trade-Off的事,也就是生产力不是免费的是需要你用别的东西去交换的。

3)第四个时期。

Herb认为,2009-2019是第四个时期,因为我们又喜欢Native Code了,C++从被驱逐后又被请回来了。因为网站的性能越来越是个问题,移动端的设备非常流行。但主要是因为Performance就是钱,因为前面的三个因素,性能影响的是dollar,不尊重性能的公司都会发现花钱的速度太快了。(比如去年大家热炒的京东促销和12306.cn的问题,12306给整个社会造成了巨大的金钱浪费)

Herb把这个时期比做 The Return of the King。(指环王的第三部:王者归来) 性能为王!

这就好像我在“软件开发的三重门”里说的,开垦时代需要的是快和生产力,而开垦完后就得保证其稳定性。

4)Herb还给了一张幻灯片问,“The World is built on ….”,后面例出了多个语言。然后Herb说,世界是由C和C++构成的。

5)Herb给了一张表格,这张表可相当形像。如果把我们的对编程语言的需求总结为四个:效率,灵活,抽象,生产率。那么,C语言玩的是前两个,而C++玩的是前三个,Java和C#玩的是后两个(抽象和生产率)

任保一种设计都不可能让你什么都要的,这就是Trade-Off——什么事都需要交换的。

6)Herb举了一个微软内的例子,用C++ 和 ATL 来开发IE工具条的报告,意思是你可以用脚本在IE的工具条上加按钮,但是作者建议使用C++,因为用.NET或是脚本有重大的limitation,尤其是性能上的问题。

7)接下来,我们来看看移动设备。

下图中,第一个是iOS,第二个是Android,第三个是WinPhone。Herd说了几个事:

a)比Web APP,人们更喜欢Native的APP,这个在用移动设备上可以得到验证。

b)iOS也好,Android也好,WinPhone也好,他们不是在搞操作系统,而是在搞应用,为的是让智能手机更好。手机就是一个App。

c)这三个手机在第一版出来时都不支持C++,而第二版出来时都支持C++了。因为他们要兼顾性能和一定程度上的开发效率。WinPhone还没有到第二版,让我们拭目以待。(我以前写过一篇调侃Android支持C++开发的文章,这也只是一年前的事,说明C++全面回归了)

8)如果你还是不相信的话,我们可以看看为什么Apple和Google都在搞C++的编译器,因为他们觉得g++性能不行。所以,基于LLVM的编译器正在领导潮流,因为我们关注Natvie Code的性能优化。

9)接下来,Herb说了一下数据中心,你知道数据中心最花钱的是什么吗?三个事:

  • 57% 花在了硬件上。
  • 18% 花在了配电和降温上。
  • 13% 花在了耗电上。

88%的钱花在了硬件和电力上。这可是很大一笔费用啊。(还有人说硬件比软件便宜吗?)我记得我上一个公司的数据中心每年要花的电费就在百万美元以上。

10)昨天在微博上有个笑话,说是某咨询师要求程序员把代码打印出来走查,程序员问是不是要用彩打?哈哈。我说,这至少不环保嘛。消耗太大了。是的,C++是可以省电的,以及于C++之父都在YouTube 说C++是可以减轻全球变暖的问题。哇,C++开始真正造福人类了。

11)我还需要重温一下老大的这句话——

My contribution to the fight against global warming is C++’s efficiency: Just think if Google had to have twice as many server farms! Each uses as much energy as a small town. And it’s not just a factor of two… Efficiency is not just running fast or running bigger programs, it’s also running using less resources.

Bjarne Stroustrup, June 2011

最后一句说的非常好!效率不仅仅只是跑得,跑得多,更是可以使用更少的资源

12)下面让我们再来看一张表,一张把钱投到哪里的表格,这样我们可以看到一些趋势。

  • 70年代80年代,资源不够,主要是把钱投在性能上。
  • 80年代到90代,主要是90年代开始有一半的投次到了抽象和生产率上。
  • 00年代,完全都在抽象和生产率上。
  • 10年代,80%的钱都要回头来解决性能问题。这就是C/C++的王者归来。

13)当然,不是C++不注重 开发效率,看看C++0X的标准引入了多少东西我们就知道了。但是本质上,C++还是致力于性能和抽象的完全平衡

那么,我们还会觉得C++要被淘汰了,不适合进入了吗?看完这个演讲,你应该有答案的。

后面讲了C++的文艺复兴,你可以在Google 搜索 “C++ Renaissance”看看。另外,该视频的讲议可以在这里下载

(全文完)

(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)

好烂啊有点差凑合看看还不错很精彩 (32 人打了分,平均分: 4.06 )
Loading...

Why C++ ? 王者归来》的相关评论

  1. 我看好C++,这是一门在不断进化的语言。在进化的过程中,始终努力保持性能与开发效率的平衡。
    没错,完全可能出现各种新鲜的语言,做到跟C++一样或者更好,那我们就拭目以待吧。
    还是很看好C++的。

  2. 对企业级别的应用来说没错。但我觉得未来是属于跟着民间组织的,想linux那种。

    现在的组织太笨重了。耗费大量金钱在内部消耗上。

  3. 我觉得这个要结合自身情况。像我喜欢编程。但是能力现在的确是不行。像google那样的公司。考虑到什么机器费用和电费。之类,真是我接触不到。我现在主要目标就是找个工作。我想愿望是好的c++节省资源。提高性能。但是很多公司没有这样的规模和业务能像google和卓越那样。

  4. 看的很过瘾。提个小意见,performance per$还是翻译成性价比比较好。如果p就是金钱跟后面的环保内容不符。而且本身应该就是用最少钱达到表现的意思,比如移动设备。

  5. 如果真的把编程当成一门艺术(不考虑时间去打磨)的话真的可以考虑只用c/c++,这么多语言也完全可以分工合作就像c++代码本身也可以嵌入asm语句一样。
    a)越接近底层会为效率性能更多考虑c/c++
    b)业务复杂并且量很大会考虑java/.net[个人觉得.net不适合长期使用]
    c)接近前台并需要更快速开发考虑脚本python/ruby/php/…
    d)开发自己用的一些小工具脚本则有更大的优势python/prel/ruby/…

  6. 确实如何选择都是有traceoff考虑的,但是,C++到底有多少所谓性能优势?考虑到开发效率的影响,我想,假设c++和java性能差异并不是数量级差异,选择java这类语言的可能性就会大得多。jit引入以后,C++的性能优势在急剧降低,为了这一点性能提升,采用生产力较为低下的C++是否明智?另一方面,C++某些时候表现得也并不是那么性能好及节省资源,STL::Map的性能比.net Dictionary低一个数量级,是我自己的体验。C++的准标准库Boost,况且不提它的功能丰富与否,体积居然超过1G,超过了.net framework至今所有版本的集合,真是匪夷所思。最后,性能问题应该整体考虑,光靠一个语言(而且性能还并不是绝对牛叉)估计也是没戏的。铁道部那订票网站,用C++改写估计还是那死样。

  7. Apple 和 Google 对 LLVM 感兴趣主要还是 license 限制。当前阶段 GCC 的性能还是明显高于 LLVM。 LLVM 在 OpenCL 上的灵活性倒是比 GCC 要好。

    另外效率方面,这里 native code VS. interpreted/JIT code 讨论的不光是性能(虽然也没什么可讨论的),还有功耗。

  8. 大师的总结和预言,学习之,忙活中应该找时间看看这些东东,起码看看将来可能要走的路;
    当然我等俗人当下还是把手上的活做好,不管用何等工具c,c++,java,能发挥其7,8成功力了不得了。

  9. 现在pc机的运算速度都上百亿了. 再拿性能说事儿就有点太2了.
    需要考虑电费的公司估计连1%都不到.
    另外说到电费, 是不是应该把C++编译时费的电费也算进去?

    其实C++最大的优点是跨平台.你用Java或C#做的程序只能在装过虚拟机的Windows和Linux下运行,反倒是用C++能运行的地方更多.
    还有就是本身的各种烦人造成C++程序员的薪水普遍比其他程序员高.

  10. 现在还拿效率说事,那为啥不去用汇编呢。程序员的时间比机器的时间宝贵得多,现在硬件性能发展的这么快。要真看重效率,好好研究算法和编译器才是王道。

  11. 軟體上是哪一種都無所謂,不過工業上用到的大部分都是C…C++可能會有一點,不過C才是佔最多數的…哈哈

  12. 陈皓 :
    不跨平台就是.NET的短板,,把自己封闭在一个空间里其实挺危险的。另,在TR,我用的是Windows C++,不是.NET平台。

    迷信跨平台

  13. 战无歇 :
    @watert
    “程序员比服务器要贵”。。。有一天,你觉得服务器运营比程序员贵的时候,你就进入了另一个层次了。。。

    看了那么多评论,这句甚合我心。

  14. 第一,运算上百亿次的这种PC,你可以去打听打听价格
    第二,不考虑性能?您真牛,我想你做出来的东西肯定能抗每秒上万次,上十万次的请求吧
    第三, C++的可移植性好?oh my god,java所谓的可移植性可以去死了。
    第四, 像google, baidu这样使用集群的来说,一些优化每年可以省几百万美元电费的案例还是有的,
    综上,你完全在门外@和工业

  15. 跨平台能力第一的是C,当之无愧。谁能举例说明哪个操作系统+arch组合是没有C runtime的?

  16. The Return Of the King 事物我进化最终也离不开本源。
    最适用的才是最好的。
    赞博主

  17. @Ricepig
    std::map是红黑树,.Net的Dictionary是哈希表,要比应该和同是hash表的std::unordered_map比。
    boost编译时产生的中间文件有1G,但是最终的DLL只有几十M.

  18. “效率不仅仅只是跑得,跑得多,更是可以使用更少的资源。”应该中间少了一个“快”字。Efficiency is not just running fast or running bigger programs

  19. 都什么年代了,还拿那点运行效率说事;程序员的大好青春,不能都耗费在学C++上吧?
    编程语言貌似只是编程活动中最简单那部分, 就在本来最简单的地方搞出x多的复杂,x多的纠结,坑爹呢?
    C++谈不上王者,不过是一门, 过分的复杂,过分的被吹捧的编程语言.
    一味的神吹C++,坑了多少无知的孩子了…

  20. C++3D程序一枚,其他的语言也会点儿。
    我觉得未来的几年内,如果纯为了混个工资,学学Objective-c, java, javascript性价比可能会比较高。
    要是真把编程当兴趣,精力投入到哪种语言或平台上都值,包括.net。
    抱死一门语言、一种平台的都比较危险,尤其结了婚,有房贷,生了娃的。
    选语言就跟选对象一样,没有最好的,只有最合适的。如果能一块找俩。。。你们懂得。。。

  21. 争论这些有什么意思啊,单纯搞技术就是追求那些奇淫技巧,我倒建议陈皓先生应该多讲讲中国特色软件开发环境如何,跟美国有什么差距。没有任何一项技术可以孤零零地一直辉煌,只有通过把技术融入事业,融入到企业发展中,才是正确的发展。
    我讨厌孤零零的谈论什么语言优劣,什么语言的一些细节东西。
    我觉得陈皓应该多说说国内那些企业,比如一流的,腾讯百度开发环境如何,二流的如中兴华为开发环境如何。
    明白这些,比过多的了解语言细节,技术细节是强多的。

  22. java和.net真的比c++开发快吗?我怎么从来没有体会过呢。
    尤其是对于代码超过10000行的系统。
    有谁有这方面的经验吗、

  23. 当需求为效率,灵活,抽象,生产率时,可以考虑c+python的组合呀,两者取长补短,相比较c++就没优势咯,何必非要执着于一门语言呢? 精通c、python两门语言花的时间也少过c++太多了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注