java/Python这么火,c++这么难,为什么我们还要选择用C++?
一、为什么我们还要选择用C++
C++ 可算是一种声名在外的编程语言了。这个名声有好有坏,从好的方面讲,C++ 性能非常好,哪个编程语言性能好的话,总忍不住要跟 C++来单挑一下;从坏的方面讲,它是臭名昭著的复杂、难学、难用。
不管说 C++ 是好还是坏,不可否认的是,C++仍然是一门非常流行且非常具有活力的语言。继沉寂了十多年,并终于发布语言标准的第二版——C++11——之后,C++以每三年一版的频度发布着新的语言标准,每一版都在基本保留向后兼容性的同时,提供着改进和新功能。
C++ 程序员应该都听到过下面这种说法:
C++ 是一门多范式的通用编程语言。
多范式,是因为 C++ 支持面向过程编程,也支持面向对象编程,也支持泛型编程,新版本还可以说是支持了函数式编程。同时,上面这些不同的范式,都可以在同一项目中组合使用,这就大大增加了开发的灵活性。因此,C++ 适用的领域非常广泛,小到嵌入式,大到分布式服务器,到处可以见到 C++ 的身影。
下面是一些知名的用到 C++ 的场合:
-大型桌面应用程序(如 Adobe Photoshop、Google Chrome 和 Microsoft Office)
-大型网站后台(如 Google 的搜索引擎)
-游戏(如 StarCraft)和游戏引擎(如 Unreal 和 Unity)
-编译器(如 LLVM/Clang 和 GCC)
-解释器(如 Java 虚拟机和 V8 JavaScript 引擎)
-实时控制(如战斗机的飞行控制和火星车的自动驾驶系统)
-视觉和智能引擎(如 OpenCV、TensorFlow)
-数据库(如 Microsoft SQL Server、MySQL 和 MongoDB)
有些朋友可能会觉得,这些应用场景似乎和平时的开发场景有点远啊!你的感觉是对的。有些传统上使用 C++ 的场合现在已经不一定使用 C++,最典型的是个人电脑上的桌面应用。以前 Windows 下开发桌面应用常常用 MFC,微软的 C++ 框架,而现在我估计听说过 MFC 的程序员都不多吧。目前很流行的 Visual Studio Code 主要是用 TypeScript 写的,不是 C++。而我自己也用 C# 写过桌面应用,不过界面逻辑之外的计算和处理仍然是用一个 C++ 的 DLL 来完成。典型情况是,需要性能的组件用 C++ 来写,整个应用程序融合多种不同的语言。
前面我提到了, C++ 的传统领域有被侵蚀的风险,那是因为和它相竞争的语言远远不止一个,可以说是上下夹攻。
-如果专注性能和最小内存占用的话,C 仍然是优选——嵌入式领域用 C 非常多,而 Linux 也是用纯 C 写的。
-如果专注抽象表达和可读性的话,那 Python 之类的脚本语言则要方便得多。
-图形界面(GUI)编程传统上是 C++ 的地盘,但近年来 C# 和 JavaScript 占领了很大一部分市场。
-游戏算是 C++ 的经典强项了,但有了 C++ 写的游戏引擎,游戏用 C# 写也没啥问题了——你可能不一定知道,Unity 游戏引擎上的优选开发语言是 C#,而王者荣耀是用什么游戏引擎呢?答案正是 Unity——所以王者荣耀可以认为是用 C# 开发的。
-还有,Go 和 Rust 也加入了战团,对 C++ 形成了一定的竞争……
不过,真是这样吗?我们需要回到 C++ 的核心竞争力上来看一下。
抽象能力:意味着较高的开发效率,同时,更重要的是,不会因抽象而降低性能。
性能:这不用多说了,就是快并且占用资源少。
功耗:这是近年来我们越来越关注的问题,跟性能直接相关,性能好了功耗自然就低。
计算机在发明的初期,价格奇高,而性能拿今天的标准来看却是极低的,自然不能不关注性能。慢慢地,计算机的性能“足够”了,性能似乎也就不那么重要了,脚本语言于是也有了用武之地。而随着移动设备的普遍使用,大量设备用电池供电而不接电源了,功耗就逐渐成了我们大家关注的大问题。因此,即使主流移动平台的开发语言不是 C++——而是 Java 和 Objective-C 或 Swift——但任何性能要求高的应用,都几乎必然会用到 C++ 开发的组件。
同时,移动设备要联网,也大大刺激了服务器的增加。在服务器端,虽然没有电池电量的问题,但有着服务器集群的供电问题、空调问题、需要的服务器数量问题等,因而 C++ 的使用也是非常广泛的。前面说到了王者荣耀的客户端是用 Unity + C# 开发的,但我没有说王者荣耀的服务器端——那可还是用 C++ 开发的。另外,有一点我前面还藏着呢!虽然王者荣耀初期是纯用 Unity 开发的,没有用到 C++;但后来,腾讯又用 C++ 把游戏的逻辑部分独立成了一个 GameCore,进一步提高了性能 。
目前,跟 C++ 定位差不多、能有直接竞争关系的,也就是既支持高度抽象、又追求高性能的通用编程语言,其实只有 Rust 一种。而 Rust 远没有达到跟 C++ 一样的成熟和普及程度。这也可以从 TIOBE 的排名看出来:C++ 是第 4 位,而 Rust 是第 25 位 。
另外,和 C 的兼容性,也是 C++ 的一大优势。虽然现在很多大型程序都混杂了多种语言,但在小项目里,减少语言的数量可以简化开发和部署。前不久,我在 Python 里做了一些加解密运算,发现使用的第三方库性能仍不够高,虽然它已经用了 C 开发的加解密引擎。所以,我找了用 C 写的高性能加解密代码,然后使用 pybind11 库 ,只手写了一百来行的 C++11 代码,就把性能又提高了几倍。
延伸阅读:
二、如何学习 C++
作为很多聪明人使用过的语言,C++ 在某些场合也可能被用来炫技,写出除了本人之外谁都看不懂的高抽象代码。这恰恰是 Bjarne 想努力抵制的方向。他想让 C++ 对初学者变得更为友好,也明确提出过,他不希望 C++ 是一种让人们耍机灵的语言,而是一种让人们更易于使用的语言 。
这同样也是本专栏的一个目标:我希望你能把 C++ 当作一种实用的语言,能用它写出抽象但自然的代码,而非佶屈聱牙、难以卒读的那种。希望我 30 年的 C++ 经验能够给你一点帮助。
学习 C++ 语言就像学一门活跃使用中的外语,你不要期望能够掌握所有的单词和语法规则——那对于世界上 99.999999% 的人来说是不可能的。但语言是服务于人的,语法规则也是服务于人的,是为了让人们能够更好地沟通和表达。虽然 C++ 的每一个新标准都是让语言从定义和规则的角度变得更复杂,但从用法上来说,新标准允许人们能够更简单地表达自己的计算意图。跟学外语一样,我们需要的是多看多写,掌握合适的“语感”,而不是记住所有的规则。
**Bjarne 有一个洋葱理论:**抽象层次就像一个洋葱,是层层嵌套的。如果想用较低的抽象层次表达较高的概念,就好比一次切过了很多层洋葱,你会把自己的眼泪熏出来的。与这个思路相反,教 C++ 往往有一种不好的倾向,从那些琐碎易错的底层教起,自底向上,使得学生常常在尚未领悟到抽象的真谛之前就已经被 C++ 的复杂性吓翻,从入门到放弃;或者,在学了基本的 C 语法和 class 之后就满足了,错过了高级抽象带来的全新境界。他主张学习应当自顶向下,先学习高层的抽象,再层层剥茧、丝丝入扣地一步步进入下层。如果一次走太深的话,挫折可能就难免了。
猜你喜欢LIKE
相关推荐HOT
更多>>分析型数据库是什么,和关系型数据库有什么区别?
一、分析型数据库分析型是从数据库的作用来划分的,其重点用来做数据分析(OLAP),大量都是select语句。还有一种是专门用来做事务处理的,一般...详情>>
2023-10-17 23:26:16python self是什么意思,怎么使用?
一、python self介绍首先明确的是self只有在类的方法中才会有,独立的函数或方法是不必带有self的。self在定义类的方法时是必须有的,虽然在调...详情>>
2023-10-17 21:24:11创建Project提交到Github需要做什么?
一、创建Project提交到Github需要做什么1、在Github新建一个repository。2、打开编译器,编辑最外面的.gitignore,如果没有就新建一个这样的文件...详情>>
2023-10-17 20:23:50C/S和B/S架构的工作原理及优缺点?
一、C/S架构的工作原理C/S 架构中客户端和服务器之间通过网络连接进行通信,客户端发送请求后会等待服务器返回响应,直到收到响应后才能显示给...详情>>
2023-10-17 19:43:01热门推荐
Web前端开发是什么技术?
沸分析型数据库是什么,和关系型数据库有什么区别?
热对数量庞大的照片进行分类管理,较好的方便检索的方法是什么?
热web前端会用到哪些软件工具?
新Flash动画制作的原理是什么?
java/Python这么火,c++这么难,为什么我们还要选择用C++?
app开发的制作为什么报价和开发周期都不一样?
python self是什么意思,怎么使用?
什么是SEO?
PHP中的interface有什么用处?
创建Project提交到Github需要做什么?
为什么SwiftUI用struct来表示view?
C/S和B/S架构的工作原理及优缺点?
Flash为什么被淘汰了?