1. 程式人生 > 其它 >2021年,學習C++還香嗎?(文末贈書)!

2021年,學習C++還香嗎?(文末贈書)!

眾所周知C++難學難精,Java難道不香嗎?我們為什麼還要學習C++折磨自己?


上面的程式碼就是C++,不論真偽,C++確實不易維護,能看懂別人寫的C++程式碼,著實有點困難。Java其實也挺難學的,它只是跟C++難的不在一個點上,C++難的是語言本身,Java難的是各種框架、庫。

既然都難,那我們為什麼不選個效能王者?要知道,3種主流的作業系統Windows、Linux、Unix核心部分也都是用C++和彙編寫的。

C++的難其實也有好處,市場上這類人才很稀缺。Java雖說也是需求量不小,但想找到個不錯的Java開發者還是可以的,反觀C++,就難了,這恰恰就是我們的增值點。看看各大廠在招聘C++研發、開發工程師時給出的薪資就能感覺到。

01

C/C++當前的應用領域

C++在傳統上很強勢的領域中依然具有統治地位,譬如伺服器端開發、遊戲開發、嵌入式軟體開發、基礎設施和超大型軟體應用領域。

1.我們目前見到的各種桌面應用軟體,尤其是Windows桌面軟體,例如QQ、安全類防毒類軟體、瀏覽器等。

2.一些基礎軟體和高階語言的執行時環境,例如大型資料庫軟體、Java虛擬機器、C#的CLR、Python編譯器和執行時環境等。

3.業務型應用軟體的後臺,例如大型網路遊戲的服務端和一些企業內部的應用系統等。

通常情況下,我們可以將C++看作C語言的一個超集。C++雖然從功能層面來看,離C語言越來越“遠”,但從語法層面來看,其大多數語法與C語言基本一致。

對於C++面向物件的特性,如果仔細探究的話,我們會發現C++類方法的具體語法還是C語言的過程式語法,雖然這種現狀正在不斷改變。

C語言目前主要用於作業系統類偏底層的應用開發,比如Windows、Linux這樣的大型商業作業系統,以及嵌入式作業系統、嵌入式裝置。

有些開源軟體也會選擇C語言進行開發,主要是考慮程式執行效率和生成的可執行檔案的體積(C程式碼生成的可執行檔案體積相對較小),當然,其中不乏一些歷史技術選型的原因,比如Redis、libevent、Nginx等。

在將高階語言翻譯成機器二進位制碼時,C++編譯器生成了大量的額外機器碼,而這種機器碼相對於C語言來說不是必需的。

例如,對於一個C++類的例項方法,編譯器在生成這個方法的機器碼時,會將函式的第1個引數設定為物件的this指標地址,以此來實現物件與函式的繫結。正因如此,許多開發者都會優化和調整編譯器生成的彙編程式碼。

02

C++與作業系統

雖然Java、Python等的SDK或執行時環境最終也會呼叫作業系統API,但其自帶的SDK或者執行時環境都提供了常見的作業系統功能。而C++的執行時環境一般是作業系統自身,因此C++是離作業系統更近的一種程式語言,執行效率更高。

但是,C++的整套語法不具備“功能完備性”,在大多數情況下,單純地使用其本身提供的功能無法創建出任何有意義的程式,還必須藉助作業系統API來實現。

例如,C++本身不直接提供網路通訊功能的SDK,必須藉助作業系統提供的套接字API才能實現網路通訊;而對於Java來說,JDK自帶的java.net、java.io等包則提供了完整的網路通訊功能。

所以,熟悉作業系統相關原理和API是用好C++的前提,這也是C++難學、對新手不友好的主要原因之一。

不過,隨著C++標準和版本的不斷迭代,這種現狀正在改變:在C++標準庫中引入了越來越多的功能,避免直接呼叫作業系統API。

不管怎樣,應用直接使用作業系統API,程式執行效率高,控制力度大,開發能力僅僅限制於作業系統本身,這是 C++的優勢之一。比如對於 Java,假設作業系統提供了某個功能,但Java虛擬機器不提供該功能,則開發人員也無法使用該功能。

程式設計大師Charles Petzold曾說過:作業系統是一個非常複雜的系統,在API之上加一層程式語言並不能消除其複雜性,最多將複雜性隱藏起來而已,而懂得系統API能讓我們更快地掙脫困境。

03

如何學好C++和後端開發

學好C/C++體系的技術棧必須結合作業系統的執行機制來學習。展開來說,就是你必須掌握作業系統層面的幾大基礎知識:

▓第一個基礎知識是彙編。

▓第二個基礎知識是編譯、連結與執行時體系知識。

▓第三個基礎知識是狹義的作業系統原理。

▓第四個基礎知識是多執行緒知識。

▓第五個是網路程式設計,直白地說就是 Socket 程式設計。

————————————

首先,應該打好基礎。我們要熟練使用C++,還要結合具體的作業系統學習C++,熟悉某作業系統的API函式,以及與系統API關聯的各類技術,比如各種程序與執行緒函式、多執行緒資源同步函式、檔案操作函式、系統時間函式、記憶體分配與管理函式、網路程式設計、PE或ELF檔案的編譯、連結原理等。

如果已打好基礎,就可以找一些高質量的開源專案去實戰。最好找一些沒有複雜業務的開源專案,或者是自己熟悉其業務的開源專案(如IM系統)。如果不熟悉其業務,那麼不但要學習其業務(軟體功能),還要學習其原始碼,最終兩者難以兼顧。

因此,在學習這些專案之前,應該先確定自己的學習目的。如果學習目的是學習和借鑑這款軟體的架構設計,那麼建議先進行整體把握,不要一開始就迷失在細枝末節中,這叫作“粗讀”。如果學習目的是學習開源軟體在一些細節上的處理方法,那麼可以有針對性地閱讀自己感興趣的模組,深入每一行程式碼。當然,學習適合自己當前階段的專案原始碼才是最好的。

學習的過程一般是接觸、熟悉、模仿、創造。不管對什麼開源專案,在沒有任何思路或者解決方案時,我們都應該先接觸、熟悉、不斷模仿,做到至少心中有一套對某場景的解決方案,再來談創新、批判及改造。

總之,C++是一門講究深度的程式語言,其“深度”不體現在掌握多少C++語法,而在於是否熟悉所寫的C++程式碼背後的系統原理,這是需要長期積累的,當然,一旦學成,就可以快速學習其他程式語言和框架。

——————————————

- END -

不管你是轉行也好,初學也罷,進階也可,如果你想學程式設計,進階程式設計師~

【值得關注】我的 程式設計學習交流俱樂部!【點選進入】

C語言入門資料(網盤連結免費分享):


C語言推薦書籍(PDF免費分享):