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++ ? 王者归来》的相关评论
我看好C++,这是一门在不断进化的语言。在进化的过程中,始终努力保持性能与开发效率的平衡。
没错,完全可能出现各种新鲜的语言,做到跟C++一样或者更好,那我们就拭目以待吧。
还是很看好C++的。
喜欢C++ 什么东西都脱离不了最原始的基本。 就像人一样,最终会落叶归根。最原始的 就是最好的。
还是喜欢语言用C,思想OO。
博主很博学的哦
对企业级别的应用来说没错。但我觉得未来是属于跟着民间组织的,想linux那种。
现在的组织太笨重了。耗费大量金钱在内部消耗上。
@cxu2003 貌似
这个真能猜
我觉得这个要结合自身情况。像我喜欢编程。但是能力现在的确是不行。像google那样的公司。考虑到什么机器费用和电费。之类,真是我接触不到。我现在主要目标就是找个工作。我想愿望是好的c++节省资源。提高性能。但是很多公司没有这样的规模和业务能像google和卓越那样。
C++ 太过于复杂了 – =
看的很过瘾。提个小意见,performance per$还是翻译成性价比比较好。如果p就是金钱跟后面的环保内容不符。而且本身应该就是用最少钱达到表现的意思,比如移动设备。
真实不懂技术哦。
如果真的把编程当成一门艺术(不考虑时间去打磨)的话真的可以考虑只用c/c++,这么多语言也完全可以分工合作就像c++代码本身也可以嵌入asm语句一样。
a)越接近底层会为效率性能更多考虑c/c++
b)业务复杂并且量很大会考虑java/.net[个人觉得.net不适合长期使用]
c)接近前台并需要更快速开发考虑脚本python/ruby/php/…
d)开发自己用的一些小工具脚本则有更大的优势python/prel/ruby/…
确实如何选择都是有traceoff考虑的,但是,C++到底有多少所谓性能优势?考虑到开发效率的影响,我想,假设c++和java性能差异并不是数量级差异,选择java这类语言的可能性就会大得多。jit引入以后,C++的性能优势在急剧降低,为了这一点性能提升,采用生产力较为低下的C++是否明智?另一方面,C++某些时候表现得也并不是那么性能好及节省资源,STL::Map的性能比.net Dictionary低一个数量级,是我自己的体验。C++的准标准库Boost,况且不提它的功能丰富与否,体积居然超过1G,超过了.net framework至今所有版本的集合,真是匪夷所思。最后,性能问题应该整体考虑,光靠一个语言(而且性能还并不是绝对牛叉)估计也是没戏的。铁道部那订票网站,用C++改写估计还是那死样。
Apple 和 Google 对 LLVM 感兴趣主要还是 license 限制。当前阶段 GCC 的性能还是明显高于 LLVM。 LLVM 在 OpenCL 上的灵活性倒是比 GCC 要好。
另外效率方面,这里 native code VS. interpreted/JIT code 讨论的不光是性能(虽然也没什么可讨论的),还有功耗。
大师的总结和预言,学习之,忙活中应该找时间看看这些东东,起码看看将来可能要走的路;
当然我等俗人当下还是把手上的活做好,不管用何等工具c,c++,java,能发挥其7,8成功力了不得了。
现在pc机的运算速度都上百亿了. 再拿性能说事儿就有点太2了.
需要考虑电费的公司估计连1%都不到.
另外说到电费, 是不是应该把C++编译时费的电费也算进去?
其实C++最大的优点是跨平台.你用Java或C#做的程序只能在装过虚拟机的Windows和Linux下运行,反倒是用C++能运行的地方更多.
还有就是本身的各种烦人造成C++程序员的薪水普遍比其他程序员高.
加个外链试试私塾在线
过滤系统不错,能检测出来 私塾在线
现在还拿效率说事,那为啥不去用汇编呢。程序员的时间比机器的时间宝贵得多,现在硬件性能发展的这么快。要真看重效率,好好研究算法和编译器才是王道。
軟體上是哪一種都無所謂,不過工業上用到的大部分都是C…C++可能會有一點,不過C才是佔最多數的…哈哈
顺序型语言都差不多吧
迷信跨平台
跟着博主就是有前途啊
写了一篇文章反对这里的一些观点,希望能和博主讨论,呵呵
http://www.crazyhotice.com/2012/02/%E4%B9%9F%E8%B0%88c/
博主。最近好吗?
跟着博主一起努力学习C++,呵呵
看了那么多评论,这句甚合我心。
第一,运算上百亿次的这种PC,你可以去打听打听价格
第二,不考虑性能?您真牛,我想你做出来的东西肯定能抗每秒上万次,上十万次的请求吧
第三, C++的可移植性好?oh my god,java所谓的可移植性可以去死了。
第四, 像google, baidu这样使用集群的来说,一些优化每年可以省几百万美元电费的案例还是有的,
综上,你完全在门外@和工业
额,我正在学呢
现在该行学易语言了
看来学C++才是王道啊
顶一个
跨平台能力第一的是C,当之无愧。谁能举例说明哪个操作系统+arch组合是没有C runtime的?
c++是真正的王者,有很多因素给人以其他导向,但最终c++还是要回来。
The Return Of the King 事物我进化最终也离不开本源。
最适用的才是最好的。
赞博主
@Ricepig
std::map是红黑树,.Net的Dictionary是哈希表,要比应该和同是hash表的std::unordered_map比。
boost编译时产生的中间文件有1G,但是最终的DLL只有几十M.
“效率不仅仅只是跑得,跑得多,更是可以使用更少的资源。”应该中间少了一个“快”字。Efficiency is not just running fast or running bigger programs
都什么年代了,还拿那点运行效率说事;程序员的大好青春,不能都耗费在学C++上吧?
编程语言貌似只是编程活动中最简单那部分, 就在本来最简单的地方搞出x多的复杂,x多的纠结,坑爹呢?
C++谈不上王者,不过是一门, 过分的复杂,过分的被吹捧的编程语言.
一味的神吹C++,坑了多少无知的孩子了…
c++可以写页面的吗?我不知道诶
C++3D程序一枚,其他的语言也会点儿。
我觉得未来的几年内,如果纯为了混个工资,学学Objective-c, java, javascript性价比可能会比较高。
要是真把编程当兴趣,精力投入到哪种语言或平台上都值,包括.net。
抱死一门语言、一种平台的都比较危险,尤其结了婚,有房贷,生了娃的。
选语言就跟选对象一样,没有最好的,只有最合适的。如果能一块找俩。。。你们懂得。。。
争论这些有什么意思啊,单纯搞技术就是追求那些奇淫技巧,我倒建议陈皓先生应该多讲讲中国特色软件开发环境如何,跟美国有什么差距。没有任何一项技术可以孤零零地一直辉煌,只有通过把技术融入事业,融入到企业发展中,才是正确的发展。
我讨厌孤零零的谈论什么语言优劣,什么语言的一些细节东西。
我觉得陈皓应该多说说国内那些企业,比如一流的,腾讯百度开发环境如何,二流的如中兴华为开发环境如何。
明白这些,比过多的了解语言细节,技术细节是强多的。
对于计算机底层的语言,其效率及性能还是相当有优势的,而且现在c 或 c++ 的需求量远远没有降低啊
java和.net真的比c++开发快吗?我怎么从来没有体会过呢。
尤其是对于代码超过10000行的系统。
有谁有这方面的经验吗、
当需求为效率,灵活,抽象,生产率时,可以考虑c+python的组合呀,两者取长补短,相比较c++就没优势咯,何必非要执着于一门语言呢? 精通c、python两门语言花的时间也少过c++太多了。
试下go 吧,估计比C++ 好,C++的语言设计实在让人不敢恭维啊
不排除语言的设计问题,但是你先看看这个世界中的实际应用。