為什么要學(xué)習(xí)和使用 C 語言?
一、前言
對(duì)于理工 科學(xué)生來說,這個(gè)答案可能很簡(jiǎn)單,因?yàn)檫@是一門必修課。而對(duì)于程序員來說選擇一門編程語言,在某種程度上,對(duì)職業(yè)生涯的發(fā)展會(huì)產(chǎn)生重大的影響,所以必須慎 之又慎。那么,為什么要選擇一門誕生了將近半個(gè)世紀(jì)的語言?本文不是老生常談的廢話,如:"C 語言是編程的基礎(chǔ)"、"學(xué)好 C 語言,走遍天下都不怕"等等,本文力爭(zhēng)詳盡而又有理的回答這個(gè)問題,旨在成為***的為什么要學(xué)習(xí)和使用 C 的文章。
二、C 語言
C 語言是由美國 AT&T 貝爾實(shí)驗(yàn)室的研究員 Dennis Ritchie 在 B 語言的基礎(chǔ)上,最初作為改造 Unix 操作系統(tǒng)的開發(fā)語言,并伴隨著 Unix 操作系統(tǒng)興起而流行,后來,隨著微型計(jì)算機(jī)的發(fā)展,C 開始被移植到其他操作系統(tǒng)平臺(tái)上,成為獨(dú)立的程序設(shè)計(jì)語言。
下圖摘自 TIOBE 編程語言排行榜,過去 30 年 90% 時(shí)間里 C 都是獨(dú)領(lǐng)風(fēng)騷的,僅偶爾被 Java 超越:
技術(shù)分享
那么是因?yàn)橐婚T語言一直位于排行榜的***名就該去學(xué)習(xí)和使用嗎?顯然不是,人云亦云是程序員的大忌。為操作系統(tǒng)而生的標(biāo)簽注定了 C 不可能平庸,實(shí)話實(shí)說,C 是一門很難學(xué)習(xí)和使用的編程語言,沒有編譯原理、操作系統(tǒng)和計(jì)算機(jī)體系結(jié)構(gòu)扎實(shí)的基礎(chǔ)知識(shí),根本不可能把 C 學(xué)的明白、用的順手。C 作為一門工程實(shí)用性極強(qiáng)的語言,提供了對(duì)操作系統(tǒng)和內(nèi)存的精準(zhǔn)控制,高性能的運(yùn)行時(shí)環(huán)境,源碼級(jí)的跨平臺(tái)編譯等優(yōu)點(diǎn),才是我們必須學(xué)習(xí)和使用 C 的理由。
同時(shí),幸運(yùn)的是 C 也是個(gè)有趣的東西,對(duì)編程的認(rèn)知越深,就會(huì)越覺得有意思,我簡(jiǎn)單列舉一些 C 的優(yōu)點(diǎn):
2.1)結(jié)構(gòu)化設(shè)計(jì)語言,語法清晰、結(jié)構(gòu)簡(jiǎn)單,模塊化使得程序的各個(gè)部分除了必要的信息交流外彼此獨(dú)立,便于開發(fā)、調(diào)試以及調(diào)試。
2.2)運(yùn)算符多,把括號(hào)、賦值、強(qiáng)制類型轉(zhuǎn)換等都作為運(yùn)算符處理,靈活使用各種運(yùn)算符可以實(shí)現(xiàn)在其它高級(jí)語言中難以實(shí)現(xiàn)的運(yùn)算。
2.3)數(shù)據(jù)結(jié)構(gòu)豐富,能實(shí)現(xiàn)各種復(fù)雜的數(shù)據(jù)類型的運(yùn)算,引入指針、結(jié)構(gòu)體概念使程序效率更高。
2.4)為操作系統(tǒng)而生,可以像匯編語言一樣對(duì)位、字節(jié)和地址進(jìn)行操作,允許直接訪問物理地址對(duì)硬件進(jìn)行操作,把高級(jí)語言的基本結(jié)構(gòu)和語句與低級(jí)語言的實(shí)用性結(jié)合起來。
2.5)程序執(zhí)行效率高,一般比匯編程序生成的目標(biāo)代碼效率低 10%~20%。
2.6)可移植性好,C 語言抽象了針對(duì) CPU 編程的細(xì)節(jié),能廣泛應(yīng)用于針對(duì)大型操作系統(tǒng)和系統(tǒng)軟件的編寫。
2.7)具備強(qiáng)大的繪圖功能,和 C++ 一樣也可以寫出很優(yōu)雅的二維、三維圖形和動(dòng)畫。
有人說,C 是 C++ 的子集,C 能做到的事,C++ 一樣能做到,并且還可以做的更好,如:三大面向?qū)ο筇匦?、GUI 編程,誠然,我承認(rèn)在 GUI 編程領(lǐng)域 C++ 占據(jù)著絕對(duì)的統(tǒng)治地位,至今無人能撼動(dòng)。但真的有必要用 C++ 來替代 C 完成工作嗎?很多時(shí)候 C++ 解決問題的思路真的比 C 更先進(jìn)嗎?
三、C 和 C++ 比較
寫到這一 段的時(shí)候我有一種戰(zhàn)戰(zhàn)兢兢、如履薄冰的感覺,畢竟 C、C++ 是廣大程序員都很熟悉東西,打起嘴炮來也是極其恐怖的,其實(shí)在關(guān)乎信仰的問題上,任何的爭(zhēng)論都是無止境的,也是無意義的。我希望大家不要把大量精力用來爭(zhēng) 論純粹的語言優(yōu)劣上,而是去思考如何的正確的把事情做好,什么是正確的做事——快速高效的開發(fā),保障快速穩(wěn)定的運(yùn)行,快速簡(jiǎn)單的維護(hù)。
下圖是嘴炮大神 Linus Torvalds 當(dāng)年抨擊 C++ 和他周圍那些 C++ 大牛程序員們的犀利言辭,其實(shí)我個(gè)人并不欣賞 Linus 的個(gè)人風(fēng)格,我還是希望大家能心平氣和的談?wù)?C 相比 C++ 的一些優(yōu)點(diǎn)和現(xiàn)狀:
技術(shù)分享
3.1)隱式操作:C 簡(jiǎn)單直接、結(jié)構(gòu)清晰,每行代碼都能清楚的被反匯編成相應(yīng)的語句,系統(tǒng)會(huì)嚴(yán)格按照你的代碼去執(zhí)行。而 C++ 則不盡然,簡(jiǎn)單的語句也說不清楚究竟有多少次構(gòu)造和拷貝,這樣編寫底層代碼是完全不行的,底層需要精準(zhǔn)和嚴(yán)格的控制。
3.2) 語言接口:現(xiàn)代軟件工程項(xiàng)目的開發(fā),不但對(duì)性能有很高要求,對(duì)于語言接口的對(duì)接能力也有很高要求,因?yàn)橘即蟮囊粋€(gè)項(xiàng)目很少僅使用一種語言來進(jìn)行開發(fā),對(duì)于 底層,C++ 對(duì)內(nèi)存和硬件的控制不如 C 簡(jiǎn)潔精準(zhǔn);對(duì)于很多動(dòng)態(tài)語言和中間件,如:PHP、Python 和 Apache、Redis,都受了 C 的很大影響,甚至就是 C 開發(fā)出來的東西,對(duì)接起來非常方便。沒錯(cuò)兒,其實(shí) C++ 采用迂回的方式也能對(duì)接的,但是,遠(yuǎn)遠(yuǎn)不如 C 方便,開發(fā)和維護(hù)成本非常高。
3.3)硬件層:
3.2.1>分配內(nèi)存:系統(tǒng)加電后運(yùn)行,經(jīng)過匯編初始化棧,然后再跳轉(zhuǎn)到 C 語言的 start_init() 函數(shù)去,這時(shí)候內(nèi)存分配機(jī)制都還沒有建立,C++ 如何定義類?如何實(shí)例化對(duì)象?
3.2.2>標(biāo)準(zhǔn)庫依賴:C 的所有特性都可以不依賴任何庫運(yùn)行,如有必要,可以按照特定需求自己編寫庫。
3.2.3>處理器兼容:C++ 的類是依賴基地址+偏移地址的尋址方式,很多微處理器只有簡(jiǎn)單的給定地址尋址,不支持一條語句實(shí)現(xiàn) base + offset 的尋址機(jī)制,很多 C++ 代碼編譯出來需要更多的指令來運(yùn)算地址,導(dǎo)致性能下降了太多。
3.4)應(yīng)用層:C++ 在做應(yīng)用層尤其是 GUI 編程,這是 C++ 的傳統(tǒng)強(qiáng)項(xiàng),我一直堅(jiān)持 C 也能優(yōu)雅的做出圖像和動(dòng)畫,但開發(fā)效率確實(shí)較 C++ 低很多,最近有個(gè)很火的 RUST 語言,號(hào)稱是未來唯一能取代 C++ 的編程語言,感興趣的同學(xué)可以多關(guān)注下。
四、總結(jié)
下面我列舉了 10 多個(gè)目前熱門的發(fā)展方向,粗略的介紹了下列項(xiàng)目里最常用的編程語言:技術(shù)分享
由上圖可知,操作系統(tǒng)、編譯原理、數(shù)據(jù)結(jié)構(gòu)與算法等等基礎(chǔ)知識(shí),是深入理解、掌握和靈活運(yùn)用 C 的重要前提,現(xiàn)階段程序員職業(yè)生涯超過一半的熱門方向直接或間接與 C 有關(guān),我想,學(xué)好 C 的重要性也就不言而喻了。