最近更新: 2007-06-25

Metaprogramming - To Use C/C++ with Dynamic Languages is Easier Than Pure C++

日前在回應 jaceju 《PHP為什麼快》一文時,我提到PHP 之所以快,確實跟它骨子裡包的是 C 語言函數有關。Python, Ruby 也是。在某種程度上,這造成了C++的衰退。因為用C語言寫函數庫給 PHP/Python/Ruby使用,還比寫一個C++ template class 簡單。

C++ template 語法出現後,改善了 C++ 的中介編程能力。例如,在傳統的 C++ 中,當我們設計一個新的類時,常常要附帶編寫多組型別轉換與運算子方法。這些動作的程式碼通常形式相同,僅有型別差異。亦即,如果我們像動態語言那樣把型別宣告的部份省略,程式碼是相同的。 template 語法出現後,可以將型別參數化,由編譯器根據 template 內容代入實際參數,產生程式碼。如此便不需要重覆「剪貼程式碼 -> 修改型別」的傳統 C++ 編碼動作。

不幸的是,我覺得「奧妙的 template 」很難搞,所以很多人心有餘而力不足,以至於 C++ 之父 Bjarne Stroustrup 至今仍在呼籲大家多多開發 C++ class library 。

當純C++ 碰到 class library 不足的困境了,那些用 C/C++ 開發的動態語言卻不見這種困境。現今主流的 Perl, Python, Ruby, PHP 等等動態語言,個個都是用 C/C++ 開發的,也藉助 C/C++ 的高度可攜性提供了多種不同作業平台的版本。它們從來不擔心 library 不足,總是有人用 C/C++ 為它們寫 extensions ,不斷地擴充它們的 library 。於是我寧願用 C/C++ 開發傳統的 library (C++ library 的發展困境)。我不由得再度想到「 C 語言萬壽無疆, C++ 無壽無疆」這句話( CSDN《程序員》2006 年 6 月刊)。

關於用 C 語言編寫 PHP, Ruby extension 的文件,可參考下列連結:

樂多舊網址: http://blog.roodo.com/rocksaying/archives/3528035.html

樂多舊回應
未留名 (#comment-11041051)
Mon, 25 Jun 2007 19:10:45 +0800
真巧,我最近再想的議題也是跟石頭大哥說的這個有關.最近覺得搞清楚究竟什麼是Dynamic Language還蠻重要的,就去找了資料閱讀,順便推薦一下這篇講Dynamic Language的.

以我現在的知識,會考量自己對solution的解法組合.例如是以ruby為系統主開發框架,在很多地方使用C寫函式庫給ruby用,應該要考量一下,這個函式庫的變動是否頻繁,若將maintain列入考量,則考量是否要用C++ or java.
未留名 (#comment-11043709)
Mon, 25 Jun 2007 23:27:09 +0800
動態語言和靜態語言的區分,請看這篇

另外,在設計函數庫時的重要考量是開放封閉性。不管怎麼維護,使用方都不需要跟著變。更進一步說,基本上是不考量使用方採用什麼程式語言的。舉個例子來說, PHP 所用到的各種 C 函數庫的內容,這十年來也一直在更新。但我十年前寫的 PHP 程式碼,並不需要跟著 C 函數庫的更新而修改啊。

所以你現在想的解法,可能是因為你常常碰到函數庫設計不良的情形,所以你才會覺得兩邊要用一樣的語言比較好維護。但這種解法其實不會改善問題,設計不良的函數庫就是會常常牽累使用方跟著變動。
未留名 (#comment-11045301)
Tue, 26 Jun 2007 06:40:22 +0800
你誤會了我的意思,我並不是說兩邊要用一樣的語言,而是指組合的問題,就像我的想法也是大部分的時候用Ruby + C去堆疊,我所謂的選擇是指用C開發函式庫這邊的選項而已,比如說是換成Ruby + C++的開發組合.
用動態語言去組合其他現成已經表現的最好的函式庫.