微信号:Huawei_eSDK

介绍:“华为开发者社区”是华为公司面向合作伙伴和开发者的技术分享交流平台,一站式提供汇聚资源.您可以第一时间了解华为内部资讯和动态,得到问题的解答,结识志同道合的技术同仁.

辩证看待 C++:后现代系统语言的选择

2017-01-12 17:30 华为开发者社区



C++ 简介


贝尔实验室的比雅尼·斯特劳斯特鲁普博士在 20 世纪 80 年代发明并实现了 C++。起初,这种语言被称作“C with Classes”(包含类的 C 语言),作为 C 语言的增强版出现。


随后,C++ 不断增加新特性。虚函数 (virtual function)、操作符重载 (operator overloading)、多重继承 (multiple inheritance)、模板 (template)、异常处理 (exception)、RTTI (Runtime type information)、名字空间 (namespace) 逐渐纳入标准。1998 年,国际标准组织 (ISO) 颁布了 C++ 程序设计语言的第一个国际标准 ISO/IEC 14882 : 1998,目前最新标准为 ISO/IEC 14882 : 2014。


C++ 这个语言最吸引人的地方有:


  • 强大的内存管理机制:这个是从 C 语言吸收过来的,这个可以让程序员自由操控任何内存,这个是 Java 比拟不了的,但是却带来了无穷无尽的内存泄露和越界的苦恼,但是这都是可以通过其他的手段解决(比如 RAII、 DDD、Smart Pointer 等);

    

  • 面向对象的特性:封装、继承和多态让 C++ 写出来的代码能让系统简单化、系统层次化和模块化。并且随着 OO 设计原则和设计模式的发展,让 C++ 可以写出更优美架构的代码;


  • 泛型编程:这个在 C++ 成为模板,但是这个泛型有人觉得是学术派的理论,实际用处不大,比如 Go 语言就没有泛型。但是泛型提高代码复用方面的确有很大的帮助。


哪些程序适合使用 C++?


  • 程序须尽量发挥硬件的最高性能,且性能瓶颈在于 CPU 和内存;

  • 程序须频繁地与操作系统或硬件沟通。


按应用领域来说,C++ 适用于开发服务器软件、桌面应用、游戏、实时系统、高性能计算、嵌入式系统等。


简单来说, 需要提升性能的地方都可以使用 C++。


C++ 的使用驱动力:

性能


1、C++ 的关注点:性能



C++ 注重效率、灵活和抽象,而 C 语言只注重效率,灵活;Java 和 C# 注重抽象和生产率。


性能就是钱: 我们一般从三个方面来描述:


  • 耗电,移动设备的耗电量,家用电脑的耗电量都和钱有关系;

  • 资源,家用电脑和移动设备上的处理器资源有限,因为要让一般消费者买的起;

  • 体验,在更小的设备上会有更好的体验,有更好的体验就可以挣更多的钱。


2、C++ 为什么今天比前些年火了呢:性能



我们从 C++ 的进化发展来看,可以分为四个阶段:


  • 1979 年~1989 年:基于 C 语言的对象能力;

  • 1989 年~1999 年:C++ 强大的面向对象能力,STL 和 Boost 程序库的使用,泛型编程的使用使得 C++ 成为主流语言;

  • 1999 年~2009 年:Java 和 C# 语言的的出现,硬件价格下降,上层应用领域受到冲击;

  • 2009 年~至今:Native Code 的兴起,C++ 又开始受到关注,尤其是移动端。 主要原因还是由于追求性能,节约成本,创造更大的价值。


打拼市场的时候追求的是快速上线和高生产力,市场站稳以后就是要保证稳定性和高性能。


我们从业界程序的关注点可以看出:


  • 在 1970~ 1980 年,由于机器的资源不够,厂商的主要关注点还是节省性能;

  • 在 1980 ~ 1990 年,开始逐步追求抽象和生产率;

  • 在 1990 ~ 2010 年,机器性能越来越高,硬件价格越来越便宜,大家都在追求抽象和高生产率;

  • 在 2010 年后,随着云计算数据中心的兴起,移动客户端的流行,性能问题越来越严重。


3、业界 C++ 的发展


  • 移动客户端:刚开始的时候 iOS、Android 和 Windows Phone 都不支持 C++,后来第二版都支持 C++,就是为了提高一下性能。



  • Apple 和 Google:

Apple 和 Google 都在研究 C++ 编译器 LLVM, 因为 g++ 的架构和性能都不行, 现在更关注 Native Code 的性能,gcc4.9 开始以后也注意微架构的性能。


4、云平台数据中心的性能


为什么 Google、阿里云需要把数据中心都建在北极或者湖底,就是为了节省性能,降低降温的开销。对于数据中心的机房来说,最花钱的费用主要包括:(1)硬件购买和机房的构建;(2)降温处理;(3)电量消耗。这三个几乎占用数据中心 90% 的费用。


比如现在的阿里云、Google、推特、AWS 都是用 C++ 来实现的底层基础设施层,比如阿里的飞天云平台。无论上层使用多么弹性,多么高级的语言,基础设施层基本都是使用 C++ 这种高性能语言。


