因为又有人邀请我去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”看看。另外,该视频的讲议可以在这里下载

原文网址:http://coolshell.cn/articles/6548.html

对编程语言的需求总结为四个:效率,灵活,抽象,生产率(C++玩的是前三个,Java和C#玩的是后两个)的更多相关文章

  1. C++ 王者归来:对编程语言的需求总结为四个:效率,灵活,抽象,生产率(C++玩的是前三个,Java和C#玩的是后两个)

    Why C++ ? 王者归来(转载) 因为又有人邀请我去Quora的C2C网站去回答问题去了,这回是 关于 @laiyonghao 的这篇有点争议的博文<2012 不宜进入的三个技术点>A ...

  2. 少儿编程崛起?2020年4月编程语言排名发布——Java,C,Python分列前三,Scratch挤进前20

    前三并没有什么悬念,依然是Java,C,Python.C与Java的差距正在缩小,不过我们不用担心,在大数据分析领域Java,Python依然都是不可或缺的. 基于图形的基于块的编程语言Scratch ...

  3. 苹果新的编程语言 Swift 语言进阶(四)--字符串和收集类型

    一.字符串( String  )和字符类型(Character) 字符串是一种字符的带次序的收集类型(相当于数组),字符是字符串中的元素. 在Swift 语言中,字符串是编码独立的Unicode字符的 ...

  4. How Javascript works (Javascript工作原理) (十四) 解析,语法抽象树及最小化解析时间的 5 条小技巧

    个人总结:读完这篇文章需要15分钟,文章介绍了抽象语法树与js引擎解析这些语法树的过程,提到了懒解析——即转换为AST的过程中不直接进入函数体解析,当这个函数体需要执行的时候才进行相应转换.(因为有的 ...

  5. SQL注入之Sqli-labs系列第三十四关(基于宽字符逃逸POST注入)和三十五关

    开始挑战第三十四关和第三十五关(Bypass add addslashes) 0x1查看源码 本关是post型的注入漏洞,同样的也是将post过来的内容进行了 ' \ 的处理. if(isset($_ ...

  6. Java基础-四要素之一《抽象》(接口)

    抽象的概念就是抽象出共同属性:成员变量和方法 定义抽象使用abstract关键字定义抽象类和方法 抽象类 abstract class 包含抽象方法的类,叫抽象类. 所以抽象类可以有private等多 ...

  7. 一次完整的HTTP请求所经历的7个步骤(前三步是浏览器工作,后四步是服务器工作)

    HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: 1. 建立TCP连接在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连 ...

  8. java保留小数后两位的四种写法

    package com.btzh.mis.house.utils; import java.math.BigDecimal;import java.math.RoundingMode;import j ...

  9. CDH下集成spark2.2.0与kafka(四十一):在spark+kafka流处理程序中抛出错误java.lang.NoSuchMethodError: org.apache.kafka.clients.consumer.KafkaConsumer.subscribe(Ljava/util/Collection;)V

    错误信息 19/01/15 19:36:40 WARN consumer.ConsumerConfig: The configuration max.poll.records = 1 was supp ...

随机推荐

  1. 数组在C++和java中的区别

    几乎所有的程序设计语言都支持数组.在C和C++中使用数组是很危险的.因为C和C++中的数组就是内存块.如果一个程序要访问其自身内存块之外的数组,或者在数组初始化之前使用它,都会产生难以预料的后果. j ...

  2. HDU1007 Quoit Design 【分治】

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  3. Java集合类具体解释

    假设您喜欢这些文章,欢迎点击此处订阅本Blog 集合类说明及差别 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Ma ...

  4. Windows下用C语言获取进程cpu使用率,内存使用,IO情况

      #ifndef PROCESS_STAT_H #define PROCESS_STAT_H   #ifdef __cplusplus extern “C” { #endif   typedef l ...

  5. Because the people who are crazy enough to think they can change the world, are the ones who do.

    Here's to the crazy ones. The misfits. The rebels. The troublemakers. The round pegs in the square h ...

  6. Linux中命令行编译java接口总是提示找不到符号的疑难杂症的解决

    今天学习java的接口,在linux的命令行下写代码练练手吧,啪啪啪一顿猛敲,写了一个接口UsbInserface,UDisk继承UsbInterface,写完了那就编译到bin目录呗. 当时写程序的 ...

  7. react.js 你应知道的9件事

    React.js 初学者应该知道的 9 件事   本文假定你已经有了一下基本的概念.如果你不熟悉 component.props 或者 state 这些名词,你最好先去阅读下官方起步和手册.下面的代码 ...

  8. apache的500错误是写到哪个文件里面

    apache的500错误是写到哪个文件里面

  9. asp.net微信开发第八篇----永久素材管理

    除了3天就会失效的临时素材外,开发者有时需要永久保存一些素材,届时就可以通过本接口新增永久素材. 最近更新,永久图片素材新增后,将带有URL返回给开发者,开发者可以在腾讯系域名内使用(腾讯系域名外使用 ...

  10. ViewState探索

    什么是 view state? View State是客户端状态管理重要机制之一.当页面PostBack(向服务器发送或获得数据)时,它能存储页面的值.ASP.NET把View State属性作为页面 ...