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