C語言是現在應用最為廣泛的程式設計語言之一,也是現在依然流行的程式設計語言中曆史最悠久的一種之一。在目前業界廣泛使用的程式設計語言中,許多 種語言是以C為基礎發展而來。在多類大學的工程類專業尤其是資訊類專業的教學計劃中,C語言也是極為重要的基礎課之一。 而對于一名以編譯型語言為主要開發工具的程式員來說,熟練掌握C語言的用法和理論也可以對其他程式設計語言獲得更深的了解。是以,在這一系列教程中我們希望可以深入了解C語言的方方面面,為後續了解更進階的技術奠定更好的基礎。

《C程式設計語言》 Brian W.Kernighan(布萊恩·克尼漢),[美] Dennis M.Ritchie(丹尼斯·裡奇)
該書作者Ritchie為C語言的最初設計者之一,Kernighan也是貝爾實驗室的進階研究員,C和Unix設計的參與者。這本書作為最經典的C語言書籍之一,其篇幅卻短小精悍總共隻有兩百多頁,這得益于作者對C語言無與倫比的深入了解以及簡潔精悍的文筆和語言組織能力。多年以來被許多程式員奉為首選參考書籍。
《深入了解計算機系統》Randal E. Bryant,David R.O Hallaren
該書并非直接講述C語言方面的内容,但是從另一個角度闡述了計算機系統的本質,代碼如何影響程式的功能和性能,以及計算機系統的方方面面的深層原理。這本書也是以成為多所世界著名大學的CS專業的指定教材,對于希望晉級為進階程式員的開發者來說也是強有力的助推器。
其他參考書籍:
《C Primer Plus》
C語言經典教程之一,講述了C語言大量的細節來深刻诠釋概念。條理清晰,易于入門,唯一的缺陷是太厚……
《 POINTERS ON C》
對指針這一C語言中最重要的概念提供了深入的讨論
《C Traps and Pitfalls》
從詞法分析、文法語義、連接配接、庫函數、預處理器、可移植性缺陷等幾個方面分析了C程式設計中可能遇到的問題,适合初學者擷取進一步的程式設計經驗,在程式設計能力上獲得進階
《Expert C Programming Deep C Secrets》
當對C程式設計有了一定經驗後,可以對進一步提高水準
《Compilers:Principle,Techniques and Tools》和《彙編語言》
對C語言和其他語言了解的終極目标和最高水準是對其彙編和編譯的每一個細節了如指掌。達到這個程度,此時便可以稱作“精通”和“專家”了。
C語言誕生的搖籃位于AT&T公司設立的貝爾實驗室。AT&T是由著名的亞曆山大 · 貝爾與1887年建立的,他在一年前獲得有線電話的發明專利。經過多年的發展,AT&T的電話業務逐漸從紐約擴充到美國中部再到美國全國,随後又擴充到歐洲。
AT&T大樓
1925年,AT&T成立了公司的貝爾實驗室作為公司的研發機構。由于處于電信業壟斷地位的AT&T每年将營業額固定的3%作為研發經費,貝爾實驗室的諸多衣食無憂的科學家們在基礎科學、通信科學和計算機科學等領域碩果累累,多次獲得諾貝爾獎和圖靈獎。其中著名的有射電望遠鏡、半導體半導體、程控數字交換機、太陽能電池、資訊論、C語言和Unix作業系統等,産生了丹尼斯·裡奇、肯·湯普森、香農、肖克利等彪炳史冊的著名科學家。
貝爾實驗室外景
到了1984年,受制于反壟斷法,AT&T不得不進行了自我分裂,将市話業務獨立為包括西南貝爾公司(SBC)在内的七個小貝爾公司。然而這不是最後一次,到了1995年,為了促進通信設施銷售的增長,AT&T一分為三,其中最重要的是将通信設施銷售公司朗訊拆分獨立上市。然而猶豫2000年網際網路泡沫的破裂,大量通信設施銷售額變為了壞賬,使得朗訊元氣大傷。後來,已經日薄西山的朗訊居然再次殺雞取卵,将無線裝置部門再次拆分上市,至此朗訊徹底崩潰,直到最終被法國阿爾卡特收購,變為阿爾卡特·朗訊。值得一提的是在我國國内市場上,該公司依然在積極開展業務,而且有着比較高的知名度,即上海貝爾-阿爾卡特-朗訊。
而與此同時,母公司AT&T也做了同樣作死的事,将AT&T無線業務再次拆分上市,此後AT&T也失去了在新時代電信行業的競争力,直到後來被西南貝爾公司SBC收購。在這幾輪拆分中,貝爾實驗室先是被劃歸朗訊旗下,後來由于朗訊已是自身難保,不得不将貝爾實驗室的大部分機構關閉,隻保留了一個招牌。最終,貝爾實驗室随着朗訊被阿爾卡特收購。
雖然貝爾實驗室已不複當年的輝煌,但是肯·湯普森和丹尼斯·裡奇等人發明的Unix系統和C語言至今依然活躍在計算機與網際網路業界。Unix作業系統的最初版本與1971年開發完成,當時該系統還是通過彙編語言實作。後來由于裡奇和湯普森認為彙編語言實作作業系統實在太過難以移植,希望通過一種進階語言重新優化Unix系統。最終到了1973年,二人完成了一種新的程式設計進階語言即C語言,并且很快最新版本的由C語言實作的Unix也問世了。由于遠勝過彙編語言的可移植性,C開發的Unix系統對後續的作業系統産生了巨大的影響,其中最著名的就是芬蘭人Linus·Torvalds開發的Linux作業系統,這個開源作業系統已經成為現在最流行的作業系統核心之一。由于在這方面的卓越貢獻,湯普森和裡奇在1983年獲得了有“計算機界諾貝爾獎”之稱的圖靈獎。
肯·湯普森、丹尼斯·裡奇和林納斯·托瓦茲
C語言名義上是一門進階語言,通常可以屏蔽程式對記憶體、寄存器等實體硬體的操作,在程式設計時可以專注于實作程式的邏輯功能;但是在需要的時候,C語言依然可以直接對記憶體位址等實體原件進行操作。自從第三版本的Unix完成以來,C語言到目前也是最适宜做系統開發的程式設計語言。
相比彙編語言各個指令集所提供的無數種指令,C語言的文法更加精煉。C語言共計提供了39個關鍵字、9種控制語句、34種運算符。将這些資源合理靈活運用可以實作極為強大的功能,并且不會顯著增加程式員的工作負擔。
另外,C語言提供了多種強大的資料類型,有整型、實型、字元型、數組類型、指針類型、結構體類型、共用體類型,以及C語言提出的最重要的感念之一——指針等。通過這些資料類型可以實作多種複雜的資料結構,且不會過分影響性能。據測算,通常C語言的編譯程式的效率隻比彙程式設計式低不足20%。
作為一種結構式語言,C語言的另一顯著特點是代碼及資料的分隔化,即程式的各個部分除了必要的資訊交流外彼此獨立。這種結構化方式可使程式層次清晰,便于使用、維護以及調試。C語言是以函數形式提供給使用者的,這些函數可友善的調用,并具有多種循環、條件語句控制程式流向,進而使程式完全結構化。 文法限制不太嚴格,程式設計自由度大。
自從C語言誕生之日,至今已有40多年。這麼多年裡,伴随着新的開發領域和新的業務需求的不斷湧現,各種不同的程式設計語言也是層出不窮。那麼今時今日,作為進階程式設計語言中祖爺爺級的“人物”,C語言是否已經過時?是否還值得現在的學生和新手程式員花大力氣去研究呢?如果值得,是不是每個人都應該去學習這門語言?這都是值得思考的問題。
現在,我們看看招聘網站上招聘程式員的需求,滿眼都是“iOS”、“Android”、“雲計算”、“大資料”、“異構開發”、“資料挖掘”、“分布式系統”等等一堆高大上的名詞,現在隻會C語言,的确在找工作的過程中缺乏很大的靈活性和選擇空間。但是這并不代表着C語言已經過時。從TIOBE程式設計語言排行榜的榜單上可以看出,經過了這麼多年,C語言依然牢牢占據榜單前兩位的位置,甚至曾經多次沖到榜首。其操作低層裝置的能力、對bit進行操作的能力是大多數進階語言所不具備的,是以C語言在嵌入式開發等領域始終占據不可撼動的統治地位;另外,由于相對于其他進階語言,C語言顯得更加貼近硬體,且效率更高,是以也是系統級程式設計的不二選擇。
2015年11月TOBIE程式設計語言排行榜
那麼是否每個程式員都必須要學C?其實也不盡然。對于網站、前端開發,PHP開發,HTML+CSS+JavaScript以及其他一些以解釋型語言為主要開發工具,以及其他一些對底層、系統原理要求不高的程式員來說,C語言不是必選項。而對于底層開發(如驅動)、嵌入式開發、Windows開發,以及其他以編譯型語言(如C/C++/C#/Objective-C)為主要開發工具的程式員來說,不熟悉C語言必然會對後面的學習造成極大的困難。我們可以肯定的是,對于每個軟體工程師,将C語言學至“精通”的程度都是有百利而無一害的。
選擇合适的參考書。其實對于大部分程式設計技術來說,最好的辦法是直接從又一個實戰項目開始着手,邊做邊學。但是對于C語言這樣比較基礎,而又有必要學至精通的技術,找一本靠譜的參考書還是很重要的,這樣可以保證知識體系的連續性和完整性,在後期學習更加進階的技術時可以奠定較好的基礎。
多看代碼,多敲代碼。“紙上得來終覺淺,絕知此事要躬行”。作為一門程式設計語言,隻是看書不親自去寫程式,想學好C語言是萬萬不可能的。想要深入了解,務必要親自動手去寫足夠多的C代碼,并且最好可以養成單步調試運作的習慣。
了解資料結構和算法理論。C語言隻是一種工具,如果單純隻是學習這門語言那麼不但個人競争力是非常孱弱的,而且對語言的了解也不會很深入。隻有深入了解了資料結構和算法理論之後,C語言才有機會真正實作它的強大功能。也就是說,程式設計語言隻是程式的肉體,算法和資料結構才是程式的靈魂。
了解彙編語言和編譯原理。作為一種進階語言,C語言是需要編譯過後才能運作的。希望真正了解C的精髓,需要明白C語言是如何編譯稱為彙編語言,彙編語言又是如何操作計算機硬體的。隻有了解了彙編和編譯原理,才能打通進階語言和低級語言、程式與硬體之間的兩堵牆,真正掌握程式開發的靈魂。
研究C語言開發的開源工程。各種各樣的開源工程可以說是程式設計語言的終極應用,如果可以熟悉幾個比較著名的開源工程甚至參與其中的話,那麼就可謂達到爐火純青的境界了。
應用,使用學會的C語言進行更進階的開發,如桌面用戶端、伺服器程式、網絡應用等。在可以将業務需求了解轉換為技術需求,并且将其實作出來,且沒有bug,此時便已經達到了集大成的境界,完全可以依此去找一份軟體開發工程師的工作了,而且基本可以保證十分稱職。
綜上所述,我們知道,C語言其實比較容易入門,但是如果希望學成專家并将其在技術開發中融會貫通,其實是難上加難。是以在學習的過程中我們需要耐心、專注、意志,不為暫時的困難所吓倒,勇敢地解決掉問題,相信每個有志者都可以成為專家級的人才。