C++0X 真的有進步嗎?

最近看了幾篇 C++0X 的介紹,真的是滿失望的,有興趣的人可以參考附錄。

C++,就我看來是個尷尬的語言。就像是一個羨慕其他人過著現代化生活的老土,嘴巴上說其他人奢侈浪費不應該,自己卻把持不住,但又沒有方法的學了個四不像…

這 個語言的規格制定者一邊想要讓它能用來開發大型專案,一邊又想保有能操作低階資源的能力,結果搞出的語法難懂到不行…參考一下 Java 的作法吧!你可能會說你很注意這方面細節,很小心的維持 code 整齊度及一致性,但在其他人眼中可不是這麼一回事,因為大家都使用不同的 coding convension…如果你有在 MFC(或是其他用大寫當作型態及函式名稱開頭的 library)專案中用 standard c++ library 中的 class,你就會知道我在說什麼──命名規則不一造成程式碼混亂不堪,非常傷眼。

再來是明 明很多的工作被證實可以用 compiler 完成的,確一直是以人工完成。像 RTTI 這種東東是 compiler 再了解不過的資訊,只要在產出的 v-table 中加個參考到 metadata 中不就得了?都什麼年代了,還在 class 的宣告中用一堆巨集"自動"產生這些資訊,放錯位置就一堆完全不是人類能看得懂的編譯錯誤跳出。對那些 framework 的初學者實在是信心的一大打擊!物件導向的資訊封裝在哪?實在令人費解。也許有人會說那是技術、是創意、是對程式語言了解極致!但是換個角度想想,這些在 如 Java、Objective C 或是所有的 script 語言算是基礎建設的東東,什麼時候能出現在 C++ 中呢?換了一批人去 maintain code 時,要花多少時間才能上手?

記 憶體的管理,在 C/C++ 中一直是程式設計師的痛。所以在 C++98時加進了 auto_ptr,破破的自動記憶體回收機制。C++0X 再加上了 shared_ptr,一個官方的、以 reference counting 為基礎 的 garbage collection 機制,總算~但是,為什麼不乾脆將完整的 GC 功能都加上去呢?大師們不可能不知道 吧~想想,加上這個功能,系統不管是在 prototype 的產出、memory leak 的追蹤或是你根本就想將它用在產品中都是非常方便的。這樣,需要效率、即時或是核心的部分使用shared_ptr 或是 auto_ptr,在較外圍的地方則可以使用完整的 GC,這樣一整個系統就都可以用 C/C++ 完成,但對產能又不會有太大的殺傷力。

Thread、socket 還有 non-blocking IO,這在現在的系統也是非常的功能,一樣缺乏官方的支援,要寫個 cross-platform 的程式,自己用 #ifdef 或是 class 慢慢包吧!要不就花錢買商業版,還是找人家寫好的 open source library 來用。但,不一定有你要的平臺。而且,還要重新學習…這跟我們在書本上讀到的程式碼重用或是 pattern(觀念的重用) 跟本就背道而馳…

也 許有人會說 C++ 要保持現在的精簡才能適用在各種環境。但就我看來,這只是不必要的考量,從有然後再去篩減一定是比從沒有重新打造來得快。Embedded linux kernel 就是個好例子。從在 PC 上隨便編都上 MB 的 kernel 到瘦身後只有數百 K,屌!上面說的那些如 GC 等比較 fancy 的功能如果用在受限的環境中,大不了用個編譯器的開關讓開發人員決定要不要使用該功能不就得了?Symbian 中的 C++ 就是這樣的東東,RTTI 及 exception 這兩個功能都被關掉以減少 compiler 的產出物大小(RTTI 在 Symbian 上是沒有相對應的功能。但 exception 則有個 Leave/Trap 做為取代方案。雖然,這是個決策上的錯誤,哈!)

不過,至少這版將 int 的大小明確的定義了出來,看,現在可以用如 int8_t 之類的型態名稱明確的指定要使用的整數長度,不用再自已用 typedef 定義了,這真的很重要!

C++ 的作者說這個語言的使用者在 2004 年有大量的增加,後來被人說是唬爛的。實際的統計數字是如何我不清楚,也不想去花時間在上面。但我所見到的是,大多的系統是以 C 寫成,只有少數不怕死的才用 C++ 寫(好像只有 Symbian 呢~是先驅還是先烈勒?),原因是各家 compiler 產生出來的 ABI 都不同,造成 binary incompatible 無法交互使用,整個系統從 kernel 到 application 都是 compiler dependent(不是說用同一家的就好!還不能有大改版。GCC 2.9 -> GCC 3.0 就是個例子,產生出來的 ABI 完全不相容。所以在 Symbian 上 GCC 2.9 就撐不知道幾個年頭,因為一旦改用新的 GCC 那 build 出來的 executable 就不能用在舊系統了,除非你再用舊的 GCC 再 build 過,同時發佈兩個版本),所以 M$ 的 COM 跟 Mozilla 的 XPCOM 才會用那麼不自然的方法去產生物件,要 cast 時也要以 component 提供的 function 執行之而不能直接以 C++ 的語法轉型,為的就是讓不同的 C++ compiler 產生出來的 DLL 中的 class 能正確的被使用,唉~如果這些大師們真的有心要推這個程式語言,那為什麼不大刀闊斧的做些改變呢?只會在小小的地方鑽著牛角尖,我們這些程式設計師是有多 少青春歲月?

有空可以參考:
: 一系列的文章介紹 C++0X 這個新的 C++ 規格
Boehm GC