不是李白也能 C++
Posted on April 13th, 2008 at 3:16 by fr3@K

除了語法上的困難, 另一個 C++ 常被人嫌的特性就是不如 C#(.Net)/Java/Python 之流般擁有大量標準的 library1 或針對特定功能的準標準 library.2 寫上一篇 (五種寫 For Loop 的方法) 時, 突然體會到這樣的現象似乎是源自 C++ 的設計與演化, 很可能是難以避免的結果.



在 FOSS 社群裡, 有能力並願意貢獻的人看到能改進的實作時, 常會送 patch 給原做/維護者. 但若一個這個有改進空間的 library 的 interface 令人不滿意時, 很容易會讓這群貢獻者放棄這樣的行為, 因為 interface 有問題的 library 根本就不實用 (至少不好用). 而增加有能力或自認有個幾兩重的人轉而去另闢山頭重來一次的可能性.

以 C, 或任何一個顯著較 C++ 簡單的語言為例, 針對一組特定功能定出讓大家滿意的 interface 已經不是件容易的事情. 而 C++ 不但擁有多種 progamming paradigm,3 連簡單的 for loop 都能用至少五種有顯著差異的方法來寫. 用它來定出一個好用被肯定或至少被接受的 interface 更是需要經歷更久的時間數倍的力氣. 結果就是會同時存在多套功能接近甚至相同但 interface 截然不同的 C++ library.4 因此 library 被標準化或成為準標準的機會又更是小了. 這不是完全沒有好處的, 從另一個角度來說這造成了更多樣化的競爭.

C++ 之父 Bjarne Stroustrup 多次說過, 他不願意發明一種他可以預見將如何被使用者運用的語言. 在他將 template 引進 C++ 時他更沒有預想到如 STL, 一個在今天早已被標準化並幾乎是完全被 C++ 社群擁抱推崇的 library, 的出現. 正因為 C++ 是如此的多樣化, 才得以促成它們的誕生. 數量少但質量高的 (準) 標準 library 對 C++ 的未來是好是壞, 還得看 C++ 與社群接下來的造化.

不可諱言, C++ 不是種容易的語言. 它的學習曲線陡得讓不少人畏懼三分. 就像是只有擁有好文筆的人 (甚至是詩人) 才能寫出動人的詩詞一般; 使用今天的 C++ 寫出簡潔優美的程式有時的確變成所謂的語言專家 (language lawyer) 的專利. 但這並不代表大部分認真學習過某種語文的人不能有效地以該語文與他人溝通, 甚至是寫出言簡易駭的文字. 只是可能沒那麼罷了.

C++ 給 programmer 多變化的選擇一定程度上造成了此刻的我們只看到少數傑出的 library 的事實. 正如如此的多變的人類語文, 也只孕育出相對少量的雋永文字. 但若不是這樣的特性, 今天的世界會不會沒有李白? 我們是否會知道莎士比亞是誰?

實際的狀況是, 不是李白的我們還是照樣與人溝通, 或許也跟我一樣沒事寫寫文字發發牢騷. 不是 C++ 語言專家但合格的 C++ programmer5 即便寫不出 STL, 照樣能寫出正確有效率可以維護的 C++ 程式.

Programming language 是一種工具. 選擇一個恰當的工具當看要達成的目的. 需要溝通的時候妳我不會因為不是莎士比亞, 就選擇變成啞巴不說話. 需要低階高效又可高度抽象的 programming language 的時候, 也不要抗拒把 C++ 列為選項.

PS: 雖然看起來可能像, 我也知道這篇的標題聽起來的確也像. 與其說這篇文字的重點是在 pro-C++, 更不如說是在鼓勵 programmer 選擇/使用正確的工具. 要做 web service 的時候 php/python 等更可能是較佳的工具. 前面的廢話是我的思路, C++ 只是我舉的例子. (沒辦法, 其他的 programming language 與相關應用不是我的專長)

PSS: 也許是我有偏見, 事實上我也一直沒去細究, 誰能告訴我用 C# 來寫 OS kernel (見 SharpOS and Cosmos) 究竟是怎麼回事? 是因為好玩? 是單純因為 it can be done???

PSSS: 拿 programming language vs 人類語言做類比多少有點 far-fetched. 但我覺得其中的 analogy 還是有助於表達我的看法.

  1. 先不論 C++ 的定位是 general purpose programming language, 本來就不願意把相對特殊非必須的 library 納入標準 []
  2. 這裡所謂的準標準 library 是如 Pthreads, OpenSSL, BSD socket 等非語言標準但被廣泛支援/使用的 library/interface/API []
  3. 有自 C 繼承過來的 procedural programming, 與一開始就有的 object-oriented programming. 有催生出 STL/Boost/Loki 等的 metaprogramming (templates). 以及 C++0x 將加入的 functional programming (Lambda Expressions and Closures) []
  4. 例如 Boost.Thread vs CWinThread []
  5. 個人主觀認為, 只要不是笨蛋, 成為合格的 C++ programmer 完全看個人用不用功腦袋轉不轉得過來. 把 TC++PL, Effective C++, More Effective C++ 好好 K 懂個七成上下並加以應用就很強了 []
del.icio.us:不是李白也能 C++ digg:不是李白也能 C++ spurl:不是李白也能 C++ newsvine:不是李白也能 C++ furl:不是李白也能 C++ Y!:不是李白也能 C++ 黑米共享書籤:不是李白也能 C++ 推推王:不是李白也能 C++
Previous Post
« 五種寫 For Loop 的方法 «
Next Post
» The Free Launch is Back »

Zero Comments »

No comments yet.

Comments RSS TrackBack URI

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>