最近更新: 2006-12-04

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++ 無壽無疆」,我不得不認同這話。

相關文章
樂多舊網址: http://blog.roodo.com/rocksaying/archives/2546332.html

樂多舊回應
freak@fsfoundry.org(fr3@K) (#comment-16655595)
Sun, 15 Jun 2008 14:19:42 +0800
小弟以為 C++ library 之所以難以開發的主因是 interface, 而不是 template. 請參考 不是李白也能 C++.
未留名 (#comment-22358722)
Thu, 15 Mar 2012 02:09:48 +0800
>template 用一層厚厚的濃霧將 programmer 包圍起來
template不難,只要花點時間閱讀和實作就能掌握日常編程需要用到的東西
優秀的C++ library也不一定要用到大量艱深的TMP技術(例如QT和pugixml)
能掌握它的人自然知道他的好處,不能掌握也用不著排斥
STL,BOOST,blitz,loki等library已經證明了Template的價值

TMP讓那些有能力不錯的程式員可以在效能和靈活度之間取得更好的平衡
無法掌握好TMP的人相對而言就無法開發出像TR1或STL這種等級的library
不過這種藝術品本來就只有極少數的人有能力開發出來

>Python, PHP, Ruby 甚至 JavaScript,設計 application 和設計 library 的經驗沒什麼不同
那麼用這些語言在設計的時候,是否需要考慮哪些東西應該在編譯期完成,那些需要在執行期完成呢?
他們設計的目標,跟大量利用TMP的C++ library是一樣的嗎?
如果不是對效能和靈活度如此斤斤計較,大可拋開TMP或簡單的TEMPLATE技巧
寫起來也不會太困難
但這種library能不能跟那些C++社區的強者比較就是另外一個問題了

>我寧願用 C 開發 library
C能寫出像std::sort那麼高效且簡潔的程式碼嗎?不行
對於喜歡Generic programming的人來說,C的限制太多了
未留名 (#comment-22358734)
Thu, 15 Mar 2012 02:19:04 +0800
C的qsort在C語言天生的限制下,我覺得那種設計是相當漂亮的
但是過渡到C++時就不是那麼一回事了
當數據和理論都證實利用template設計出來的std::sort
不論界面,彈性或效能都比qsort好的時候
我們為什麼要因為自己沒有能力掌握template就排斥它呢?
就算我們沒有那種能力,也不代表其他一流水準的人沒那種能力啊

C語言的卻比C++來得簡單,但相對的我們在C中能做的選擇不如C++多
每一種語言都有自己的哲學,如果樓主覺得C的簡單比較適合你
那就用C吧,沒必要貶低C++

對我來說C++提供的豐富機制能讓我設計出更好的程式碼
也很喜歡Template提供的可能性
未留名 (#comment-22359958)
Thu, 15 Mar 2012 13:59:56 +0800
我從未貶低過C++。

Effective C++ 的作者 Scott Meyers 提到 C++ 分成四個子集: 傳統C, OO C++, Template, STL。
在 Scott 眼中,每一個部份的複雜度都可以單獨視為一個語言。

就我個人的經驗來說,STL 是讓人感覺最愉快的部份。但是對一個library的設計人員而言,想要設計一個像 STL 那麼好用的library卻很難。連 Bjarne Stroustrup 都曾承認基於 C++ 的 template library 數量太少。本文中,我提出的觀點就是 Template 太難駕馭,形成開發者設計 C++ library 的門檻。

你說還是有一流的人有能力操作template。沒錯,但那對C++的推廣幫助不大,甚至會讓C++變成少數精英使用的學術性語言。但C++的設計目的可是成為軟體設計的工業性、有生產力的語言。然而,要讓廣大中下階層的軟體程序員接受C++的話, template 就是個門檻。不過,現在談這事意義不大,因為富有生產力的程式語言現在實在太多可選擇了。

對了,我也覺得 template 很難除錯,當時的編譯器丟出來的錯誤訊息常常沒啥幫助。
我是聽說最近的C++編譯器在 template 的錯誤訊息這方面改善很多,不過現在的工作內容沒機會讓我試。

總之,我是說 template 很難精通熟練,但可沒有把 template 當成垃圾。

你如果閱讀過這部落格中的其他程式語言的文章,你就會發現我受到 C++ 的影響非常深。
就連我在談論PHP,JavaScript這些語言的文章,也經常使用 C++ 的術語或概念來解釋內容。
再看看我對 Java 語言的評論,那才叫貶低。

你若說我貶低 Java,我不會否認。但要說我貶低 C++,我可不承認。
未留名 (#comment-22361172)
Fri, 16 Mar 2012 00:51:07 +0800
下班回家,終於有時間把上篇回應提到的「Effective C++ 3/e」翻開來看了。

我上篇回應之所以提到「Effective C++ 3/e」,是因作者列出的第一守則所對應的狀況,就是我在本文中形容為「穿梭陰陽界」的事。

Scott 說C++的每一個子語言都有自己的高效守則,當程式人員從某個子語言切換到另一個子語言時,可能就要面對不同的設計哲學,採用不同的編程策略。

當我們在設計一個 template library 時,至少要在一篇程式碼中,交換運用四種子語言,頻繁地切換編程策略與設計哲學。不同的設計哲學給人不同的使用感受。我將之形容為在陰界與陽界間來回穿梭。

當年我寫下本文時,我還沒看過《Effective C++ 3/e》。現在我會直接推薦這本書給有意了解這個議題的人閱讀。