很久很久以前,世界上曾經存在著這么一種語言,用它寫出來的代碼,既能保證高效的運行效率,又兼具優雅十足的美感,并且,所有語言存在著的不足,都可以通過添加新的自定義的類型來實現出來,并且,新的類型,只要做得好,可以與原有的類型無縫交互。在它的世界里面,那是一切皆有可能。并且,它還承諾,雖然它的功能非常豐富,但各個功能特性都可以和睦相處,而且,你代碼中不必要用到某項功能時,你完全不必為這項功能付出那怕一丁點的代價,如果這個語言愿意作一點點妥協,可能它就不是現在的這個樣子,至少將更加容易使用。所有它承諾的一切,乍聽起來美妙無比,而且,它也似乎做到了,真的做到了馬兒既能跑,又能吃盡量少的草,前提是開發人員要小心翼翼地用好這門語言的一切特性。只可惜事與愿違,這門語言確實看起來,真的可以創造出完美的東西,但事實上,沒有人能用它寫出過一個好東西,那怕是簡簡單單的字符串,要做得大多數人拍手叫好,也是千難萬難,完美的字符串,從來就沒有出現過。各位同學,自然知道在下說的是什么語言,等千呼萬喚的C++1X始出來之后, 真不知道還有什么東西,是C++沒法做的,要在C++中增加幾種新的編程模式,也不會有太多的困難。起碼,函數式的編程,使函數好像成為一等公民,絕不是什么難事。
C++本身自然不會有什么問題,說它復雜吧,它確實復雜,但是完全可以無視,異常不好,禁用就是;多繼承很壞,不用就是;模板過于復雜,忘了它吧;……,起碼它做到了,你不喜歡的特性,你可以不必付出任何代價。但是,成千上萬的C++高手大牛巨俠,這么多年下來,卻沒有搞出幾個似模似樣的類庫出來,除了STL(其實STL也有一些問題),難道是程序員錯了,難道是他們全錯了嗎?可是,C、JAVA、PYTHON它們,怎么就不存在這些問題呢,里頭的好東西還真不少,起碼在它們的圈子里面,碼農們都覺得類庫沒問題,很好,用起來很放心,可以放心的使用。又或者是,C++碼農對自家的類庫要求過高了,他們的眼光太挑剔了,大家人人都有多疑癥,但是,一旦他們使用其他的語言,又很樂意使用其他語言所提供的類庫或者是框架,怎么就不會那樣疑神疑鬼,沒有各種并發癥,起碼在下是這樣的,你要說C++沒問題,那鬼才愿意相信呢?那么,假如C++有問題,問題又是那里呢?
我以為,C++的問題,就在于它似乎很鼓勵碼農制造輪子,撰寫類庫,然后對所寫的類庫貌似沒有過多的要求,但實際上,C++對類庫的要求,是所有語言中最高的。好比,要你寫的軟件,需求很不明確,貌似用戶說,你隨便寫,然后它能完成任務就可以了,但實際上這樣的軟件最難開發了。知道嗎?C++的類庫,有什么樣的要求:1、運行的效率要高,處理一切細節,高效源于對細節的特定處理;2、表現出來的接口和語義要無限接近原始內嵌的類型,值語義,吖的,這要求也太高了。3、要有足夠的通用性,滿足抽象的需要。這三條的任何一條都不是什么省油的燈,直接可以K死秒殺多少C++高手的幾千萬只脆弱的腦細胞。這三條下來,本身就差不多是一個難以完成的事情,但是,這還不是最要命。最能搞死人的,是C++又提供了太多的豐富特性,什么模板、操作符重載、異常、多繼承、內聯、……,心理學的一項研究表明,當選擇太多之時,當事人就會分散精力,不知道如何選擇。用C++開發類庫,眼前存在著無限種選擇,貌似條條大路通羅馬,但實際上,卻是條條大路是死路。但這也沒什么,最后一擊,如果沒有必要,鬼才愿意費心費神寫類庫,關鍵在于C++只是提供實現高標準類庫的基本平臺而已,語言本身就沒有一點點能用的實在的東西,那怕一個簡單的字符串類,一切都必須通過類庫來完成,它一開始一直都在鼓勵碼農寫類庫,試問普天之下,有那個C++碼迷,能夠抑制造輪子的誘惑,于是,悲劇就誕生了。
反觀其他的語言,為什么就不存在這些問題呢?
在C里面,是絕對不會出現C++的類庫困境,首先,它只有一種選擇讓你開發類庫,那就是函數和函數指針,外加結構體、數組,或者,必要的時候,使用上點宏,嗯,就只有這么多。你要用就用,不用就拉倒,在這么有限的條件,你只能做出最簡單但卻又是最精妙的設計,都能直達問題的本質。基本上,C的設計,不會存在一點點多余的抽象層次,一拳一拳,都打在要害上,針針見血。更何況,C的要求也不高,除了效率之外,就是要保持函數接口語義的清晰,而這并不難做到。
那么,在高級語言中,又是另一番天地了。當然,它們也提供了多數C++的豐富特性,你自然有很多選擇,但是,這些語義卻屏蔽了很多底層的細節,并且提供了豐富的語言平臺特性,什么反射啊、豐富的API框架,單是垃圾回收和單繼承,就功德無量,足以拯救多少弱小脆弱的靈魂。是的,人家效率確實不太高,也沒有要求值語義,但這不要緊,因為人家語言一開始就沒有這樣的效率標榜要求,它們一上來就讓碼農直面慘淡的應用,進入問題領域,不需要撰寫什么高通用性的類,因為平臺本身就提供了,你要寫的類,都是問題領域中的東西。這實在能解救多少腦細胞啊,減少多少不必要的工作量啊呢。
沒有必要的類庫來支持,C++做開發,工作量相當浩大,并且還容易生產出一堆不成熟的通用類;但是,必要的成熟的類庫,市面上又沒有多少個,目前的所謂的高級的C++類庫,大多數都在為了C++而C++,你們知道我在說的是那一個的。當然,俺是沒能力寫出什么類庫的,所謂的眼高手低,大概就是這樣吧。
或者,痛并快樂著,是C++碼迷的持久不退的熱情所在。只是,人生何其寶貴,將它們浪費在C++上,實在有點不值得。當然,活著只要快樂就好,C++也確實能給人帶來很多快樂。