C語言知識結構

很長時間以來,都是在用C語言寫東西。也一直在思考,如何能很好的掌握C,查過很多資料,也作過一些嘗試,於是整理成此文。

在大部分情況下,我們會寫或者使用一個C庫,然後被應用程序使用,運行在Linux的系統上。於是,就有了基於C語言的知識結構:

         App
------------------- C API
       C, libc
------------------- Posix API
     Linux Kernel

整體結構大致有上面的三層,五個部分。大致思路是:必須瞭解上層的需求,和下層能提供的功能。

  • App:使用C庫的應用程序
  • C API:C庫定義的API
  • C, libc:C語言和C語言標準庫
  • Posix API:Linux內核定義的接口
  • Linux Kernel:Linux內核

App

引用程序代表這需求,該部分了解即可。你需要了解他們,然後從他們的角度去看待你寫的庫。

C API

C API是你提供給應用層序的界面,應用程序將參考它進行對接。如何定義好它,是你需要一直考慮的問題,最好的方法就是模仿,參考Posix API等的定義方試即可。

C,libc

對於C語言的學習,請考慮一下你寫C代碼的步驟:寫代碼、編譯、運行、調試。搞定每個步驟的細節,將對你的學習有很大的提升。

寫代碼

寫代碼首要的問題就是Coding Style,包括:變量命名、代碼的格式等。比如,Linux Kernel有自己的Coding Style,GNU項目也有它的Coding Style,還有NASA的Coding Style等等,這些Coding Style是讓參與的人能夠統一,不要亂了風格。若是新手,參考一個用的比較多的即可(參見Stack Overflow上的討論),然後形成自己的代碼風格。這是一個長期的過程,需要日積月累,以及長時間的思考。那麼,有個問題是Coding Style有什麼用?一是它有助於團隊開發。二是有助於提升代碼的可閱讀性。三是作爲新手,對提升很有幫助。具體到寫代碼,只要項目或模塊有一致的風格即可。

然後,就是重構,重構的意思時候,隨着需求的增加,代碼越來越多,原有的代碼結構已經阻礙了開發的效率,需要重新整理。原來看過一本《重構:改善既有代碼的設計》,好像是基於Java的,不過重構思路還是可以運用到C上面的。代碼重構也是需要長期積累和思考。

再然後就是設計模式,設計模式的意思是說,當你面對一個需求時,有特定的代碼結構可以參考。那種代碼結構是經過別人優化過的,你就不要再發明輪子了。當然,某個設計模式只是適用於特定的代碼場景。關於C語言的設計模式,可以參考Stack Overflow上的討論。

關於寫代碼的應該不止這些,這正是我們思考的好時機。

編譯

編譯的第一步是編譯工具gcc之類的,包含了對編譯過程的理解。你肯定需要了解Linux的命令行工具。然後,你會用到Makefile,甚至Automake工具來讓編譯變得簡單。再然後,你會用到Shell來自動化編譯過程。

運行

這一塊的內容,其實挺多的。不能單純的理解爲,C程序的執行。你需要考慮一個問題,我寫的C代碼,在運行態在幹嘛。因爲是跑在Linux上的,所以只需要考慮兩點即可:內存和CPU。即C裏面定義的所有變量,存在於內存的哪裏,我該如何動態管理它們。C代碼是如何運行的,若是有多個線程,它們的執行機制是什麼。但實際上,這裏面還有很多東西,我還在觀察。

調試

調試的話,就是定位程序的問題,保證程序能按預期工作。可以使用gdb工具,添加足夠多的日誌等技術來完成。但是,毫無疑問,你若知道程序的運行原理,調試將不是一件難事。

libc

libc雖然不是C語言的一部分,但是,它和C語言是一體的,基本上,寫任何C語言都要用到它。而且,它是一個很好的C參考。

說到libc,不得不提C語言標準文檔,比如:C99。標準文檔是C語言的終極解釋,通常不同的C編譯器都會對標準有所支持。

Posix API

這部分內容不復雜,可以參考書籍《UNIX環境高級編程》。這本看起來像工具書,但是還是通讀幾遍吧。

Linux Kernel

這部分內容熟悉就好,瞭解內核在幹嘛,在某些情況下是有幫助的。

總結

上面的內容只是個大綱,可執行性不強。而且他是基於Linux的,其實,其它平臺也同樣適用。

若是其它語言,也同樣適用,只是不同的語言側重點不一樣。比如:C++可能更多用於構建一個比較大的項目。語法、使用場景、設計模式都比C更加複雜。

如果抽象層次再高一點的話,當你對一門語言熟悉到一定程度以後,語言將不在是問題的關鍵,實際的需求到語言之間的轉換纔是。就好比說話,說到一定程度,你關注的不是怎麼說,而是如何說。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章