理解C語言——從小菜到大神的晉級之路(1)——引言:C語言的前世今生

第一課的視頻鏈接點這裏

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

1、參考資料


《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語言和其他語言理解的終極目標和最高水平是對其彙編和編譯的每一個細節瞭如指掌。達到這個程度,此時便可以稱作「精通」和「專家」了。

2、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年獲得了有「計算機界諾貝爾獎」之稱的圖靈獎。

肯·湯普森、丹尼斯·裏奇和林納斯·託瓦茲

3、C語言的特點

C語言名義上是一門高級語言,通常可以屏蔽程序對內存、寄存器等物理硬件的操作,在編程時可以專注於實現程序的邏輯功能;但是在需要的時候,C語言依然可以直接對內存地址等物理原件進行操作。自從第三版本的Unix完成以來,C語言到目前也是最適宜做系統開發的編程語言。
相比彙編語言各個指令集所提供的無數種指令,C語言的語法更加精煉。C語言共計提供了39個關鍵字、9種控制語句、34種運算符。將這些資源合理靈活運用可以實現極爲強大的功能,並且不會顯著增加程序員的工作負擔。
另外,C語言提供了多種強大的數據類型,有整型、實型、字符型、數組類型、指針類型、結構體類型、共用體類型,以及C語言提出的最重要的感念之一——指針等。通過這些數據類型可以實現多種複雜的數據結構,且不會過分影響性能。據測算,通常C語言的編譯程序的效率只比彙編程序低不足20%。
作爲一種結構式語言,C語言的另一顯著特點是代碼及數據的分隔化,即程序的各個部分除了必要的信息交流外彼此獨立。這種結構化方式可使程序層次清晰,便於使用、維護以及調試。C語言是以函數形式提供給用戶的,這些函數可方便的調用,並具有多種循環、條件語句控制程序流向,從而使程序完全結構化。 語法限制不太嚴格,程序設計自由度大。

4、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語言學至「精通」的程度都是有百利而無一害的。

5、如何學好C語言?

  1. 選擇合適的參考書。其實對於大部分編程技術來說,最好的辦法是直接從又一個實戰項目開始着手,邊做邊學。但是對於C語言這樣比較基礎,而又有必要學至精通的技術,找一本靠譜的參考書還是很重要的,這樣可以保證知識體系的連續性和完整性,在後期學習更加高級的技術時可以奠定較好的基礎。
  2. 多看代碼,多敲代碼。「紙上得來終覺淺,絕知此事要躬行」。作爲一門編程語言,只是看書不親自去寫程序,想學好C語言是萬萬不可能的。想要深入理解,務必要親自動手去寫足夠多的C代碼,並且最好可以養成單步調試運行的習慣。
  3. 理解數據結構和算法理論。C語言只是一種工具,如果單純只是學習這門語言那麼不但個人競爭力是非常孱弱的,而且對語言的理解也不會很深入。只有深入理解了數據結構和算法理論之後,C語言纔有機會真正實現它的強大功能。也就是說,編程語言只是程序的肉體,算法和數據結構纔是程序的靈魂。
  4. 理解彙編語言和編譯原理。作爲一種高級語言,C語言是需要編譯過後才能運行的。希望真正理解C的精髓,需要明白C語言是如何編譯稱爲彙編語言,彙編語言又是如何操作計算機硬件的。只有理解了彙編和編譯原理,才能打通高級語言和低級語言、程序與硬件之間的兩堵牆,真正掌握程序開發的靈魂。
  5. 研究C語言開發的開源工程。各種各樣的開源工程可以說是編程語言的終極應用,如果可以熟悉幾個比較著名的開源工程甚至參與其中的話,那麼就可謂達到爐火純青的境界了。
  6. 應用,使用學會的C語言進行更高級的開發,如桌面客戶端、服務器程序、網絡應用等。在可以將業務需求理解轉換爲技術需求,並且將其實現出來,且沒有bug,此時便已經達到了集大成的境界,完全可以依此去找一份軟件開發工程師的工作了,而且基本可以保證十分稱職。
綜上所述,我們知道,C語言其實比較容易入門,但是如果希望學成專家並將其在技術開發中融會貫通,其實是難上加難。所以在學習的過程中我們需要耐心、專注、意志,不爲暫時的困難所嚇倒,勇敢地解決掉問題,相信每個有志者都可以成爲專家級的人才。