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 ,请勿用于任何商业用途)
《Why C++ ? 王者归来》的相关评论
Efficiency is not just running fast or running bigger programs, it’s also running using less resources.
为何不扶植新势力?Objective C,D等
哈哈,好多错别字
感觉硬件自身有了大的提升,coffee-based就红火(16bit –> 32bit, 512m –> 4G),红火到又需要性能了(GUI –> Touch, 中小公司 –> 大型分布式),C++就强了。然后过几年如果硬件又大提升了,估计又轮回了。
通篇都在说性能。我大一大二时也最爱用C++,因为它的功能全面而且性能强大,但后来转向PHP/Python了。
因为超过99%的性能是耗费在1%的代码上的,那我只在那1%上做功夫、使用C/C++这类Native Code不就好了么?
其次,我相信世界上95%的代码不是用在需要苛刻性能的环境的,而只是偶尔跑一跑,或是只是内部使用的工具,那为什么非用C++这类生产效率低下的产品呢?杀猪用牛刀吧。
再次,说到钱的问题,程序员比服务器要贵。而且信息技术飞速发展的时代,快速的原型迭代是非常重要的一环。
我只是想说,C++的确没有没落,但脚本也依然会盛行。
@zx3391
也不一定每次轮回都是C++, 说不定哪次就成了别的语言了.
首先有机会做大规模应用的程序员是少数,大部分应用还是人力,软件维护成本大于硬件成本
另外性能热点也是在小部分逻辑,C+LUA个人感觉开发效率远大于纯C++, 性能热点用C做逻辑,LUA部分用luajit,总体运行效率也不会输于C++
最后个人预言C++较长时间内会维持现状,复兴谈不上
移动端的,嵌入式的,也算是大规模?
个人以为C++的开发效率还是不错的,如果你不是用C的思维方式的话。毕竟同时支持OO、GP和FP的语言基本上也就他了。
短板是标准库太弱,不像python、ruby短短10~20年就积攒了那么多open source的标准库。C++重新发明轮子的事情太多了,这也是boost之类的项目想解决的问题。遗憾的是作为一个提交到标准化组织的委员会语言,他的演进速度明显比不上python、ruby,甚至赶不上JAVA和.Net
陈浩你好,
完全同意不应该投入.net:)
话说你有没有数据说明下c++比java这样的性能高多少呢?在什么样的应用下可以省多少$?
写的好, 好文
笔误好多啊,没睡好还是多喝了两杯?
哪有很多错别字?我就找到一处:
误:可以做任重要的事呢?
正:可以做任何重要的事呢?
—————————————–
好文章啊。
这个问题我也想过。计算机从本地、桌面软件逐步向服务器-客户端这种模式发展,说性能,其实只存在于用户这一端,所以C++会在苛刻的本地程序中占大份额,如Chrome浏览器、QQ客户端。而服务器端,性能要求越来越高,但它绝不可能成为C++的用武之地,正确的发展方向是分布式,合适的语言有java、clojure之类,CPU不是系统的瓶颈,IO、安全性和可维护性才重要,而C++除了CPU和内存上有优势,还有啥?这种观点可以在诸如“hadoop为什么用java不用c++”的问题中看到。随着服务器端承担的计算和存储越来越大,各种适应分布、并发模型的语言会兴起,当然客户端也将十年二十年内还存在,所以C++也会维持当前地位慢慢下降,但绝不可能复兴。
还是比较赞同的, 本人是个java的程序员,当然c++和C也会。
体验很深的一个词是“trade off”,也就是所谓的天下没有免费的午餐。无论是java还是.net的开发成本,相对于c++来说的确要低很多,也就是高生产力吧,或者叫投入产出效益(我的理解是这样的,不知道是否有误)。但是对于性能上,却有着致命的缺陷。鱼与熊掌不可兼得,针对不同的需求,选择不同的语言。相信暴雪也不会用java或者.net去开发wow的。。。
木有分享到google+
@watert
“程序员比服务器要贵”。。。有一天,你觉得服务器运营比程序员贵的时候,你就进入了另一个层次了。。。
“王者归来”的这会儿, 又有个新贵降生: golang.
不知道谁会最终称王。
@陈皓 移动设备上用C++的基本上都是大型3D,视频游戏,本来就是计算密集型的,计算量比绝大多数桌面应用多的多
皓皓,你有媳妇儿了吗 ? 给你说个媳妇啊 ?1
感觉举手机的例子完全扯淡,核心算法c足够搞定了,api用c++调用不得累死,那些支持c++的估计也就是为了方便移植一些现成的东西罢了。
一直都是在从事3D图形渲染方面的开发,感觉还是C++比较好一些。。
@陈皓
重看了下…我承认我第一次没有仔细看文章,只是过了下就评论了,不严谨,这点先道谦
移动端C++处境无疑比桌面,服务端的处境要好.但长远看我还是保持我的观点,如果要效率和抽象能力有比C++更好的替代方案(例如我提到的C+LUA就是其中之一)
我个人是完全不看好C++语言本身(原因就不展开讨论了,说不完)
“因为又有人我去Quora的C2C站去回答问题去了”哥们的中文有点….不好懂
还是不要唯语言论的好。搞了好几年c++了,正在开始用C#,这个语言做的真心不错,很喜欢它的语法。
顺带说一下智能终端,正好也刚开始试用winphone,了解了一下它的开发和winphone os的现状,我也觉着它会在下个版本有限度的支持c++
从事业单位辞职后刚开始从事软件开发,算是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家族的哪个好些?您有什么建议吗?期待您的解答,谢谢。
windows Phone还是会支持C++的,上次去参加微软培训,微软的人也说了
就目前wp7上的应用程序除了微软自己的,第三方公司做出来的都会有钝的现象,手机功耗根本降不下去,Lumia 800一天一冲,诺基亚的人都摇头.
就目前硬件水平来说,还是用C/C++的好,什么垃圾回收机制之类的就不要拖进来了
我觉得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取代。
網站性能越來越重要? 有多少網站效能瓶頸是在CPU上? 大部份網站都是人力成本遠大於伺服器成本,有多少公司像Google一樣有自己DC要考慮電費問題? 再說,效能的提升不是換了C++就有了提升,流程的設計,演算法的改善,系統的部署,真正逼到極限用語言來改用語言提升,而且改善也很有限,網站性能用C++解決絕對是最笨和最後的解法,擴大佔最大成本的人力去省機器成本,當然如果到那規模可能是有那價值在,但除此之外,誰租伺服器會跟你算電費的? 用script語言開發,真的有效能需要再去改那20%程式,不然都只是在浪費錢而已
但對於移動裝置的效能用C++這點就可以接受,因為那是很受限的運算環境,使用者經驗很重要,拿Android的流暢度和iPhone的一比就知道了,Android手機你買再高級,連UI滑個畫面都會停頓,iPhone卻少有這種問題
“(要我说,.NET比C++更需要慎重进入,呵)。”
请问楼主为什么.NET要慎入啊,能深入谈谈吗?
楼主在TR的时候做的产品不是在.NET平台上的吗?
不跨平台就是.NET的短板,,把自己封闭在一个空间里其实挺危险的。另,在TR,我用的是Windows C++,不是.NET平台。
每种语言都有自己的长短处,我们要用更加开放的态度看待每一种语言(鄙弃门户之见),而且我一直看好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++,不过不确定是否下一版本。
oschina和cnbeta抄的好快。。
@陈皓
.net为什么就不跨平台了?linux上也.net runtime : mono啊, 我不认为.net是封闭的
从51cto,csdn 到 coolshell, 我一路看到博主在批C++, 博主今日又是怎么了, 貌似在打自己嘴巴.
从51cto,csdn 到 coolshell, 我一路看到博主在批C++, 博主今日又是怎么了, 貌似在打自己嘴巴.
这就是说,你不了解我这个神秘的男人。嘿嘿⋯
感觉比底层比不过c 比抽象比不过脚本语言 想要一个语言通吃所有逻辑 难阿
还是 c + luajit 比较好
@战无歇
这个时候,Windows Azure就是大救星。
java的jvm也是c实现的 我觉得就像 #15 楼说的 各个语言用在不同的地方 每个语言有自己独特的优势
@左耳朵耗子 我觉得最近两年有两件事让人们重新关注性能起来,第一是大数据量应用的普及,第二是移动客户端的普及。前二十年由于摩尔定律以及it也自身的发展水平决定了处于初始阶段,所以注重抽象以及生产率。当下属于整个业界刚开始关注性能不久,所以不好说c++王者归来,我觉得只是业界还没找到相应的方法。纵观历史,人类总是能不断改善工具的。所以一定还能找到更好的开发方式,已经看到类似llvm和red之类的努力了,他们说不定就是将来的java。
C++ 重新进入开发的视野,理由其实只有一个 :智能终端的崛起。
智能终端需要高性能计算,省电,画面流畅。
比较一下 Android 和 iPhone 的 Native App,能明显感觉到差距。
尽管Google重新打造Java虚拟机,性能总是不如 C/C++/Obj C。
与陈皓探讨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给我推送到手机上,我地铁上看。
(知识有限,错误难免,欢迎指出,帮助进步)
不跨平台更多不是微软的意思吧,而是开源社区那帮老顽固的抵制。至少微软是欢迎.NET在各个平台流行的。.NET从设计上说一开始也就设计为可跨平台的运行时框架。所以并不是.NET把自己封闭了,而是外界有些人想把它给监禁了。
那你接触的只是一些表层的站点而已。需要大数据挖掘与分析的大型互联网公司,如谷歌、脸谱、亚马逊等,都是极其重视代码效率的。这些公司都将大量的资金砸在庞大的数据中心上。往后发展,如果继续大规模采用脚本语言,这些公司的硬件和电力成本将高于人力成本。海量的数据分析与计算,采用native code将比使用脚本节约大量的服务器和电力。
为什么用C++解决web性能就一定是最笨的方法呢?假如C++不断演化,生产率不断提高,乃至接近脚本的地步,这时候我选择C++,避免不必要的性能损失,又有什么错呢?
看了这遍文章后,心情很不错。我们搞C++的,还是没有落伍的
博客主题很好看,请问博主用什么主题呢
呵呵,估计Go语言在后面的地位会不断提升,静态性能、动态灵活、简洁正交、多核支持、低成本高并发goroutine(类似纤程)等等,毕竟是才发布两年的新语言,没有历史包袱。可针对现有语言问题做改进,又有 unix 的大牛 Ken Thompson 和 Rob Pike 等主持。同时,Google的支持也不可小看(GAE已经支持),Java的崛起没有Sun真不好说。不过还在演进中,今年才会第一个正式版Go1(主要是标准库会保证兼容了)
C# 的生产率的确是个大优点,而 C++ 的性能也是它的老本行。但要是等到 OpenCL 成熟了,不管是 C++ 还是 C# 都能解决高性能运算问题,况且 OpenCL 依赖的是硬件的性能和算法的并行性,和具体的语言无关。不过 OpenCL 还只是用在大场面上,像移动设备之类的当然是 C++ 比较适合——性能高意味着省电嘛。
硬件性能提升了,应用用户量不大,java火了,后来应用使用的人越来越多,C++又活了。软件性能需求随硬件性能提升而减少,随系统压力增大而提高。@zx3391
豆瓣网大部分用python开发,其他基本用C,好像占到27%,二者使用的地方不一样,没有可比性,其实都是利器,关键在用对它们。@watert
不错的文章和分析。 coffee bean就是用来炒了做咖啡喝的,不应该用来写程序。哈哈~~