筆者最近在開始一些C
的應用程式開發,主要在linux下進行,目標是跨平臺的應用程式。雖然是基於某開源程式進行開發,看了不少原始碼,也動手擴充套件和修改了開源程式,感觸頗多。C
其實是語法最為簡單的程式語言之一。但是在實際的開發中,尤其是用C來開發一些系統應用程式,會感覺到比Java
之類的要難的多,究竟是為什麼呢?有人可能會說是手動記憶體分配的複雜性,字串處理的不便捷…都沒錯,筆者認為,總結一句話是標準化和工業化程度決定了使用的難易程度
。
如果我們使用Java
來開發一個程式,Java
的標準化框架和包,會相對來說極大的規範程式設計師的程式設計行為,為程式設計師帶來相對很大的便利性。越是高層次的語言,這越是明顯。很多語言,將很多問題提煉到語法層面,通過增加語法的複雜度,從而強制性的讓程式設計師規範程式設計行為和思路,也是一個原因,比如絕大部分語言提供try catch
來做異常捕獲。然而,C語言並沒有原生的try catch
。
而C
語言,雖然有標準C
庫,但是在使用的時候,往往會遇到不同平臺的差異,這也是為什麼多數C
程式需要通過configure
在編譯程式前獲得這些差異的原因。所以即使是標準C
庫,在跨平臺方面也有諸多問題。在Java
等語言中,很多有差異的問題被重寫了,或者被遮蔽了,從而在標準庫方面更為統一,因此易用性提高很多。
另一個方面,當我們要進行一些系統程式設計時,比如執行緒控制、檔案讀寫、網路讀寫時,平臺的差異更大。雖然,諸如POSIX
等標準試圖解決問題,但是由於Unix的各大分支(包括linux)長期的歷史原因,依舊不能很好的做到統一。而在這方面,Java
等語言在統一化方面做的就十分完整和到位。
C語言由於語法十分簡單,導致程式設計師的程式設計行為風格迥異。而物件導向的提出,使得程式設計師在程式設計行為上有了一次高度的統一。C++是物件導向的先驅之一,然而由於C++保留了對C的相容性,反而也限制了C++在標準化上的程式。顯然,不會有人覺得C++比Java簡單。當然,C不是不能“物件導向”,物件導向不是一種語法,而是一種程式設計正規化,只是C在“物件導向”時並沒有我們熟知的正規化而已。而且大部分的C程式不採用物件導向,物件導向也不見得是萬能藥。在使用Java標準庫之外的第三方庫時,之所以覺得沒有違和感,原因之一就是大家都遵循了物件導向的原則。當然,不同的語言的正規化原則不一定是物件導向。
那麼,如果要基於C語言來做開發(應用程式),應該如何開展呢?究竟要做些什麼準備呢?通過閱讀原始碼,筆者認為,程式設計師應該有意識的積累和準備一些常用的資料結構和演算法、系統封裝,還需要對系統底層有比較深入的理解,這樣就能形成一層標準層
,有了這個標準層
,算是入門,並且有能力開始工程實踐了。否則舉步維艱。
通常來講,這些標準層
包含:
-
記憶體池。提高記憶體分配和管理的效率和便利性,甚至可以自己實現GC。
-
日誌。日誌之所以如此重要,你懂得,別指望IDE來除錯。
-
異常處理。利用C庫和巨集,實現一個try catch,會十分有用。
-
字串處理。便捷的字串處理毋庸置疑是極其重要的。
-
常用的資料結構。比如:list、map、array。
-
封裝並遮蔽平臺差異。比如socket、thread、file等系統直接相關的呼叫。
針對上述的內容,筆者會結合開源軟體,逐步做一些總結。