各種編程語(yǔ)言的優(yōu)缺點(diǎn)
日期 : 2021年08月02日
正文共 :11621字
【譯注】:圣經(jīng)記載:在遠(yuǎn)古的時(shí)候,人類都使用一種語(yǔ)言,全世界的人決定一起造一座通天的塔,就是巴別塔,后來(lái)被上帝知道了,上帝就讓人們使用不同的語(yǔ)言,這個(gè)塔就沒(méi)能造起來(lái)。巴別塔不建自毀,與其說(shuō)上帝的分化將人類的語(yǔ)言復(fù)雜化,不如說(shuō)是人類自身心靈和諧不再的分崩離析。之所以后來(lái)有了翻譯,不僅是為了加強(qiáng)人類之間的交流,更寄達(dá)了一種愿望,希望能以此消除人際的隔閡,獲求來(lái)自心靈的和諧及慰藉。真正的譯者,把握血脈,撫平創(chuàng)痕,通傳天籟,開(kāi)啟心門(mén)。

這是我寫(xiě)的旋風(fēng)式的編程語(yǔ)言簡(jiǎn)介 —— 我本來(lái)為亞馬遜開(kāi)發(fā)者雜志本月的期刊寫(xiě)的,但是發(fā)現(xiàn)我寫(xiě)的東西沒(méi)法見(jiàn)人。
首先,我偶爾一不小心口出臟話,或者對(duì)上帝不恭的話,所以在很官方很正式的亞馬遜上發(fā)表是不合適的;所以我就把它塞到我的博客里了,我的博客反正沒(méi)人看的。除了你以外。是的,只有你會(huì)看,你好啊。
其次,這是一項(xiàng)進(jìn)行中的工程,現(xiàn)在只是東打一耙西搞一下,還沒(méi)有精加工過(guò)的。又一個(gè)把它寫(xiě)到博客里的很大的理由。不需要很好,或很完整。就是我今天想說(shuō)的一些話。請(qǐng)隨便!
我的旋風(fēng)式簡(jiǎn)介會(huì)講C、C++、Lisp、Java、Perl (我們?cè)趤嗰R遜用到的所有語(yǔ)言)、Ruby (我就是喜歡) 和 Python,把 Python 加進(jìn)來(lái)是因?yàn)?—— 好吧,你看了就知道了,現(xiàn)在我可不說(shuō)。
C
你必須懂C。為哈? 因?yàn)槌鲇谒鞋F(xiàn)實(shí)的理由,這個(gè)世界上你過(guò)去,現(xiàn)在,將來(lái)會(huì)用到的每一臺(tái)計(jì)算機(jī)都是一臺(tái)馮·諾曼機(jī)器,而C是一種輕量級(jí)的,很有表達(dá)力的語(yǔ)法,能很好的展現(xiàn)馮·諾曼機(jī)器的能力。
馮·諾曼架構(gòu)就是你每天都用的計(jì)算機(jī)的架構(gòu)的標(biāo)準(zhǔn):一個(gè) CPU,內(nèi)存,硬盤(pán),一條總線。多核計(jì)算機(jī)并沒(méi)有帶來(lái)本質(zhì)上的變化。馮·諾曼機(jī)是一個(gè)很方便,很便宜,上世紀(jì)五十年代的實(shí)現(xiàn)圖靈機(jī)的技術(shù),圖靈機(jī)是執(zhí)行計(jì)算的最知名的抽象模型。
世上還有其他的計(jì)算的機(jī)器。比如,Lisp 機(jī)器,是上世紀(jì) 50 年代對(duì) Lisp 計(jì)算模型的實(shí)現(xiàn)。Lisp 模型是基于 lambda 代數(shù)的一種計(jì)算語(yǔ)言表示法,后者是與圖靈機(jī)同構(gòu)的一種模型。不像圖靈機(jī),lambda 代數(shù)能被人類讀和寫(xiě)。但是這二者是同等能力的。它們同樣精確的表示了計(jì)算機(jī)能干什么。
Lisp 機(jī)現(xiàn)在不是很流行了,除了在跳蚤市場(chǎng)里。從誰(shuí)更受歡迎來(lái)說(shuō),馮·諾曼機(jī)器贏了。還有一些其他的計(jì)算機(jī),比如神經(jīng)網(wǎng)絡(luò)計(jì)算機(jī),譯者也不知道怎么翻的計(jì)算機(jī)(cellular automata),但是這些都不夠大眾化,至少現(xiàn)在是這樣的。
所以你必須知道C。
還有一個(gè)你必須知道C的原因是,Unix 是用C寫(xiě)的。巧的是,Windows 也是。基本上所有的其他操作系統(tǒng)都是用C寫(xiě)的。因?yàn)檫@些操作系統(tǒng)都是馮·諾曼機(jī)的操作系統(tǒng),你還能用別的嗎? 任何跟C很不一樣的東西都會(huì)跟硬件的實(shí)際能力相差太遠(yuǎn)而導(dǎo)致無(wú)法滿足性能上的需要,至少對(duì)一個(gè)操作系統(tǒng)來(lái)說(shuō)是這樣—至少在上個(gè)世紀(jì)是這樣,碰巧這些系統(tǒng)都是上個(gè)世紀(jì)的。
你還應(yīng)該知道 Lisp。你不必用它來(lái)干實(shí)際工作,雖然它在很多 GNU 的軟件里都會(huì)很用得著。尤其是,你應(yīng)該學(xué)會(huì) Scheme,Lisp 的一種小巧化的,純潔的方言。GNU 的版本叫 Guile。
他們?cè)诼槭±砉ず图又莶死绦聦W(xué)生一到兩個(gè)學(xué)期的 Scheme,這些學(xué)生都對(duì)他們?yōu)楣獙W(xué)這么奇怪的語(yǔ)言抓破腦袋。實(shí)話實(shí)說(shuō),作為第一門(mén)學(xué)習(xí)的語(yǔ)言,這是一個(gè)很爛的選擇,第二門(mén)也是很爛。你應(yīng)該學(xué)會(huì)它,最終,但不是作為第一門(mén)或第二門(mén)語(yǔ)言。
這是很難的哦。這是很大的一步。學(xué)會(huì)怎么用 Lisp 寫(xiě)出像C語(yǔ)言的程序是不夠的,那沒(méi)有意義。C 和 Lisp 一個(gè)就像紅外線,一個(gè)就像紫外線,它們分布在光譜的最兩端。它倆一個(gè)牛逼的地方剛好是另一個(gè)傻逼了的地方。
如果說(shuō),C是最靠近計(jì)算機(jī)是如何工作的語(yǔ)言模型,Lisp 就是最能反映計(jì)算(注意,這里沒(méi)有了“機(jī)”字,計(jì)算機(jī)和計(jì)算是很不同的!譯者注)是如何工作的模型。你不需要懂很多 Lisp,真的。緊咬 Scheme 就哦了,因?yàn)樗亲詈?jiǎn)單最干凈的。其他的 Lisp 已經(jīng)發(fā)展成了很大,很復(fù)雜(很好很強(qiáng)大? 譯者:-)的編程環(huán)境,就像 C++ 和 Java,要有很多庫(kù)啊,工具啊等等之類。那些,你不需要知道。但是你應(yīng)該能用 Scheme 寫(xiě)程序。如果你能夠做出 The Little Schemer 和 The Seasoned Schemer 這兩本書(shū)里的所有習(xí)題,你懂得就夠多了,我認(rèn)為。
但是對(duì)于你天天要做的編程工作,你應(yīng)該基于以下條款選擇你的語(yǔ)言:庫(kù),文檔,工具支持,操作系統(tǒng)集成,資源,和一堆其他的東西。這些條款跟計(jì)算機(jī)如何工作關(guān)系很小,但是跟人類如何工作關(guān)系甚大。
人們還在用很直白的C語(yǔ)言寫(xiě)東西。很多東西。你應(yīng)該懂C!
C++
C++是地球上最蠢的語(yǔ)言,即使是從蠢這個(gè)字的真正意義上出發(fā)。C++很無(wú)厘頭。它不知道自己是什么東西。它沒(méi)有自省(introspective,面向?qū)ο罄锏囊粋€(gè)概念,譯者注)。C也沒(méi)有,但是C不是“面向?qū)ο蟆钡模嫦驅(qū)ο蠛艽蟪潭壬鲜顷P(guān)于要讓你的程序知道它自己。對(duì)象就像演員。所以面向?qū)ο笳Z(yǔ)言應(yīng)該有運(yùn)行時(shí)的自省機(jī)制,知道自己是個(gè)什么類的對(duì)象。C++不是這樣的,真的,你不會(huì)那樣用它。
關(guān)于C:寫(xiě)一個(gè)C的編譯器是那么的簡(jiǎn)單,以至于你可以用C寫(xiě)一個(gè)關(guān)于C的工具,用起來(lái)就像是有內(nèi)省機(jī)制。而 C++ 呢,基本上是不可解析的,所以如果你想寫(xiě)一個(gè)很牛逼的工具用來(lái) —— 比如,告訴你你的虛函數(shù)的原型,或者幫你重構(gòu)你的代碼,你將不得不依賴別人的工具集,因?yàn)槟阕约涸诔悄X子進(jìn)屎的情況下是根本不會(huì)去寫(xiě)一個(gè) C++ 的解析器的。而市面上所有的 C++ 的解析器都很傻逼。
C++很蠢,你不能用蠢語(yǔ)言創(chuàng)造一個(gè)好系統(tǒng)。語(yǔ)言決定世界,蠢語(yǔ)言決定蠢世界。
所有的計(jì)算都基于抽象。你用低級(jí)的東西創(chuàng)造出高級(jí)的東西。但是你不能用分子創(chuàng)造出一個(gè)城市。嘗試使用太低級(jí)別的抽象只會(huì)給你帶來(lái)麻煩。
我們就惹上麻煩了 (是指亞馬遜的員工,還是所有 C++ 的程序員? 我也不知道,譯者注)。
理智的情況下,你用C寫(xiě)的最大的東東就是一個(gè)操作系統(tǒng)。而操作系統(tǒng)其實(shí)不是很大的,真的。它們看起來(lái)很大,但那是因?yàn)樗鼈冇泻芏鄳?yīng)用軟件,操作系統(tǒng)本身的內(nèi)核是蠻小的。
你用 C++ 能寫(xiě)的最大的東東是…也是操作系統(tǒng)。好吧,或許稍微再大點(diǎn)兒。讓我們說(shuō),再大三倍吧。或者 10 倍吧。但是操作系統(tǒng)內(nèi)核最多也就,那啥,一百萬(wàn)行代碼? 所以我說(shuō)你能用 C++ 寫(xiě)的最大的系統(tǒng)大概也就是一千萬(wàn)行代碼吧,再大的話就開(kāi)始不行了,這玩意兒你沒(méi)法控制了,就像恐怖片里的…
我說(shuō)的一千萬(wàn)行是指如果你那時(shí)候還能讓你的系統(tǒng)編譯通過(guò)的話。
我們(在亞馬遜,譯者注)有五千萬(wàn)行 C++ 代碼。不,現(xiàn)在還要更多了。我已經(jīng)不知道有多少行了。上個(gè)圣誕節(jié)是五千萬(wàn)行,那是九個(gè)月前,而它以每季度八百萬(wàn)行的規(guī)模增長(zhǎng)。增長(zhǎng)率本身也增長(zhǎng),媽呀。
我們想在這個(gè)系統(tǒng)里干點(diǎn)啥好像要一萬(wàn)年。一個(gè)亞馬遜工程師有一次這樣描述我們的代碼庫(kù):“一座很大的屎山,你見(jiàn)過(guò)的最大的山,每次你想修正一個(gè) bug,你的工作就是爬到屎山的正中心去。”
伙計(jì)們,那哥們可是在四年前說(shuō)的這話。他現(xiàn)在已經(jīng)到更環(huán)保綠色的牧場(chǎng)上去了。真是太可惜了,他可是個(gè)實(shí)實(shí)在在的高手啊。
這都是 C++ 的錯(cuò)。別跟我爭(zhēng)論。就是的。我們用的是世上最蠢的語(yǔ)言。這簡(jiǎn)直有點(diǎn)老板級(jí)的蠢,你說(shuō)呢? (譯者注,meta 在計(jì)算機(jī)術(shù)語(yǔ)里通常表示更高一個(gè)層次,比如,meta-language,比普通的 language 高一個(gè)層次,意思是關(guān)于語(yǔ)言的語(yǔ)言。哲學(xué)里應(yīng)該會(huì)經(jīng)常用到這個(gè)詞。我不懂哲學(xué),但是我覺(jué)得老板們總是比我們高一級(jí),所以 meta-dump 我就翻譯成老板級(jí)的蠢嘍。:-)
說(shuō)了以上這些難聽(tīng)的話,話得說(shuō)回來(lái)了。用 C++ 寫(xiě)出漂亮的代碼顯然是可以的,我的意思是說(shuō),這樣的代碼應(yīng)該大部分還是C,偶爾很有品味的,很有節(jié)制的用一點(diǎn)C++。但是這種代碼幾乎從來(lái)不會(huì)被寫(xiě)出來(lái)。C++是個(gè)很好玩的游樂(lè)場(chǎng),而如果你把它玩兒得門(mén)兒清的話你會(huì)覺(jué)得自己特牛,所以你總是被誘惑把你知道的所有的東西都用上。但是那是很難做好的,因?yàn)閺囊婚_(kāi)始這個(gè)語(yǔ)言就太狗屎了,最終,你會(huì)弄得一塌糊涂,即使你很能干。
我知道,我說(shuō)的都是異端邪說(shuō),該被釘?shù)绞旨苌系摹kS便吧。我在大學(xué)里的時(shí)候老喜歡 C++ 了,因?yàn)槲夷菚r(shí)候就只知道這一門(mén)語(yǔ)言。當(dāng)我聽(tīng)到我的語(yǔ)言教授,Craig Chambers,絕對(duì)的厭憎C++,我想:“為啥呢? 我覺(jué)得它挺好的啊”。而當(dāng)我聽(tīng)到 STL (標(biāo)準(zhǔn)模板庫(kù))的發(fā)明者被采訪時(shí)說(shuō)他恨 OOP (面向?qū)ο缶幊?時(shí),我更是認(rèn)為他肯定是磕藥了。怎么會(huì)有人恨 OOP 呢,而這個(gè)人竟然還是 STL 的發(fā)明者?
親不敬,熟生厭(語(yǔ)出圣經(jīng),譯者注)。說(shuō)的是在大多數(shù)情況下,跟一件事物熟悉了之后你就失去對(duì)它的膜拜尊敬了; 在計(jì)算機(jī)語(yǔ)言里情況不是這樣的。光對(duì)一門(mén)語(yǔ)言熟悉不會(huì)導(dǎo)致你看輕這門(mén)語(yǔ)言。你必須成為另一門(mén)更優(yōu)秀的語(yǔ)言的專家(才能讓你明白原來(lái)那門(mén)語(yǔ)言有多么多的問(wèn)題)。
所以如果你不喜歡我針對(duì) C++ 大放厥詞,請(qǐng)你去學(xué)另一門(mén)語(yǔ)言并成為一個(gè)專家(我推薦 Lisp),只有那時(shí)你才有足夠的武器與我爭(zhēng)論。然而,那時(shí)你將不會(huì)跟我爭(zhēng)了。你上了我的當(dāng)了。你也會(huì)跟我一樣變得不喜歡 C++ 了,你或許會(huì)覺(jué)得我這個(gè)人很惡心,把你騙得不喜歡自己曾經(jīng)的最愛(ài)了。所以或許你應(yīng)該把我說(shuō)的一切都忘了。C++挺好的其實(shí),真的。它就是很棒棒(譯者注,作者在這里用了 ducky,這是一個(gè)女性喜歡用的夸某物好的詞,近來(lái)也為玻璃們喜愛(ài))。忘了我說(shuō)的話。C++不錯(cuò)的。
Lisp
(我打賭這一節(jié)會(huì)讓你覺(jué)得驚訝,即使你已經(jīng)關(guān)注我的博客有一陣了[譯者注,作者也可能是說(shuō),即使你成為亞馬遜的員工有一陣了])
亞馬遜創(chuàng)業(yè)之初,我們有很多明星級(jí)的工程師。我不認(rèn)識(shí)他們所有人,但是我認(rèn)識(shí)幾個(gè)。
比如?Shel Kaphan, 大拿。Greg Linden, 大拿。Eric Benson。即使在他加入亞馬遜之前就已經(jīng)有自己響亮的名氣了。也是大拿。
他們寫(xiě)了 Obidos 服務(wù)器。是 Obidos 讓亞馬遜成功的。只是后來(lái)那些生產(chǎn)大便很拿手的工程師,網(wǎng)頁(yè)開(kāi)發(fā)者,搞前端的人 —— 這些人因?yàn)樯a(chǎn)大便很拿手而總是能讓經(jīng)理們滿意 —— 只是在后來(lái)這些人把 Obidos 搞糟了。(他們的大便)把整條河都堵了,打個(gè)比方說(shuō)的話。但是 Obidos 是亞馬遜最初的成功的一塊關(guān)鍵的基石。
這些最早的牛人們?cè)趤嗰R遜神圣的代碼庫(kù)里只允許兩種語(yǔ)言:C 和 Lisp。
你自己去想吧。
當(dāng)然,他們所有人都使用 Emacs。靠,Eric Benson 是 XEmacs 的作者之一。這個(gè)世界上所有偉大的工程師都在用 Emacs[注1]。那種世界因你而不同級(jí)別的偉大。不是坐在你旁邊的格子里的那哥們那種偉大。也不是 Fred,走廊盡頭那哥們。我說(shuō)的是我們這個(gè)行業(yè)里最偉大的軟件開(kāi)發(fā)者,那些能改變這個(gè)工業(yè)的面貌的人。像 James Gosling 們(Java 語(yǔ)言設(shè)計(jì)者),Donald Knuth 們(這個(gè)人沒(méi)有聽(tīng)說(shuō)過(guò)的話趕緊改行吧,別搞計(jì)算機(jī)了),Paul Graham 們[注2],Jamie Zawinski 們,Eric Benson 們。真正的工程師用 Emacs。你必須很有點(diǎn)聰明才能把 Emacs 用好,而如果你能成為一個(gè) Emacs 大師的話它會(huì)給你難以置信的牛力。有機(jī)會(huì)的話你應(yīng)該站到 Paul Nordstrom 的肩后看看他是怎么工作的,如果你不相信我的話。對(duì)那些一輩子都在用爛 Visual Studio 之類的集成開(kāi)發(fā)環(huán)境的人來(lái)說(shuō),一定會(huì)大開(kāi)眼界的。
Emacs 是那種你可以用 100 年的編輯器。
Shel, Eric, Greg,和其他像他們那樣的人,我沒(méi)有足夠幸運(yùn)能跟他們直接一起工作:他們禁止在這里使用C++,他們禁止使用 Perl(或者 Java,為完整起見(jiàn))。他們是明白人。
現(xiàn)在我們都在用C++,Java 和 Perl 了,所有的代碼都用這些語(yǔ)言。我們的前輩們已經(jīng)到更環(huán)保的牧場(chǎng)上去了 (指沒(méi)有大便的牧場(chǎng),譯者注)。
Shel 用 C 寫(xiě)了 Mailman,客服部的人把它用 Lisp 封裝了一下。Emacs-Lisp。你不需要知道 Mailman 是什么東西。除非你是個(gè) Amazon 的老員工,或許不是搞技術(shù)的,而且你曾經(jīng)不得不讓客戶哈皮 (只有在這種情況下你才需要知道 Mailman,譯者注)。不是間接的,因?yàn)槟阌?C++ 寫(xiě)的一個(gè)狗屎功能跑不起來(lái)了,讓客戶很生氣,于是你不得不去搞定它以恢復(fù)客戶的哈皮度。不,我是說(shuō)直接的,意思是,你必須跟他們聊。我們可愛(ài)的,不識(shí)字的,呱呱其談的,心地善良的,充滿希望的,困惑的,能幫點(diǎn)小忙的,憤怒的,哈皮的客戶們,真正的客戶們,那些從咱們這里買(mǎi)東西的人,我們的客戶們。(如果你必須跟他們打交道的話,)那你就會(huì)知道 Mailman 這個(gè)東西。
Mailman 是客服部的客戶電子郵件處理軟件,我們用了它有…四,五年? 反正是很長(zhǎng)時(shí)間。它是用 Emacs 寫(xiě)的,所有人都愛(ài)死它了。
人們現(xiàn)在還很愛(ài)它。直到今天,我依舊不得不聽(tīng)我們一些非技術(shù)員工跟我長(zhǎng)篇大論的叨叨他們是多么的懷念 Mailman。我可絕不是滿嘴噴糞。上個(gè)圣誕節(jié)我參加了一個(gè) Amazon 的派對(duì),一個(gè)我不知道自己怎么會(huì)被邀請(qǐng)的派對(duì),里面全是些西裝筆挺的商務(wù)人士,誰(shuí)都長(zhǎng)得比我?guī)洠任夜怩r。以及一些我在公司里曾經(jīng)打過(guò)交道的人(這句不知道怎么譯)。四個(gè)美女認(rèn)出了我是在客服部里干的,把我包圍了,跟我說(shuō)了十五分鐘她們是多么的懷念 Mailman 和 Emacs,而現(xiàn)在的亞馬遜(我們用 JSP 花了好多年準(zhǔn)備換掉 Mailman 的那一套軟件)是怎么的不能滿足她們,讓她們覺(jué)得跟以前一樣爽。
這一切都太夢(mèng)幻了,我覺(jué)得她們可能是喝多了。
Shel 是個(gè)天才。Emacs 是天才。連非技術(shù)人員都愛(ài) Emacs。我現(xiàn)在就是在 Emacs 里打這些文字。我絕不情愿在任何其他地方打字。這不只是關(guān)于讓你的效率得到飛躍,通過(guò)那些地球上其他地方找不到的快捷鍵和文本編輯功能。我每分鐘打一百三到一百四十個(gè)英文單詞,在 Emacs 里,當(dāng)我在寫(xiě)沒(méi)有格式要求的文本的時(shí)候。我測(cè)過(guò)這個(gè)時(shí)間速度。自己寫(xiě)了一個(gè)測(cè)打字速度的 Emacs 應(yīng)用。但我想跟你說(shuō)的不只是這個(gè)。
Emacs 有的是一種你叫不出名字來(lái)的品質(zhì)。
我們現(xiàn)在不用 Mailman 了。那是因?yàn)槲覀冇幸环N叫得出名字的品質(zhì) —— 就是,爛。我們很爛。我們(當(dāng)時(shí))找不到 Emacs-Lisp 足夠牛的人把 Mailman 繼續(xù)搞下去。今天這應(yīng)該不難了; 亞馬遜現(xiàn)在到處都是 Emacs Lisp 的黑客。但是在那時(shí)候,客服部的人沒(méi)法從別人那里得到幫助。于是他們就用他們當(dāng)時(shí)手頭有的資源去搞這件事。他們當(dāng)時(shí)沒(méi)有足夠多的 Emacs-Lisp 的人。有一段時(shí)間,他們甚至找來(lái) Bob Glickstein 當(dāng)合同工,那個(gè)給 O’Reilly 寫(xiě)了那本 Gnu Emacs 擴(kuò)展的書(shū)的家伙,坐在一個(gè)小辦公室里給 Emacs 寫(xiě) Mailman 的擴(kuò)展。
客服應(yīng)用部是 Amazon 的第一個(gè)兩塊比薩餅的團(tuán)隊(duì)(代表團(tuán)隊(duì)人數(shù)的增加,編者注)。這個(gè)團(tuán)隊(duì)是完全自立的。不管是那時(shí)還是現(xiàn)在。沒(méi)人跟他們說(shuō)話,沒(méi)人幫他們。沒(méi)有槍,沒(méi)有炮,他們自己造。他們沒(méi)有網(wǎng)頁(yè)工程師,沒(méi)有支持工程師。屁也沒(méi)有。有的只是一堆骨灰級(jí)的工程師和一個(gè)能帶新人的文化。這就是他們需要的一切了。
但他們最終不得不讓 Mailman 光榮退休。媽哎。而我呢今天還聽(tīng)到人們說(shuō)他們是多么的懷念它。甚至在派對(duì)上。
我想今天按人頭比例來(lái)說(shuō),客服部仍然擁有比亞馬遜任何其他團(tuán)隊(duì)更多的 Lisp 黑客。可能他們用到 Lisp 的機(jī)會(huì)不多了,但是 Eric Raymond 說(shuō)過(guò),即使你很少用 Lisp 寫(xiě)程序,學(xué)習(xí) Lisp 會(huì)是意義深遠(yuǎn)的一個(gè)經(jīng)歷,能讓你下輩子都成為一個(gè)更好的工程師。
卡爾,宗教現(xiàn)在已經(jīng)不是大眾的精神鴉片了。現(xiàn)在鴉片是集成開(kāi)發(fā)環(huán)境了。(卡爾·馬克思。這個(gè)人不知道的話應(yīng)該打屁屁)。
Java
Java 是過(guò)去的 10 年中計(jì)算行業(yè)里發(fā)生過(guò)的最好的同時(shí)也是最壞的事。
一方面,Java 把你從 C++ 編程的很多枯燥易錯(cuò)的細(xì)節(jié)中解救出來(lái)了。沒(méi)有數(shù)組越界了,沒(méi)有 core dump 了。拋出來(lái)的異常能讓你精確定位到出錯(cuò)的那一行代碼,而且 99% 的時(shí)候都是正確的那一行出錯(cuò)了的代碼。對(duì)象們?cè)谛枰臅r(shí)候能智能地把它們自己打印出來(lái)。等等等等。
另一方面,除了是一種語(yǔ)言,一個(gè)虛擬機(jī),一個(gè)巨無(wú)霸的類庫(kù),一個(gè)安全模型,一個(gè)可移植的字節(jié)碼格式,Java 還是一個(gè)宗教。邪教。所以你不能太相信對(duì)它太虔誠(chéng)的人。想要招一個(gè)好的 Java 工程師是一項(xiàng)很有技術(shù)挑戰(zhàn)的活。
但是總的來(lái)說(shuō),Java 是軟件工程史上的一大進(jìn)步。
從 C++ 到 Java 不只是語(yǔ)法上的改變。這是一種需要一段時(shí)間去好好體會(huì)的一種震撼性的世界觀的轉(zhuǎn)變。這有點(diǎn)像突然你被配了一個(gè)執(zhí)行助理。你知道老總們?yōu)槭裁纯偸呛孟裼袝r(shí)間去開(kāi)會(huì),總是知道公司現(xiàn)在運(yùn)行的情況,總是寫(xiě)出很酷酷的文檔嗎? 老總們常常忘記其實(shí)他們不是一個(gè)人在戰(zhàn)斗,他們都是兩個(gè)全職的人,他們和他們的執(zhí)行助理們。有一個(gè)執(zhí)行助理把你從瑣事中解救出來(lái)讓你有時(shí)間去思考那些真的需要你去解決的問(wèn)題; 沒(méi)有的話你將不得不花一半的時(shí)間在那些無(wú)聊的世俗的事情上。切換到 Java 編程語(yǔ)言就把你變成了兩個(gè)程序員 —— 一個(gè)處理那些你不需要關(guān)心的東西,另一個(gè)可以集中精力在問(wèn)題本身上。這是一個(gè)很震人的改變,一個(gè)你應(yīng)該很快就能習(xí)慣能喜歡上的改變。
就像 Jamie Zawinski (Netscape 牛人,開(kāi)發(fā) Mozilla 瀏覽器,好像學(xué)歷是高中畢業(yè)?)在他著名的“Java 真爛(java sucks)”那篇文章里說(shuō)的:“先說(shuō)那些好東西:Java 沒(méi)有 free() 函數(shù)。我必須一開(kāi)始就承認(rèn),其他的東西都沒(méi)什么了不起。(沒(méi)有 free)是能讓我原諒其他所有東西的特性,不管其他東西有多爛。講完這一點(diǎn)后,我的文章里其他一切幾乎都完全沒(méi)有重要性了。”
Jamie 的文章寫(xiě)在 1997 年,按 Java 年來(lái)算的話是很早以前了,跟他寫(xiě)這篇文章時(shí)比,Java 已經(jīng)有很大的改善; 一些他抱怨的東西甚至已經(jīng)被 fix 了。
但是大多數(shù)還是沒(méi)有被 fix。Java 作為一門(mén)語(yǔ)言還是有點(diǎn)爛。但就如 Jamie 指出的,Java“是今天為止最好的語(yǔ)言。我的意思是說(shuō),它是今天市面上那些爛得底兒掉地一堆語(yǔ)言比起來(lái)有那么一點(diǎn)能被我接受。”
真的,你應(yīng)該讀讀他那篇文章。
Java 幾乎每一方面都很好,除了它的語(yǔ)言本身,而這是 JWZ 抱怨的主要對(duì)象。但那是一個(gè)很大的抱怨。再好的庫(kù)也救不了一個(gè)爛語(yǔ)言。相信我:你可能比我知道多得多的東西,但是我知道好兵救不了爛將。在 Geoworks 搞了五年匯編語(yǔ)言都會(huì)了我這個(gè)道理。
跟 C++ 比,Java 作為一個(gè)語(yǔ)言還過(guò)得去。好吧,別扯了,Java 要好很多。因?yàn)樗?內(nèi)建)的字符串。哥們,你說(shuō)一個(gè)沒(méi)有內(nèi)建的字符串的語(yǔ)言是人用的嗎。
但是 Java 跟 C++ 比少了一些好東西,比如(函數(shù)調(diào)用時(shí))傳引用,棧上的對(duì)象,typedef,宏,以及運(yùn)算符重載。一些時(shí)不時(shí)地會(huì)很稱手的東西。
哦,還有多重繼承,我現(xiàn)在老了,反而挺欣賞了的多重繼承。如果你認(rèn)為我這個(gè)觀點(diǎn)僵硬不靈活的家伙是多態(tài)教義很好的反例的話,我倒是可以給你舉幾個(gè)為什么你需要多態(tài)繼承的好例子,或者至少像 Ruby 那樣的 mixin 或者自動(dòng)的派遣。下次問(wèn)問(wèn)我白龍馬的事情。今天我要告訴你為什么 Java 的 interface 是個(gè)爛貨。
幾年前 Gosling 自己都說(shuō),如果一切都能重來(lái)的話,他不會(huì)搞出個(gè) interface 的概念。
但是那正是 Java 的問(wèn)題。當(dāng) James 說(shuō)出那句話的時(shí)候,人們被雷到了。我甚至能感覺(jué)到那股雷勁兒,能感覺(jué)到 Sun 公司市場(chǎng)部和法務(wù)部的鳥(niǎo)人是多么想把 James 滅口,然后告訴大家他沒(méi)那么說(shuō)過(guò)。
Java 的問(wèn)題就是人們都被那幫人搞的廣告效應(yīng)蒙住了眼。C++,Perl,任何流行語(yǔ)言都有這個(gè)問(wèn)題。這是很嚴(yán)重的,因?yàn)槿绻麤](méi)有一些說(shuō)大話吹牛逼的廣告,一個(gè)語(yǔ)言是不會(huì)流行起來(lái)的。所以如果一個(gè)語(yǔ)言的設(shè)計(jì)者說(shuō)他的語(yǔ)言沒(méi)有被設(shè)計(jì)得很完美的話,就是趕緊用麻醉槍射擊這胡說(shuō)八道的家伙并關(guān)閉會(huì)議的時(shí)候了。
語(yǔ)言們需要放點(diǎn)兒衛(wèi)星才能活,我只希望人們不要被衛(wèi)星耀瞎了眼。
我學(xué)了面向?qū)ο缶幊蹋?我自己也對(duì)此大吹大擂。當(dāng)我加入亞馬遜時(shí),我不能告訴你我有什么智慧或者經(jīng)驗(yàn),但我可以給你背誦出所有關(guān)于 OOP 的魔咒。多重繼承是邪惡的,因?yàn)榇蠹叶歼@么說(shuō); 運(yùn)算符重載是邪惡的,諸如此類。我甚至有點(diǎn)模糊地知道為什么是邪惡的,但實(shí)際上不知道。后來(lái)我明白了,這些都不邪惡,不是爛玩意兒,爛的是開(kāi)發(fā)者,是我。我現(xiàn)在還是爛,但是希望每年都不爛一點(diǎn)起來(lái)。
上禮拜我碰到一個(gè)來(lái)面試的,他告訴我多繼是邪惡的,因?yàn)椋热纾憧梢詮念^,胳膊,腿,軀干多重繼承出一個(gè)人來(lái)。他既是對(duì)的,又是錯(cuò)的。那樣的多繼情形當(dāng)然邪惡,但那都是因?yàn)樗约禾皭毫恕D菢永^承出來(lái)的“東西”遠(yuǎn)遠(yuǎn)就能看見(jiàn)有多蠢,如果他還把這玩意兒弄進(jìn)門(mén)來(lái)那就更邪惡了。
不良開(kāi)發(fā)者,占了這世上開(kāi)發(fā)者的大多數(shù),他們能用你扔給他們隨便什么語(yǔ)言寫(xiě)出不良的代碼。
說(shuō)了這些,還是得說(shuō)回來(lái),多繼不是請(qǐng)客吃飯那么輕松的事兒; mixin 看起來(lái)是更好的解決方案,但是還沒(méi)人完美的解決這個(gè)問(wèn)題。但我還是認(rèn)為 Java 比 C++ 好,即使它沒(méi)有多繼。因?yàn)槲抑啦还芪业某霭l(fā)點(diǎn)是多么好,某一天我還是會(huì)被一堆不懂怎么寫(xiě)好代碼的人包圍,讓他們用 Java 比用 C++ 會(huì)帶來(lái)更少的傷害。
此外,Java 除了語(yǔ)言本身外還有老多其他的重要有用的東西。且 Java 語(yǔ)言本身也在進(jìn)化,雖然像冰川一樣慢,所以我們還是能看到希望。Java 正是我們應(yīng)該在亞馬遜推薦使用的語(yǔ)言。
你就是得小心點(diǎn)兒,因?yàn)楹推渌魏握Z(yǔ)言一樣,你能很容易找出一堆人,他們很懂一門(mén)語(yǔ)言及其編程環(huán)境,但對(duì)品味,計(jì)算或者其他任何重要的東西卻一無(wú)所知。
當(dāng)你有懷疑時(shí),還是雇那種會(huì)好幾門(mén)語(yǔ)言的 Java 程序員,那種厭憎 J2EE/EJB 之類松松跨跨的所謂框架的,那種使用 Emacs 的。這都是一些實(shí)戰(zhàn)經(jīng)驗(yàn)。
Perl
Perl,怎么說(shuō)呢?
Perl 是個(gè)老朋友。老老朋友。我開(kāi)始寫(xiě) Perl 代碼的時(shí)候,可能是 1995 年。而它為我很好的服務(wù)了差不多 10 年的時(shí)間。
它就像你騎了十萬(wàn)二十萬(wàn)英里的老自行車,你心里永遠(yuǎn)有一塊地方裝著它,雖然現(xiàn)在你已經(jīng)換了一輛更加現(xiàn)代化的只有五磅重的自行車,而且這一輛也不像老的那輛頂?shù)媚闫ㄑ厶哿恕?/span>
Perl 受歡迎原因有仨:
用 Perl 你很快就能搞定你的問(wèn)題。而這是最終的衡量標(biāo)準(zhǔn)。 Perl 有世上最好的市場(chǎng)推廣。你可以寫(xiě)一本介紹他們市場(chǎng)推廣有多絕的書(shū)。Sun 公司砸大筆錢(qián)給 Java 推市場(chǎng),Perl 在受歡迎程度來(lái)說(shuō)能跟 Java 齊頭并進(jìn),但 Perl 純粹是依靠 Larry Wall 和他那幫哥們的三寸不爛之舌做市場(chǎng)。哈佛商學(xué)院的人應(yīng)該去研究 Perl 的市場(chǎng)是怎么做出來(lái)的。真的讓人瞠目結(jié)舌。 直到差不多,呃,現(xiàn)在,Perl 沒(méi)有真正的競(jìng)爭(zhēng)者。
— THE END —

