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 的文件,可參考下列連結:
- PHP PECL
- PHP: Extention Writing by Derick Rethans.
- Ruby C API Reference
- Ruby: Extending Ruby (Programming Ruby).
樂多舊回應