C語言是很多人學習程式設計的第一門語言。很多初學者在學習過程中,往往會產生各種各樣的疑惑:C語言黑底白字,視窗介面看起來甚至還有點醜陋,現在學這個還有用嗎?能撰寫一個好玩的App嗎?能寫爬蟲嗎?能架設一個電子商務網站嗎?光靠C語言能找到一份月薪過五萬的工作嗎?現在網際網路和人工智慧這麼紅,大家都在學習Java、Python、Ruby……都2021年了,C語言是不是已經過時了?
C 語言已經過時了嗎
C語言並沒有過時。自C語言問世幾十年來,其實一直都是使用最廣泛的程式設計語言之一,多年來一直低調地霸佔著程式設計語言的排行榜前幾名,目前還沒有看到衰退和被替代的跡象。只不過在Android、行動網際網路紅了之後,Java暫時搶了風頭而已,把C語言從程式設計語言排行榜上擠到了第二的位置。滄海桑田,時過境遷,很多程式設計語言如過江之鯽,風雲變幻,但C語言依然寶刀未老,在程式設計語言排行榜上從未跌出過前三,這也說明了C語言一直都是被廣泛使用的程式設計語言。既然C語言被廣泛使用,那麼主要應用在哪些領域呢?可以這麼說,基本上在每個領域都可以看到C語言的身影。
●應用軟體:Linux/UNIX環境下的工具、應用程式。
●系統軟體:作業系統、編譯器、資料庫、圖形處理、虛擬機器、多媒體庫等。
●嵌入式開發:各種RTOS、BSP、軔體、驅動、API庫。
●嵌入式、工業控制、物聯網、消費電子、科學研究領域、數值計算。
●實現其他程式設計/指令碼語言:Lua、Python、Shell。
●網站伺服器底層、遊戲、各種應用框架。
C語言是一門高階語言。C語言有高階語言的各種語法和特性,我們使用C語言可以建構大型的軟體工程。有人說,C語言上不了大檯面,撰寫不了大型的專案,這個說法其實也是站不住腳的:很多大型的GNU開放原始碼專案,其實都是使用C語言開發的,如Lua指令碼語言、SQLite、Nginx、UNIX等。現在市面上幾乎所有的作業系統都是使用C語言開發的,如 Linux核心、uC/OS、VxWorks、FreeRTOS。目前最新的Linux-5.x 核心程式已多達2000萬行,3萬多個原始檔案,這個專案應該不算小了吧!
C語言也是一門低階語言。透過指標和位元運算,我們可以修改記憶體和暫存器,從而直接控制CPU 和硬體電路的運行。正是由於這種低階特性,很多作業系統核心、驅動都選擇使用C語言進行開發。尤其在嵌入式開發領域,C語言被廣泛使用,C語言是嵌入式工程師必須熟練掌握,甚至需要精通的一門程式設計語言。
C語言到底要學到什麼程度
學習C語言到底要學到什麼程度,才能達到面試的要求,才能勝任一份嵌入式開發的工作呢?這是很多嵌入式初學者很關心的問題。
一般來講,不同的行業領域、不同的C語言開發職位、不同的學習目的,對C語言的要求也不一樣。如圖0-1所示,如果你是在校學生,學習C語言僅僅是為了應付期末考試、通過電腦考試、考取證照,那麼你只要把C語言的基本語法掌握好,基本上就可以輕鬆過關,稍微用心點,說不定還能拿個高分。如果你想做C語言桌面軟體、網站伺服器開發,那麼你不僅要學習C語言的基本語法,還要對特定行業領域的專業知識、軟體工程、專案管理等有所涉獵。這可不像通過電腦考試那麼簡單。電腦考試其實壓根就不是為程式設計師準備的,它是非電腦專業學生的終極目標,而對於一個立志從事軟體開發的工程師來說,它僅僅是一個起點。如果你想以後從事嵌入式開發、Linux核心驅動開發等工作,那麼對C語言的要求就更高了:你不僅要掌握C語言的基本語法、專案管理、軟體工程,還要對硬體電路、CPU、作業系統、編譯原理等底層機制有完整的了解,需要對C語言進行進一步的強化學習和程式設計訓練。
使用C語言程式設計就像寫小說一樣:為什麼你掌握了3000個常用的英文單字、八大時態、各種從句語法,還是寫不出《哈姆雷特》《冰與火之歌》呢?道理其實很簡單,單字和語法只是基礎中的基礎,只是工具而已。要想寫出優秀的小說,還需要對一門語言背後的社會背景、歷史文化、思維邏輯、風土人情等有深入的理解和把握才行。
你要學習的,不僅僅是C語言……
要想從事嵌入式開發工作,尤其是嵌入式Linux核心驅動開發工作,你要精通的不僅僅是C語言,最好還要掌握和C語言相關的一系列基礎理論和偵錯技能。筆者也是過來人,從最初學習嵌入式到從事嵌入式開發工作,這一路走來坎坷崎嶇,什麼都不說了,說多了都是淚。從一開始連指標都不會用、不敢用,看核心驅動程式一頭霧水,越看越沒信心、越看越沒自信,到現在不再擔心害怕,有自信和能力看懂核心中的程式細節和系統框架,這種進步不是天上掉下來的,也不是一不小心跌入山洞,撿到武功秘笈練出來的,而是不斷地學習和實踐、反覆迭代、不斷完善自己的知識系統和技能樹,才慢慢達到的。學習沒有捷徑可走,要想真正學好嵌入式、精通嵌入式,個人覺得除了精通C語言,最好還要具備以下完整的知識系統和程式設計技能。
●半導體基礎、CPU工作原理、硬體電路、電腦系統結構。
●ARM系統結構與組合語言指令、組合語言程式設計、ARM反組譯分析。
●程式的編譯、連結、安裝、運行和重定位分析。
●熟悉C語言標準、ARM、GNU編譯器的特性和擴充語法。
●C語言的模組化程式設計思想,學會使用模組化思想去分析複雜的系統。
●C語言的物件導向程式設計(簡稱OOP)思想,學會使用OOP思想去分析Linux核心驅動。
●對指標的深刻理解,對複雜指標的宣告和靈活應用。
●對記憶體堆疊管理、記憶體洩漏、堆疊溢位、段錯誤的深刻理解。
●多工併發程式設計思想,CPU和作業系統基礎理論。
本書內容及寫作初衷
本書從C語言的角度出發,分10章,在預設讀者已經掌握C語言基本語法的基礎上,和大家一起探討、學習C語言背後的CPU工作原理、電腦系統結構、ARM平臺下程式的編譯/連結、程式執行時期的記憶體堆疊管理等底層知識。同時,針對嵌入式開發領域,用3章分別探討了C語言的物件導向程式設計思想、模組化程式設計思想和多工程式設計思想,這些底層知識和程式設計思想組成了嵌入式開發所需要的通用理論基礎和核心技能。尤其是對於很多從不同專業轉行到嵌入式開發的朋友,由於專業背景的差異,導致每個人的知識儲備和程式設計技能樹參差不齊,在學習嵌入式開發的過程中會經常遇到各種各樣的問題,陷入學習的困境。
本書的寫作初衷就是為不同專業背景的讀者架設嵌入式開發所需要的完整知識系統和認知框架。掌握了這些基礎理論和程式設計技能,也就補齊了缺陷,可為後續的嵌入式開發進階學習打下堅實的基礎。
本書特色
●直白寫作風格,通俗易懂,不怕學不會,就怕你不學。
●大量的配圖、原理圖,圖文並茂,更加有利於學習和理解。
●在ARM平臺下講解程式的編譯、連結和運行原理(獨創)。
●現場“手刻”ARM組合語言程式碼,從反組譯角度剖析C函式呼叫、傳參過程。
●多角度剖析C語言:CPU、電腦系統結構、編譯器、作業系統、軟體工程。
●GNU C編譯器擴充語法精講(在GNU開放原始碼軟體、Linux核心中大量使用)。
●記憶體堆疊管理機制的底層剖析,從根源上理解記憶體錯誤。
●從零開始一步一步架設和迭代嵌入式軟體框架。
●教你用OOP思想分析Linux核心中複雜的驅動和子系統。
●C語言的多工併發程式設計思想,CPU和作業系統零基礎入門。
讀者定位
本書針對的是嵌入式開發,尤其是嵌入式Linux開發背景下的C語言進階學習,比較適合在校學生、嵌入式學員、工作1~3年的職場新兵閱讀和學習。為了達到更好的學習效果,在閱讀本書之前,首先要確保你已經掌握了C語言的基本語法,並且至少使用過一款C語言整合式開發環境(VC++ 6.0、Visual Studio、C-Free、GCC都可以),開發過一個完整的C語言專案(課程設計也算)。有了這些基礎和程式設計經驗之後,學習效果會更好。
致謝及意見回饋
本書在寫作過程中參考了很多經典圖書、論文期刊、開原始程式碼,包括網際網路上的很多電子資料,由於時間和精力的關係,無法對這些資料的最初出處一一溯本求源,對各種資料的創建者和分享者不能一一列舉。這裡對他們的貢獻表示真誠的感謝。
感謝電子工業出版社的董英和李秀梅編輯,本書從選題的論證到書稿的格式審核、文字編輯,她們都付出了辛苦的工作並提出了很多專業意見。鑒於作者水準、時間和精力有限,書中難免出現一些錯誤。如果你在閱讀過程中發現了錯誤或者需要改進的地方,歡迎和我聯繫(E-mail:3284757626@qq.com),或者在我的個人部落格(www.zhaixue.cc)上留言。