C++ library 的發展困境
晨星Workshop 提到:
C++現在最缺乏的就是 library的支援,因為相對於Java及一些script language,C++的lib相對的難以開發,需要考慮到的層面太廣了,像是記憶體管控、型別轉換,以及不同平台的實作,造成lib開發的不易
我倒不覺得這些是 C++ library 難以開發的原因。對 C 語言老手來說,那些都是家常便飯。不同平台的實作,多數 C/C++ programmer 都會依循 POSIX 規範內容,也會自定抽象型別以擺脫特定平台相依度。 C/C++ programmer 傳統上透過抽象化的程式設計介面 (programming interface) 實現跨平台的設計目標。而 Java/.Net 則是乾脆在實體作業系統之上再多架一個虛擬機器,將實作細節隱藏在作業環境之下,而不是程式設計介面之下。兩者差異在於,虛擬機器讓軟體的運行環境跨平台, Java/C# programmer 實際上是在單一平台上撰寫程式;抽象化程式設計介面則是讓 programmer 撰寫的程式碼跨平台。有點饒舌,也有點無關緊要。然而, POSIX 規範的是作業系統層級的程式設計介面,不包含使用者介面的部份,所以 C/C++ programmer 在設計 window application 時,將會面臨平台差異性問題。所幸這是個 web application 當道的時代, C/C++ programmer 專心開發 server 和 model 就行了,那才是 programming language 擅長的領域。
回到「C++ library 難以開發的原因」之議題,我以為不是晨星所例舉者,但我仍然承認 C++ library 難以開發。我個人認為 template 才是原因。要開發 C++ library 就要跟 template 打交道,但就我的經驗來看,用一般語法開發應用軟體和用 template 語法開發 library 簡直是兩碼子事,幾乎是不同的軟體設計經驗。我總覺得 C++ 中有一層厚厚的濃霧將 template 包圍起來。或者反過來說,是 template 用一層厚厚的濃霧將 programmer 包圍起來。讓 C/C++ programmer 開發 application 和 library 時的感受,像是穿梭陰陽界。
從傳統 C 到近來的 Java/C# ,乃至動態語言中的 Python, PHP, Ruby 甚至 JavaScript ,設計 application 和設計 library 的經驗沒什麼不同。在 application 開發過程中撰寫的 class ,大部份都可以直接包裝成 library 。但是 C++ 呢?搖搖頭,嘆口氣。我寧願用 C 開發 library ,要用 C++ 開發 application 時,再將 C library 中的 functions 封裝進 C++ 的一般 class 來調用,而不是直接開發一個 template class 。在 CSDN 的《程序員》雜誌 2006 年 6 月刊中有一句話這麼說「 C 語言萬壽無疆, C++ 無壽無疆」,我不得不認同這話。
樂多舊回應