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