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. Efficiency is not just running fast or running bigger programs, it’s also running using less resources.

  2. 感觉硬件自身有了大的提升,coffee-based就红火(16bit –> 32bit, 512m –> 4G),红火到又需要性能了(GUI –> Touch, 中小公司 –> 大型分布式),C++就强了。然后过几年如果硬件又大提升了,估计又轮回了。

  3. 通篇都在说性能。我大一大二时也最爱用C++,因为它的功能全面而且性能强大,但后来转向PHP/Python了。

    因为超过99%的性能是耗费在1%的代码上的,那我只在那1%上做功夫、使用C/C++这类Native Code不就好了么?

    其次,我相信世界上95%的代码不是用在需要苛刻性能的环境的,而只是偶尔跑一跑,或是只是内部使用的工具,那为什么非用C++这类生产效率低下的产品呢?杀猪用牛刀吧。

    再次,说到钱的问题,程序员比服务器要贵。而且信息技术飞速发展的时代,快速的原型迭代是非常重要的一环。

    我只是想说,C++的确没有没落,但脚本也依然会盛行。

  4. 首先有机会做大规模应用的程序员是少数,大部分应用还是人力,软件维护成本大于硬件成本
    另外性能热点也是在小部分逻辑,C+LUA个人感觉开发效率远大于纯C++, 性能热点用C做逻辑,LUA部分用luajit,总体运行效率也不会输于C++
    最后个人预言C++较长时间内会维持现状,复兴谈不上

  5. 个人以为C++的开发效率还是不错的,如果你不是用C的思维方式的话。毕竟同时支持OO、GP和FP的语言基本上也就他了。
    短板是标准库太弱,不像python、ruby短短10~20年就积攒了那么多open source的标准库。C++重新发明轮子的事情太多了,这也是boost之类的项目想解决的问题。遗憾的是作为一个提交到标准化组织的委员会语言,他的演进速度明显比不上python、ruby,甚至赶不上JAVA和.Net

  6. 陈浩你好,
    完全同意不应该投入.net:)

    话说你有没有数据说明下c++比java这样的性能高多少呢?在什么样的应用下可以省多少$?

  7. 哪有很多错别字?我就找到一处:
    误:可以做任重要的事呢?
    正:可以做任何重要的事呢?
    —————————————–
    好文章啊。

  8. 这个问题我也想过。计算机从本地、桌面软件逐步向服务器-客户端这种模式发展,说性能,其实只存在于用户这一端,所以C++会在苛刻的本地程序中占大份额,如Chrome浏览器、QQ客户端。而服务器端,性能要求越来越高,但它绝不可能成为C++的用武之地,正确的发展方向是分布式,合适的语言有java、clojure之类,CPU不是系统的瓶颈,IO、安全性和可维护性才重要,而C++除了CPU和内存上有优势,还有啥?这种观点可以在诸如“hadoop为什么用java不用c++”的问题中看到。随着服务器端承担的计算和存储越来越大,各种适应分布、并发模型的语言会兴起,当然客户端也将十年二十年内还存在,所以C++也会维持当前地位慢慢下降,但绝不可能复兴。

  9. 还是比较赞同的, 本人是个java的程序员,当然c++和C也会。
    体验很深的一个词是“trade off”,也就是所谓的天下没有免费的午餐。无论是java还是.net的开发成本,相对于c++来说的确要低很多,也就是高生产力吧,或者叫投入产出效益(我的理解是这样的,不知道是否有误)。但是对于性能上,却有着致命的缺陷。鱼与熊掌不可兼得,针对不同的需求,选择不同的语言。相信暴雪也不会用java或者.net去开发wow的。。。

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

  11. “王者归来”的这会儿, 又有个新贵降生: golang.
    不知道谁会最终称王。

  12. @陈皓 移动设备上用C++的基本上都是大型3D,视频游戏,本来就是计算密集型的,计算量比绝大多数桌面应用多的多

  13. 感觉举手机的例子完全扯淡,核心算法c足够搞定了,api用c++调用不得累死,那些支持c++的估计也就是为了方便移植一些现成的东西罢了。

  14. @陈皓
    重看了下…我承认我第一次没有仔细看文章,只是过了下就评论了,不严谨,这点先道谦
    移动端C++处境无疑比桌面,服务端的处境要好.但长远看我还是保持我的观点,如果要效率和抽象能力有比C++更好的替代方案(例如我提到的C+LUA就是其中之一)
    我个人是完全不看好C++语言本身(原因就不展开讨论了,说不完)

  15. 还是不要唯语言论的好。搞了好几年c++了,正在开始用C#,这个语言做的真心不错,很喜欢它的语法。
    顺带说一下智能终端,正好也刚开始试用winphone,了解了一下它的开发和winphone os的现状,我也觉着它会在下个版本有限度的支持c++

  16. 从事业单位辞职后刚开始从事软件开发,算是C++和VB的小学生吧。向您请教个关于.Net的问题。现在做的是和图形学有关的项目,从动作捕捉设备上采集数据、转换后导入到CAD三维软件中的虚拟人上。因为CAD软件提供了免费的VB Automation的二次开发方式,所以是用VB6做的。后来新的动作捕捉设备又需要用C++做开发,于是就打算采用VC调用VB的ActiveX DLL的方式。但是我用的IDE是MSVS2010(我现在只会用MS的IDE,像VC6和VB6),照着网上的例子编代码,发现不行。因为网上的例子是xp下VC6调用VB6的,我现在机子的系统是win7 64bit。我又不想用VS2010的CLR虚拟机,因为会影响效率。我是不是只能在xp下用VC6和VB6来解决问题?我遇到的.net的这个问题是不是您说的.net”慎入”的原因之一?还有其它原因吗?我想学习其它的C++编译器,GCC家族的哪个好些?您有什么建议吗?期待您的解答,谢谢。

  17. windows Phone还是会支持C++的,上次去参加微软培训,微软的人也说了
    就目前wp7上的应用程序除了微软自己的,第三方公司做出来的都会有钝的现象,手机功耗根本降不下去,Lumia 800一天一冲,诺基亚的人都摇头.
    就目前硬件水平来说,还是用C/C++的好,什么垃圾回收机制之类的就不要拖进来了

  18. 我觉得C++只会越来越小众。用户多的网站,企业级应用这些,大多都是java/.net做的。它们的开发效率是c++不能比的。至于性能,都是在网络,数据库这些上,跟语言关系不大。美国这边很多做high frequency trading的公司都用java/.net,他们的程序做交易的时间精度都是微秒级的,也没有什么性能问题。Java/.NET的UI性能是慢点,但是随着硬件的提高都不是问题了,哪怕是移动设备,除了苹果的用objective-c,Android和winphone用的可是Java跟.NET,人家那么多大牛考虑不到性能问题么?可能只会在需要计算性能的核心的地方用c++,比如某些游戏的引擎部分等。C++的问题是太复杂了,写个class都要有constructor, copy constructor, assignment operator, destructor, 这些还是最少的。一个static若干用法,一个const也有若干用法。复杂的东西太多没有意义。java/.net没有这些乱七八糟的东西一样编程。最近c#的占有率都超过c++了。c++肯定不会消失,但是肯定会变成小众。当然游戏开发c++应该还是会很多。用户程序就难说了,而且软件市场主要的份额是企业应用,而不是消费者应用。这块c++差太多了。我看到的现有的很多还是上一代技术的,比如很多基于com的service之类的,而且很多都在被Java/.NET取代。

  19. 網站性能越來越重要? 有多少網站效能瓶頸是在CPU上? 大部份網站都是人力成本遠大於伺服器成本,有多少公司像Google一樣有自己DC要考慮電費問題? 再說,效能的提升不是換了C++就有了提升,流程的設計,演算法的改善,系統的部署,真正逼到極限用語言來改用語言提升,而且改善也很有限,網站性能用C++解決絕對是最笨和最後的解法,擴大佔最大成本的人力去省機器成本,當然如果到那規模可能是有那價值在,但除此之外,誰租伺服器會跟你算電費的? 用script語言開發,真的有效能需要再去改那20%程式,不然都只是在浪費錢而已

    但對於移動裝置的效能用C++這點就可以接受,因為那是很受限的運算環境,使用者經驗很重要,拿Android的流暢度和iPhone的一比就知道了,Android手機你買再高級,連UI滑個畫面都會停頓,iPhone卻少有這種問題

  20. “(要我说,.NET比C++更需要慎重进入,呵)。”

    请问楼主为什么.NET要慎入啊,能深入谈谈吗?
    楼主在TR的时候做的产品不是在.NET平台上的吗?

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

  21. 每种语言都有自己的长短处,我们要用更加开放的态度看待每一种语言(鄙弃门户之见),而且我一直看好C/C++,至于Windows Phone的下一版本,应该会支持C++的。大家可以查看这http://www.liveside.net/2012/01/28/windows-phone-tango-will-support-120-languages-c-development-support-coming-soon/,说明了会支持C++,不过不确定是否下一版本。

  22. 从51cto,csdn 到 coolshell, 我一路看到博主在批C++, 博主今日又是怎么了, 貌似在打自己嘴巴.

  23. 从51cto,csdn 到 coolshell, 我一路看到博主在批C++, 博主今日又是怎么了, 貌似在打自己嘴巴.

  24. 感觉比底层比不过c 比抽象比不过脚本语言 想要一个语言通吃所有逻辑 难阿

    还是 c + luajit 比较好

  25. java的jvm也是c实现的 我觉得就像 #15 楼说的 各个语言用在不同的地方 每个语言有自己独特的优势

  26. @左耳朵耗子 我觉得最近两年有两件事让人们重新关注性能起来,第一是大数据量应用的普及,第二是移动客户端的普及。前二十年由于摩尔定律以及it也自身的发展水平决定了处于初始阶段,所以注重抽象以及生产率。当下属于整个业界刚开始关注性能不久,所以不好说c++王者归来,我觉得只是业界还没找到相应的方法。纵观历史,人类总是能不断改善工具的。所以一定还能找到更好的开发方式,已经看到类似llvm和red之类的努力了,他们说不定就是将来的java。

  27. C++ 重新进入开发的视野,理由其实只有一个 :智能终端的崛起。
    智能终端需要高性能计算,省电,画面流畅。

    比较一下 Android 和 iPhone 的 Native App,能明显感觉到差距。
    尽管Google重新打造Java虚拟机,性能总是不如 C/C++/Obj C。

  28. 与陈皓探讨Z语言与云计算的一些想法

    是到了开发下一代计算机语言的时候了。
    汇编语言:面向硬件
    C语言:面向过程
    C++/Java/Ruby/Pathon/go lang: 面向对象、
    既然Amazon申请了z.cn。计算机语言序列就不用B,C,D,E,G。这样排下去了。直接z语言了。

    时势造英雄,时势也造就计算机语言。Z语言是在云计算的大背景下诞生的。Java是在硬件水平提升,网络快速发展,为跨平台而诞生的。

    Z语言的初步想法:面向任务
    云帮助我们解决了怎么干,这门语言是帮助我们从干什么的想法到用z语言描述出来让云去帮我们干。
    Amazon既然在EC2上已经走在了前列,为啥不百尺竿头更进一步,这个下一代Z语言的开发Amazon责无旁贷。可能Amazon已经有人这么干了。

    Z语言的好处,一通云计算平台,成为事实的业界规范。我写一个云程序,在EC2可用,IBM可用,HP也可用。

    举个例子:coolshell.cn自从我去年发现后(在网上闲逛看到的),就一直排在我chrom书签栏的首位。我都会看酷壳的每一篇文章和大部分评论。但我想滤掉无关痛痒的评论如:“受教了”“陈老师又讲课了”,“给皓皓说个媳妇(再说就是二奶了,您再给迭代一下)”等。

    第一个Z语言程序,(访shell语法):
    Get “coolshell.cn”.latest article | filter “受教|讲课|说媳妇” > obj.temp //Get网页,过滤,Amazon Silk已经实现。
    Cat obj.temp | layout “android_800x480” > coolshell.apk //将网页转为androd app包。
    Push coolshell.apk “13800100138” at 6:00am //早6:00给我推送到手机上,我地铁上看。

    (知识有限,错误难免,欢迎指出,帮助进步)

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

    不跨平台更多不是微软的意思吧,而是开源社区那帮老顽固的抵制。至少微软是欢迎.NET在各个平台流行的。.NET从设计上说一开始也就设计为可跨平台的运行时框架。所以并不是.NET把自己封闭了,而是外界有些人想把它给监禁了。

  30. 路過哥 :
    網站性能越來越重要? 有多少網站效能瓶頸是在CPU上? 大部份網站都是人力成本遠大於伺服器成本,有多少公司像Google一樣有自己DC要考慮電費問題? 再說,效能的提升不是換了C++就有了提升,流程的設計,演算法的改善,系統的部署,真正逼到極限用語言來改用語言提升,而且改善也很有限,網站性能用C++解決絕對是最笨和最後的解法,擴大佔最大成本的人力去省機器成本,當然如果到那規模可能是有那價值在,但除此之外,誰租伺服器會跟你算電費的? 用script語言開發,真的有效能需要再去改那20%程式,不然都只是在浪費錢而已
    但對於移動裝置的效能用C++這點就可以接受,因為那是很受限的運算環境,使用者經驗很重要,拿Android的流暢度和iPhone的一比就知道了,Android手機你買再高級,連UI滑個畫面都會停頓,iPhone卻少有這種問題

    那你接触的只是一些表层的站点而已。需要大数据挖掘与分析的大型互联网公司,如谷歌、脸谱、亚马逊等,都是极其重视代码效率的。这些公司都将大量的资金砸在庞大的数据中心上。往后发展,如果继续大规模采用脚本语言,这些公司的硬件和电力成本将高于人力成本。海量的数据分析与计算,采用native code将比使用脚本节约大量的服务器和电力。

    为什么用C++解决web性能就一定是最笨的方法呢?假如C++不断演化,生产率不断提高,乃至接近脚本的地步,这时候我选择C++,避免不必要的性能损失,又有什么错呢?

  31. 呵呵,估计Go语言在后面的地位会不断提升,静态性能、动态灵活、简洁正交、多核支持、低成本高并发goroutine(类似纤程)等等,毕竟是才发布两年的新语言,没有历史包袱。可针对现有语言问题做改进,又有 unix 的大牛 Ken Thompson 和 Rob Pike 等主持。同时,Google的支持也不可小看(GAE已经支持),Java的崛起没有Sun真不好说。不过还在演进中,今年才会第一个正式版Go1(主要是标准库会保证兼容了)

  32. C# 的生产率的确是个大优点,而 C++ 的性能也是它的老本行。但要是等到 OpenCL 成熟了,不管是 C++ 还是 C# 都能解决高性能运算问题,况且 OpenCL 依赖的是硬件的性能和算法的并行性,和具体的语言无关。不过 OpenCL 还只是用在大场面上,像移动设备之类的当然是 C++ 比较适合——性能高意味着省电嘛。

  33. 硬件性能提升了,应用用户量不大,java火了,后来应用使用的人越来越多,C++又活了。软件性能需求随硬件性能提升而减少,随系统压力增大而提高。@zx3391

  34. 豆瓣网大部分用python开发,其他基本用C,好像占到27%,二者使用的地方不一样,没有可比性,其实都是利器,关键在用对它们。@watert

  35. 不错的文章和分析。 coffee bean就是用来炒了做咖啡喝的,不应该用来写程序。哈哈~~

发表回复

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