為什么你覺得C語言什么都不能做,學(xué)了沒用?不可能的
對于大部分初學(xué)者,學(xué)習(xí)C語言的目的是希望做一名合格的程序員,開發(fā)出靠譜的軟件來。但是學(xué)了C語言的基本語法后,發(fā)現(xiàn)只能開發(fā)“黑底白字”的DOS程序,完全沒有漂亮的界面和生動(dòng)的交互。于是學(xué)數(shù)據(jù)結(jié)構(gòu),學(xué)算法,學(xué)操作系統(tǒng),越陷越深,越來越難,最后迷茫了,不知道學(xué)C語言能做什么,認(rèn)為學(xué)習(xí)編程很難,開始懷疑自己,甚至想放棄。
其實(shí),這是很多初學(xué)者都會(huì)踩到的一個(gè)坑!C語言本身是一門很簡單的語言,提供的實(shí)用功能不多,大部分要借助操作系統(tǒng)、第三方庫、單片機(jī)來完成。也就是說,只學(xué)C語言基本什么也做不了,也基本找不到工作。
C語言是一門通用性的語言,并沒有針對某個(gè)領(lǐng)域進(jìn)行優(yōu)化,在實(shí)際項(xiàng)目中,C語言主要用于較底層的開發(fā),例如:
- Windows、Linux、Unix 等操作系統(tǒng)的內(nèi)核90%以上都使用C語言開發(fā);
- 開發(fā)硬件驅(qū)動(dòng),讓硬件和操作系統(tǒng)連接起來,這樣用戶才能使用硬件、程序員才能控制硬件;
- 單片機(jī)和嵌入式屬于軟硬件的結(jié)合,有很多使用C語言的地方;
- 開發(fā)系統(tǒng)組件或服務(wù),用于支撐上層應(yīng)用;
- 編寫PHP擴(kuò)展,增強(qiáng)PHP的功能;
- 如果對軟件某個(gè)模塊(例如算法和搜索部分)的效率要求較高,也可以使用C語言來開發(fā)。
既然C語言的應(yīng)用這么多,為什么很多讀者覺得它什么也做不了呢?
我們先說一個(gè)概念,就是庫(Library)。庫就是編程專家寫好的代碼,我們可以拿來直接使用,這樣能夠節(jié)省開發(fā)成本,提高開發(fā)效率,并且?guī)齑a的執(zhí)行效率、嚴(yán)謹(jǐn)性、安全性和規(guī)范性要明顯優(yōu)于我們自己編寫的代碼,市場上有很多優(yōu)秀的庫,有的收費(fèi),有的免費(fèi),我們要善于利用這些庫,盡量不要重復(fù)造輪子。
庫一般分為兩種:
- 編程語言的開發(fā)者在開發(fā)編程語言的時(shí)候,一般都要預(yù)先寫好常用的代碼,或者說常用的功能,例如輸入輸出、數(shù)學(xué)計(jì)算、文件操作、網(wǎng)絡(luò)操作、日期時(shí)間、錯(cuò)誤處理、字符串處理等,這些由官方編寫的庫稱為標(biāo)準(zhǔn)庫(Standard Library),它們隨編程語言一起發(fā)布,可以認(rèn)識(shí)是編程語言的一部分。
- 有一些組織機(jī)構(gòu)或者個(gè)人也會(huì)開發(fā)一些庫,有的是為了盈利,有的是業(yè)余愛好,有的是本公司正在使用的代碼,開源出來造福人類,這些庫稱為第三方庫(Third-party Library)。
第三方庫不是由官方開發(fā),沒有質(zhì)量把控,良莠不齊,但是有相當(dāng)一部分也非常優(yōu)秀,已經(jīng)得到了大家的認(rèn)可,已經(jīng)應(yīng)用在大公司的項(xiàng)目開發(fā)中,這些庫能夠和標(biāo)準(zhǔn)庫媲美。
標(biāo)準(zhǔn)庫是我們在學(xué)習(xí)編程語言時(shí)就要一起學(xué)習(xí)的,例如C語言的輸入輸出、文件操作、日期時(shí)間、字符串處理、內(nèi)存管理等都是標(biāo)準(zhǔn)庫提供的功能,它們并不是C語言語法的內(nèi)容。
如果一門編程語言的標(biāo)準(zhǔn)庫強(qiáng)大,初學(xué)者經(jīng)過簡單的學(xué)習(xí)后就很容易開發(fā)出實(shí)用的項(xiàng)目。例如Java,它的標(biāo)準(zhǔn)庫包含了GUI(圖形界面)、圖形處理、網(wǎng)絡(luò)通信、網(wǎng)絡(luò)服務(wù)器、HTML解析、HTTP協(xié)議、多線程、多進(jìn)程、正則表達(dá)式、壓縮文件、加密解密、數(shù)據(jù)校驗(yàn)、音頻視頻處理、數(shù)據(jù)庫操作、XML操作等常用功能,初學(xué)者學(xué)了以后立馬就能夠開發(fā)網(wǎng)站、開發(fā)PC軟件,感覺很實(shí)用,也感覺學(xué)到了東西。Python、C#、VB、PHP、JavaScript、Ruby 等都是非常實(shí)用的語言,學(xué)了就能做出東西來。
反觀C語言,它的標(biāo)準(zhǔn)庫只有輸入輸出、文件操作、日期時(shí)間、數(shù)學(xué)計(jì)算等基本功能,都是在黑黑的控制臺(tái)下進(jìn)行的,跟網(wǎng)站、PC軟件、APP等八竿子打不著,所以初學(xué)者覺得C語言沒有用。
那么,C語言到底能不能開發(fā)網(wǎng)站、PC軟件或者APP呢?
C語言的標(biāo)準(zhǔn)庫肯定不能干這些事情啦,就得依靠第三方庫了,遺憾的是,C語言的第三方庫大都也是底層庫,支持應(yīng)用開發(fā)的庫寥寥無幾,只有一個(gè) GTK 庫能夠開發(fā)出 PC 軟件來,而沒有與網(wǎng)站開發(fā)和APP開發(fā)相關(guān)的庫。
GTK 庫在PC軟件開發(fā)中也很少用了,PC軟件開發(fā)已經(jīng)是 C++、C#、VB、Java、Delphi 的天下了。換句話說,開發(fā)PC軟件基本不使用C語言,而是使用 C++、C#、VB、Java、Delphi 等其它語言。
記住,C語言幾乎不用來做軟件、網(wǎng)站、APP等這些應(yīng)用層開發(fā),其它的編程語言能夠更好地完成任務(wù),沒必要非得使用C語言,C語言基本都是用來做底層開發(fā),也就是看不見摸不著的、在后臺(tái)默默提供服務(wù)的那些項(xiàng)目,而這樣的項(xiàng)目對初學(xué)者來說基本沒有實(shí)用價(jià)值,初學(xué)者也不知道它們該怎么使用。
初學(xué)者想要的C語言沒有,C語言能做的初學(xué)者用不到,就是這種矛盾導(dǎo)致初學(xué)者非常迷茫。
有人可能會(huì)問,C語言不是還可以用來開發(fā)單片機(jī)或者嵌入式嗎?是的沒錯(cuò),但是這個(gè)方向是軟硬件結(jié)合的,不是在我們的電腦上進(jìn)行開發(fā),而是在特殊的開發(fā)板上進(jìn)行開發(fā),并且還需要學(xué)習(xí)數(shù)字電路、模擬電路、匯編、ARM、Linux 等方面的知識(shí),只學(xué)C語言也沒有用武之地。
如果你覺得學(xué)了C語言沒用,那么恭喜你,你是對的,應(yīng)用層的開發(fā)一般真的用不上它。
但是,沒用也要學(xué),學(xué)習(xí)C語言并不一定是要應(yīng)用它,C語言可以夯實(shí)你的編程基礎(chǔ),尤其是數(shù)據(jù)結(jié)構(gòu)、算法、內(nèi)存、線程、進(jìn)程、通信、操作系統(tǒng)等底層的計(jì)算機(jī)知識(shí),沒有C語言基礎(chǔ)是學(xué)不好的。
這些底層知識(shí)并不一定能夠直接應(yīng)用在實(shí)際開發(fā)中,但是它們會(huì)讓你有底氣,會(huì)讓你透徹地理解編程概念,會(huì)讓你站的“低”看得遠(yuǎn),會(huì)讓你避免很多低級錯(cuò)誤,會(huì)讓你心中有“架構(gòu)師”的思維。不學(xué)C語言是碼農(nóng),學(xué)了C語言是程序員。
初學(xué)者必須C語言開始嗎?
建議從C語言開始,然后學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)、算法、內(nèi)存、線程、進(jìn)程、通信、操作系統(tǒng)等基本的概念,它們是學(xué)習(xí)編程的基礎(chǔ),不管是應(yīng)用層開發(fā)還是底層開發(fā),這些知識(shí)都是必須的。
如果你非要跳過C語言,從其他語言開始,比如 Java、Python、PHP、JavaScript、C# 等,也不是不可以;但是,在學(xué)習(xí)的過程中你會(huì)有一種霧里看花、空中樓閣的感覺,很多東西只會(huì)用,卻理解不了,深入不了,原因就是沒有計(jì)算機(jī)基礎(chǔ),沒學(xué)會(huì)走就想跑了,這個(gè)時(shí)候,還得老老實(shí)實(shí)回來學(xué)習(xí)C語言。
如何學(xué)習(xí)底層知識(shí)
關(guān)于數(shù)據(jù)結(jié)構(gòu)、算法、內(nèi)存、線程、進(jìn)程、通信、操作系統(tǒng)等這些基本的知識(shí),重要的是理解概念,知道計(jì)算機(jī)是怎么回事,千萬不要深入細(xì)節(jié),把自己繞進(jìn)去,耽誤一兩年的功夫,要盡早跳出來去做應(yīng)用開發(fā),找到興趣點(diǎn),獲得成就感。
這個(gè)時(shí)候,C語言主要的作用是讓你入門,了解編程語言的基本語法,強(qiáng)化編程思維,學(xué)習(xí)計(jì)算機(jī)底層知識(shí),為以后的職業(yè)生涯打下堅(jiān)實(shí)的基礎(chǔ),而不是用它來做實(shí)際開發(fā)。
在實(shí)際開發(fā)中,遇到問題,或者哪里理解不透了,可以再來回顧這些底層知識(shí),這個(gè)時(shí)候就可以深入細(xì)節(jié)了。因?yàn)橛辛藢?shí)際開發(fā)經(jīng)驗(yàn),再學(xué)習(xí)底層知識(shí)就知道哪里是重點(diǎn)了,不會(huì)像無頭的蒼蠅一樣亂飛,什么都學(xué)。
【拓展】C語言為什么沒有應(yīng)用層開發(fā)的庫
C語言是一門“古老”的語言了,它只支持面向過程編程,不支持面向?qū)ο缶幊毯头盒途幊?,在中大型的?yīng)用層項(xiàng)目開發(fā)中,C語言已經(jīng)顯得捉襟見肘了,C++、Java、Python、C# 等其他編程語言能夠更好地勝任,為C語言開發(fā)應(yīng)用層的庫簡直是費(fèi)力不討好,所以幾乎沒人這么做。
GTK 算是一個(gè)應(yīng)用層的庫,但是它也比較老了,新版的 GTK+ 已經(jīng)支持 C++ 了,不再僅僅支持C語言了。
我們先不管面向過程、面向?qū)ο?、泛型這些晦澀的編程概念,簡單地理解就是,C語言支持的特性少,用起來費(fèi)勁,開發(fā)效率低,而 C++、Java、Python、C# 等支持的特性多,用起來方便,開發(fā)效率高。
C語言的優(yōu)勢是運(yùn)行效率極高,這正是底層開發(fā)所看重的。底層開發(fā)有時(shí)候就是一個(gè)模塊,或者是一個(gè)服務(wù),規(guī)模不算大,但是對效率有嚴(yán)格的要求,此時(shí)用C語言就非常合適,所以針對底層開發(fā)的C語言庫較多,因?yàn)樗鼈冇蟹浅4蟮膶?shí)用價(jià)值。