效率不仅仅是运行的快,运行更大的程序,更可以使用更少的资源。


5、C++ 致力于性能和抽象之间的平衡


在 C++2003 的时候,C++ 的开发效率还是比较低的,标准库里面没有多线程,没有正则表达式,没有类型推导,没有 FP 特性,没有智能指针,没有 hashmap 等等,只能使用一些开源的库来支持(比如 boost), 但是到了 C++11/C++14 以后,C++ 对于开发效率提升有显著的提高,提供了很多现代高级语言的特性:



C++ 真的是一门复杂的语言吗?


答案:是的,C++11 可以说是语言特性最多的语言之一。Scala 号称 JVM 上的 C++,也是有很多语言特性。


我们可以看一下语言特性:



标准库还包括下面的内容:



所以说,C++ 语言的语言特性的确很多,正如 Stroustrup 关于使用 C++ 各种语言特性的回应:“你可以做,不意味着你必须这么做(Just because you can do it, doesn't mean that you have to)” 就像你家里有一个工具箱,里面有很多工具,不用的时候你完全可以收起来,但是一旦你要使用的时候,如果没有这个工具,你就需要花费很多不要的精力去完成。所以不要被 C++ 或者 Scala 这么多的语言特性所吓倒。


也有很多人骂 C++ 的,比如 Linus:C++ 是一门很恐怖的语言,而比它更恐怖的是很多不合格的程序员在使用着它。


为什么有很多骂 C++ 的声音呢?


  • C++ 的确有一些不完美的地方,不过很多都是从 C 语言继承过来的,C++ 的标准委员会对于语言特性的添加太慢了;

  • 很多人不了解面向对象,对于面向对象不了解的人去使用 C++ 难怪会被别人骂了;

  • C++ 比较灵活,有些人喜欢秀自己,导致一些特性被滥用和误用。


不管怎么样,C++ 是一门卓越的语言,虽然不完美,但是只有我们真正去掌握 C++,才会发挥这个语言最大的价值,才能驾驭它,用好他。如果我们都不去深入了解这个语言,不了解 OO 思想,就去指责这个语言,这是不可取的一种态度。


人云亦云的语言之争


现在网络上大量的语言之争,OO 和 FP 之争,C++ 和 Java 之争,Go 和 Scala 之争,Java 和 C# 之争啊。 有时候这与争论只是为了一种广告推销的效果,但是有些程序员却特别热衷于争论某些语言,这些这些争论大部分时候都没有意义,只要我们抓住事情的本质,就不会被业界的各种观点所迷惑。


1、同一维度语言的争论:C VS C++ VS Rust


这三个语言代表了追求性能的系统编程语言,C 语言现在已经不满足时代要求,表达力太弱,不够抽象;C++ 目前来说是现阶段高性能系统编程语言的首选,尤其是 C++11;Rust 语言才刚开始发展,目前不好说,希望后面可以更好的发展。


C++ 由于背负了严重的 C 的历史包袱,有些很 ugly 的东西无法解决。所以还是希望后面出现一种真正能够颠覆 C++,但是必须保留 C++ 现有的有点,解除了 C++ 的历史包袱。


2、不同维度的语言:C++ 和 Go,Scala 和 Java 语言


C++ 和这些高级语言不在一个层面上,新型的语言为了提高开发效率损失了一部分性能,这是一个权衡,C++ 标准委员会也是一直在性能和其他特性之间做权衡,选择最适合 C++ 的语言特性。


所以如果你的程序可以损失一部分性能,那么推荐使用 Go/Scala/Java,这些可以显著提高开发效率。


总结


C++ 语言就是一门追求性能的语言,尤其在今天的 C++1z, 如果加入了 module system、 reflection 反射等特性,那么 C++ 除了是一门传统的系统编程语言,也具备了现代语言应有的特性,而且也有了很多的和正在进行的新的拓展。


所以,在云计算和物联网的今天,C++ 将会重获新生,尤其在数据中心基础设施,移动终端设备。


最后,喜欢 C++11 的赶紧切换到 C++11 吧, 你会发现代码写起来会方便。


注:部分内容整理于网络资源


往期精华文章   

微信公众号中回复数字查看更多精华文章:


回复【1】:技术干货

回复【2】:程序员幽默世界

回复【3】:物联网江湖

回复【4】:华为招聘

回复【5】:HDG 视频 + PPT 汇总

回复【6】:华为开发者大赛获奖作品展


 
华为开发者社区 更多文章 2017 年能力转型需要了解的技术栈 辩证看待 C++:后现代系统语言的选择 2017 年能力转型需要了解的技术栈 2017 年能力转型需要了解的技术栈 湖南广播电视台与华为深化战略合作,共同打造国内领先的全媒体云平台
猜您喜欢 EventMachine Tutorial Windows 下搭建 Hexo 博客并将其部署到 GitCafe 终极教程 运维人无聊了都会干这个? 亲情奉献:最简MVP框架 UCloud客户悠络客获亿元B轮融资 云计算助力新品“慧店”平台