當(dāng)前位置:首頁 > 公眾號(hào)精選 > C語言與CPP編程
[導(dǎo)讀]不論是學(xué)Java還是學(xué)C,我們的目的都是為了進(jìn)BAT等大廠。眾所周知C難學(xué)難精,Java難道不香嗎?我們?yōu)槭裁催€要學(xué)習(xí)C折磨自己?上面的代碼就是C,不論真?zhèn)危珻確實(shí)不易維護(hù),能看懂別人寫的C代碼,著實(shí)有點(diǎn)困難。Java其實(shí)也挺難學(xué)的,它只是跟C難的不在一個(gè)點(diǎn)上,C難的是語言本身,...

不論是學(xué)Java還是學(xué)C ,我們的目的都是為了進(jìn)BAT等大廠。

眾所周知C 難學(xué)難精,Java難道不香嗎?我們?yōu)槭裁催€要學(xué)習(xí)C 折磨自己?

上面的代碼就是C ,不論真?zhèn)?,C 確實(shí)不易維護(hù),能看懂別人寫的C 代碼,著實(shí)有點(diǎn)困難。Java其實(shí)也挺難學(xué)的,它只是跟C 難的不在一個(gè)點(diǎn)上,C 難的是語言本身,Java難的是各種框架、庫。既然都難,那我們?yōu)槭裁床贿x個(gè)性能王者?要知道,3種主流的操作系統(tǒng)Windows、Linux、Unix內(nèi)核部分也都是用C 和匯編寫的。

C 的難其實(shí)也有好處,市場上這類人才很稀缺。Java雖說也是需求量不小,但想找到個(gè)不錯(cuò)的Java開發(fā)者還是可以的,反觀C ,就難了,這恰恰就是我們的增值點(diǎn)??纯锤鞔髲S在招聘C 研發(fā)、開發(fā)工程師時(shí)給出的薪資就能感覺到。

01C/C 當(dāng)前應(yīng)用領(lǐng)域C 在傳統(tǒng)上很強(qiáng)勢的領(lǐng)域中依然具有統(tǒng)治地位,譬如服務(wù)器端開發(fā)、游戲開發(fā)、嵌入式軟件開發(fā)、基礎(chǔ)設(shè)施和超大型軟件應(yīng)用領(lǐng)域。

1.?我們目前見到的各種桌面應(yīng)用軟件,尤其是Windows桌面軟件,例如QQ、安全類殺毒類軟件、瀏覽器等。

2. 一些基礎(chǔ)軟件和高級語言的運(yùn)行時(shí)環(huán)境,例如大型數(shù)據(jù)庫軟件、Java虛擬機(jī)、C#的CLR、Python編譯器和運(yùn)行時(shí)環(huán)境等。

3. 業(yè)務(wù)型應(yīng)用軟件的后臺(tái),例如大型網(wǎng)絡(luò)游戲的服務(wù)端和一些企業(yè)內(nèi)部的應(yīng)用系統(tǒng)等。

通常情況下,我們可以將C 看作C語言的一個(gè)超集。C 雖然從功能層面來看,離C語言越來越“遠(yuǎn)”,但從語法層面來看,其大多數(shù)語法與C語言基本一致。對于C 面向?qū)ο蟮奶匦?,如果仔?xì)探究的話,我們會(huì)發(fā)現(xiàn)C 類方法的具體語法還是C語言的過程式語法,雖然這種現(xiàn)狀正在不斷改變。

C語言目前主要用于操作系統(tǒng)類偏底層的應(yīng)用開發(fā),比如Windows、Linux這樣的大型商業(yè)操作系統(tǒng),以及嵌入式操作系統(tǒng)、嵌入式設(shè)備。有些開源軟件也會(huì)選擇C語言進(jìn)行開發(fā),主要是考慮程序執(zhí)行效率和生成的可執(zhí)行文件的體積(C代碼生成的可執(zhí)行文件體積相對較?。?,當(dāng)然,其中不乏一些歷史技術(shù)選型的原因,比如Redis、libevent、Nginx等。

在將高級語言翻譯成機(jī)器二進(jìn)制碼時(shí),C 編譯器生成了大量的額外機(jī)器碼,而這種機(jī)器碼相對于C語言來說不是必需的。例如,對于一個(gè)C 類的實(shí)例方法,編譯器在生成這個(gè)方法的機(jī)器碼時(shí),會(huì)將函數(shù)的第1個(gè)參數(shù)設(shè)置為對象的this指針地址,以此來實(shí)現(xiàn)對象與函數(shù)的綁定。正因如此,許多開發(fā)者都會(huì)優(yōu)化和調(diào)整編譯器生成的匯編代碼。?

02C 與操作系統(tǒng)雖然Java、Python等的SDK或運(yùn)行時(shí)環(huán)境最終也會(huì)調(diào)用操作系統(tǒng)API,但其自帶的SDK或者運(yùn)行時(shí)環(huán)境都提供了常見的操作系統(tǒng)功能。而C 的運(yùn)行時(shí)環(huán)境一般是操作系統(tǒng)自身,因此C 是離操作系統(tǒng)更近的一種編程語言,執(zhí)行效率更高。

但是,C 的整套語法不具備“功能完備性”,在大多數(shù)情況下,單純地使用其本身提供的功能無法創(chuàng)建出任何有意義的程序,還必須借助操作系統(tǒng)API來實(shí)現(xiàn)。例如,C 本身不直接提供網(wǎng)絡(luò)通信功能的SDK,必須借助操作系統(tǒng)提供的套接字API才能實(shí)現(xiàn)網(wǎng)絡(luò)通信;而對于Java來說,JDK自帶的java.net、java.io等包則提供了完整的網(wǎng)絡(luò)通信功能。所以,熟悉操作系統(tǒng)相關(guān)原理和API是用好C 的前提,這也是C 難學(xué)、對新手不友好的主要原因之一。

不過,隨著C 標(biāo)準(zhǔn)和版本的不斷迭代,這種現(xiàn)狀正在改變:在C 標(biāo)準(zhǔn)庫中引入了越來越多的功能,避免直接調(diào)用操作系統(tǒng)API。

不管怎樣,應(yīng)用直接使用操作系統(tǒng)API,程序執(zhí)行效率高,控制力度大,開發(fā)能力僅僅限制于操作系統(tǒng)本身,這是 C 的優(yōu)勢之一。比如對于 Java,假設(shè)操作系統(tǒng)提供了某個(gè)功能,但Java虛擬機(jī)不提供該功能,則開發(fā)人員也無法使用該功能。

編程大師Charles Petzold曾說過,操作系統(tǒng)是一個(gè)非常復(fù)雜的系統(tǒng),在API之上加一層編程語言并不能消除其復(fù)雜性,最多將復(fù)雜性隱藏起來而已,而懂得系統(tǒng)API能讓我們更快地掙脫困境。?

03如何學(xué)好C 和后端開發(fā)學(xué)好?C/C ?體系的技術(shù)棧必須結(jié)合操作系統(tǒng)的運(yùn)行機(jī)制來學(xué)習(xí)。展開來說,就是你必須掌握操作系統(tǒng)層面的幾大基礎(chǔ)知識(shí):

  • 第一個(gè)基礎(chǔ)知識(shí)是匯編。

  • 第二個(gè)基礎(chǔ)知識(shí)是編譯、鏈接與運(yùn)行時(shí)體系知識(shí)。

  • 第三個(gè)基礎(chǔ)知識(shí)是狹義的操作系統(tǒng)原理。

  • 第四個(gè)基礎(chǔ)知識(shí)是多線程知識(shí)。

  • 第五個(gè)是網(wǎng)絡(luò)編程,直白地說就是 Socket 編程。

首先,應(yīng)該打好基礎(chǔ)。我們要熟練使用C ,還要結(jié)合具體的操作系統(tǒng)學(xué)習(xí)C ,熟悉某操作系統(tǒng)的API函數(shù),以及與系統(tǒng)API關(guān)聯(lián)的各類技術(shù),比如各種進(jìn)程與線程函數(shù)、多線程資源同步函數(shù)、文件操作函數(shù)、系統(tǒng)時(shí)間函數(shù)、內(nèi)存分配與管理函數(shù)、網(wǎng)絡(luò)編程、PE或ELF文件的編譯、鏈接原理等。

如果已打好基礎(chǔ),就可以找一些高質(zhì)量的開源項(xiàng)目去實(shí)戰(zhàn)。最好找一些沒有復(fù)雜業(yè)務(wù)的開源項(xiàng)目,或者是自己熟悉其業(yè)務(wù)的開源項(xiàng)目(如IM系統(tǒng))。如果不熟悉其業(yè)務(wù),那么不但要學(xué)習(xí)其業(yè)務(wù)(軟件功能),還要學(xué)習(xí)其源碼,最終兩者難以兼顧。

因此,在學(xué)習(xí)這些項(xiàng)目之前,應(yīng)該先確定自己的學(xué)習(xí)目的。如果學(xué)習(xí)目的是學(xué)習(xí)和借鑒這款軟件的架構(gòu)設(shè)計(jì),那么建議先進(jìn)行整體把握,不要一開始就迷失在細(xì)枝末節(jié)中,這叫作“粗讀”。如果學(xué)習(xí)目的是學(xué)習(xí)開源軟件在一些細(xì)節(jié)上的處理方法,那么可以有針對性地閱讀自己感興趣的模塊,深入每一行代碼。當(dāng)然,學(xué)習(xí)適合自己當(dāng)前階段的項(xiàng)目源碼才是最好的。

學(xué)習(xí)的過程一般是接觸、熟悉、模仿、創(chuàng)造。不管對什么開源項(xiàng)目,在沒有任何思路或者解決方案時(shí),我們都應(yīng)該先接觸、熟悉、不斷模仿,做到至少心中有一套對某場景的解決方案,再來談創(chuàng)新、批判及改造。

總之,C 是一門講究深度的編程語言,其“深度”不體現(xiàn)在掌握多少C 語法,而在于是否熟悉所寫的C 代碼背后的系統(tǒng)原理,這是需要長期積累的,當(dāng)然,一旦學(xué)成,就可以快速學(xué)習(xí)其他編程語言和框架。


說了這么多,再給大家強(qiáng)烈推薦一本學(xué)習(xí)C 的新書《C 服務(wù)器開發(fā)精髓》,作者是有著多年高性能高并發(fā)服務(wù)開發(fā)經(jīng)驗(yàn)的張遠(yuǎn)龍老師。這本書正是一本可以幫你成為 C/C 技術(shù)棧熟練工的書。聽說這本書京東還沒到貨就已經(jīng)預(yù)售出2000冊,到貨直接登頂京東計(jì)算機(jī)圖書TOP1。

我也和電子工業(yè)出版社楊老師給大家申請到了3本贈(zèng)書,大家可以通過XXXXXX參與抽獎(jiǎng)。

當(dāng)然也一并給大家申請了5折包郵的粉絲福利價(jià)!原價(jià)168元,現(xiàn)在半價(jià)84元直接入手!要知道這可是有700多頁干貨的大部頭,等不及的朋友可以掃碼或者點(diǎn)擊閱讀原文直接下單


最后如何送書


此次朋友圈點(diǎn)贊送書,全靠運(yùn)氣,2021 年 8 月21 號(hào)晚 8 點(diǎn)朋友圈點(diǎn)贊順序?yàn)?8、38、68、98、128、158、188、218 的 8 位小伙伴各送一本《C 服務(wù)器開發(fā)精髓》。添加下面微信好友,參加送書活動(dòng)。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