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:16
python 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:50
C/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為什么被淘汰了?
技術干貨






