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