天天看點

Tour De Babel C C++ Lisp Java Perl Ruby Python

轉自:http://code.google.com/p/windows-config/wiki/TourDeBabel

#title Tour De Babel

通天塔導遊

(譯注:聖經記載:在遠古的時候,人類都使用一種語言,全世界的人決定一起造一座通天的塔,就是巴别塔,後來被上帝知道了,上帝就讓人們使用不同的語言,這個塔就沒能造起來。 巴别塔不建自毀,與其說上帝的分化将人類的語言複雜化,不如說是人類自身心靈和諧不再的分崩離析。之是以後來有了翻譯,不僅是為了加強人類之間的交流,更寄達了一種願望,希望能以此消除人際的隔閡,獲求來自心靈的和諧及慰藉。真正的譯者,把握血脈,撫平創痕,通傳天籁,開啟心門。)

這是我寫的旋風式的程式設計語言簡介—我本來為亞馬遜開發者雜志本月的期刊寫的,但是發現我寫的東西沒法…見人。

首先,我偶爾一不小心口出髒話,或者對上帝不恭的話,是以對很官方很正式的亞馬遜上發表是不合适的; 是以我就把它塞到我的部落格裡了,我的部落格反正沒人看的。除了你以外。是的,隻有你會看,你好啊。

其次,這是一項進行中的工程,現在隻是東打一耙西搞一下,還沒有精加工過的。又一個把它寫到部落格裡的很大的理由。不需要很好,或很完整。就是我今天想說的一些話。請随便!

我的旋風式簡介會講C,C++,Lisp,Java,Perl,(我們在亞馬遜用到的所有語言),Ruby (我就是喜歡),和Python,把Python加進來是因為—好吧,你看了就知道了,現在我可不說。

C

你必須懂C。為哈? 因為出于所有現實的理由,這個世界上你過去,現在,将來會用到的每一台計算機都是一台馮·諾曼機器,而C是一種輕量級的,很有表達力的文法,能很好的展現馮·諾曼機器的能力。

馮·諾曼架構就是你每天都用的計算機的架構的标準:一個CPU,記憶體,硬碟,一條總線。多核計算機并沒有帶來本質上的變化。馮·諾曼機是一個很友善,很便宜,上世紀五十年代的實作圖靈機的技術,圖靈機是執行計算的最知名的抽象模型。

世上還有其他的計算的機器。比如,Lisp機器,是上世紀50年代對Lisp計算模型的實作。Lisp模型是基于lambda代數的一種計算語言表示法,後者是與圖靈機同構的一種模型。不像圖靈機,lambda代數能被人類讀和寫。但是這二者是同等能力的。它們同樣精确的表示了計算機能幹什麼。

Lisp機現在不是很流行了,除了在跳蚤市場裡。從誰更受歡迎來說,馮·諾曼機器赢了。還有一些其他的計算機,比如神經網絡計算機,譯者也不知道怎麼翻的計算機(cellular automata),但是這些都不夠大衆化,至少現在是這樣的。

是以你必須知道C。

還有一個你必須知道C的原因是,Unix是用C寫的。巧的是,Windows也是。基本上所有的其他作業系統都是用C寫的。因為這些作業系統都是馮·諾曼機的作業系統,你還能用别的嗎? 任何跟C很不一樣的東西都會跟硬體的實際能力相差太遠而導緻無法滿足性能上的需要,至少對一個作業系統來說是這樣—至少在上個世紀是這樣,碰巧這些系統都是上個世紀的。

你還應該知道Lisp。你不必用它來幹實際工作,雖然它在很多GNU的軟體裡都會很用得着。尤其是,你應該學會Scheme,Lisp的一種小巧化的,純潔的方言。GNU的版本叫Guile。

他們在麻省理工和加州伯克利教新學生一到兩個學期的Scheme,這些學生都對他們為哈要學這麼奇怪的語言抓破腦袋。實話實說,作為第一門學習的語言,這是一個很爛的選擇,第二門也是很爛。你應該學會它,最終,但不是作為第一門或第二門語言。

這是很難的哦。這是很大的一步。學會怎麼用Lisp寫出像C語言的程式是不夠的,那沒有意義。C和Lisp一個就像紅外線,一個就像紫外線,它們分布在光譜的最兩端。它倆一個牛逼的地方剛好是另一個傻逼了的地方。

如果說,C是最靠近計算機是如何工作的語言模型,Lisp就是最能反映計算(注意,這裡沒有了“機”字,計算機和計算是很不同的!譯者注)是如何工作的模型。你不需要懂很多Lisp,真的。緊咬Scheme就哦了,因為它是最簡單最幹淨的。其他的Lisp已經發展成了很大,很複雜(很好很強大? 譯者:-)的程式設計環境,就像C++和Java,要有很多庫啊,工具啊等等之類。那些,你不需要知道。但是你應該能用Scheme寫程式。如果你能夠做出The Little Schemer和The Seasoned Schemer這兩本書裡的所有習題,你懂得就夠多了,我認為。

但是對于你天天要做的程式設計工作,你應該基于以下條款選擇你的語言:庫,文檔,工具支援,作業系統內建,資源,和一堆其他的東西。這些條款跟計算機如何工作關系很小,但是跟人類如何工作關系甚大。

人們還在用很直白的C語言寫東西。很多東西。你應該懂C!

C++

C++是地球上最蠢的語言,即使是從蠢這個字的真正意義上出發。C++很無厘頭。它不知道自己是什麼東西。它沒有内視(面向對象裡的一個概念,譯者注)。C也沒有,但是C不是“面向對象”的,而面向對象很大程度上是關于要讓你的程式知道它自己。對象就像演員。是以面向對象語言應該有運作時的自省機制,知道自己是個什麼類的對象。C++不是這樣的,真的,你不會那樣用它。

關于C:寫一個C的編譯器是那麼的簡單,以至于你可以用C寫一個關于C的工具,用起來就像是有内省機制。而C++呢,基本上是不可解析的,是以如果你想寫一個很牛逼的工具用來—比如,告訴你你的虛函數的原型,或者幫你重構你的代碼,你将不得不依賴别人的工具集,因為你自己在除非腦子進屎的情況下是根本不會去寫一個C++的解析器的。而市面上所有的C++的解析器都很傻逼。

C++很蠢,你不能用蠢語言創造一個好系統。語言決定世界,蠢語言決定蠢世界。

所有的計算都基于抽象。你用低級的東西創造出進階的東西。但是你不能用分子創造出一個城市。嘗試使用太低級别的抽象隻會給你帶來麻煩。

我們就惹上麻煩了 (是指亞馬遜的員工,還是所有C++的程式員? 我也不知道,譯者注)。

理智的情況下,你用C寫的最大的東東就是一個作業系統。而作業系統其實不是很大的,真的。它們看起來很大,但那是因為它們有很多應用軟體,作業系統本身的核心是蠻小的。

你用C++能寫的最大的東東是…也是作業系統。好吧,或許稍微再大點兒。讓我們說,再大三倍吧。或者10倍吧。但是作業系統核心最多也就,那啥,一百萬行代碼? 是以我說你能用C++寫的最大的系統大概也就是一千萬行代碼吧,再大的話就開始不行了,這玩意兒你沒法控制了,就像恐怖片裡的…

我說的一千萬行是指如果你那時候還能讓你的系統編譯通過的話。

我們(在亞馬遜,譯者注)有五千萬行C++代碼。不,現在還要更多了。我已經不知道有多少行了。上個聖誕節是五千萬行,那是九個月前,而它以每季度八百萬行的規模增長。增長率本身也增長,媽呀。

我們想這個系統裡幹點啥好像要一萬年。一個亞馬遜工程師有一次這樣描述我們的代碼庫:“一座很大的屎山,你見過的最大的山,每次你想修正一個bug,你的工作就是爬到屎山的正中心去。”

夥計們,那哥們可是在四年前說的這話。他現在已經到更環保綠色的牧場上去了。真是太可惜了,他可是個實實在在的高手啊。

這都是C++的錯。别跟我争論。就是的。我們用的是世上最蠢的語言。這簡直有點老闆級的蠢,你說呢? (譯者注,meta在計算機術語裡通常表示更高一個層次,比如,meta-language,比普通的language高一個層次,意思是關于語言的語言。哲學裡應該會經常用到這個詞。我不懂哲學,但是我覺得老闆們總是比我們高一級,是以meta-dump我就翻譯成老闆級的蠢喽。:-)

說了以上這些難聽的話,話得說回來了。用C++寫出漂亮的代碼顯然是可以的,我的意思是說,這樣的代碼應該大部分還是C,偶爾很有品味的,很有節制的用一點C++。但是這種代碼幾乎從來不會被寫出來。C++是個很好玩的遊樂場,而如果你把它玩兒得門兒清的話你會覺得自己特牛,是以你總是被誘惑把你知道的所有的東西都用上。但是那是很難做好的,因為從一開始這個語言就太狗屎了,最終,你會弄得一塌糊塗,即使你很能幹。

我知道,我說的都是異端邪說,該被釘到十字架上的。随便吧。我在大學裡的時候老喜歡C++了,因為我那時候就隻知道這一門語言。當我聽到我的語言教授,Craig Chambers,絕對的厭憎C++,我想:“為啥呢? 我覺得它挺好的啊”。而當我聽到STL(标準模闆庫)的發明者被采訪時說他恨OOP(面向對象程式設計)時,我更是認為他肯定是磕藥了。怎麼會有人恨OOP呢,而這個人竟然還是STL的發明者?

親不敬,熟生厭(語出聖經,譯者注)。說的是在大多數情況下,跟一件事物熟悉了之後你就失去對它的膜拜尊敬了; 在計算機語言裡情況不是這樣的。光對一門語言熟悉不會導緻你看輕這門語言。你必須成為另一門更優秀的語言的專家(才能讓你明白原來那門語言有多麼多的問題)。

是以如果你不喜歡我針對C++大放厥詞,請你去學另一門語言并成為一個專家(我推薦Lisp),隻有那時你才有足夠的武器與我争論。然而,那時你将不會跟我争了。你上了我的當了。你也會跟我一樣變得不喜歡C++了,你或許會覺得我這個人很惡心,把你騙得不喜歡自己曾經的最愛了。是以或許你應該把我說的一切都忘了。C++挺好的其實,真的。它就是很棒棒(譯者注,作者在這裡用了ducky,這是一個女性喜歡用的誇某物好的詞,近來也為玻璃們喜愛)。忘了我說的話。C++不錯的。

Lisp

(我打賭這一節會讓你覺得驚訝,即使你已經關注我的部落格有一陣了 (譯者注,作者也可能是說,即使你成為亞馬遜的員工有一陣了)。)

亞馬遜創業之初,我們有很多明星級的工程師。我不認識他們所有人,但是我認識幾個。

比如? Shel Kaphan。大拿。Greg Linden。大拿。Eric Benson。即使在他加入亞馬遜之前就已經有自己響亮的名氣了。也是大拿。

他們寫了Obidos伺服器。是Obidos讓亞馬遜成功的。隻是後來那些生産大便很拿手的工程師,網頁開發者,搞前端的人—這些人因為生産大便很拿手而總是能讓經理們滿意—隻是在後來這些人把Obidos搞糟了。(他們的大便)把整條河都堵了,打個比方說的話。但是Obidos是亞馬遜最初的成功的一塊關鍵的基石。

這些最早的牛人們在亞馬遜神聖的代碼庫裡隻允許兩種語言:C 和 Lisp。

你自己去想吧。

當然,他們所有人都使用Emacs。靠,Eric Benson是XEmacs的作者之一。這個世界上所有偉大的工程師都在用Emacs[注1]。那種世界因你而不同級别的偉大。不是坐在你旁邊的格子裡的那哥們那種偉大。也不是Fred,走廊盡頭那哥們。我說的是我們這個行業裡最偉大的軟體開發者,那些能改變這個工業的面貌的人。像James Gosling們(Java語言設計者),Donald Knuth們(這個人沒有聽說過的話趕緊改行吧,别搞計算機了),Paul Graham們[注2],Jamie Zawinski們,Eric Benson們。真正的工程師用Emacs。你必須很有點聰明才能把Emacs用好,而如果你能成為一個Emacs大師的話它會給你難以置信的牛力。有機會的話你應該站到Paul Nordstrom的肩後看看他是怎麼工作的,如果你不相信我的話。對那些一輩子都在用爛Visual。Net之類的內建開發環境的人來說,一定會大開眼界的。

Emacs是那種你可以用100年的編輯器。

Shel,Eric,Greg,和其他像他們那樣的人,我沒有足夠幸運能跟他們直接一起工作:他們禁止在這裡使用C++,他們禁止使用Perl。(或者Java,為完整起見)。他們是明白人。

現在我們都在用C++,Java和Perl了,所有的代碼都用這些語言。我們的前輩們已經到更環保的牧場上去了 (指沒有大便的牧場,譯者注)。

Shel用C寫了Mailman,客服部的人把它用Lisp封裝了一下。Emacs-Lisp。你不需要知道Mailman是什麼東西。除非你是個Amazon的老員工,或許不是搞技術的,而且你曾經不得不讓客戶哈皮 (隻有在這種情況下你才需要知道Mailman,譯者注)。不是間接的,因為你用C++寫的一個狗屎功能跑不起來了,讓客戶很生氣,于是你不得不去搞定它以恢複客戶的哈皮度。不,我是說直接的,意思是,你必須跟他們聊。我們可愛的,不識字的,呱呱其談的,心地善良的,充滿希望的,困惑的,能幫點小忙的,憤怒的,哈皮的客戶們,真正的客戶們,那些從咱們這裡買東西的人,我們的客戶們。(如果你必須跟他們打交道的話,)那你就會知道Mailman這個東西。

Mailman是客服部的客戶電子郵件處理軟體,我們用了它有…四,五年? 反正是很長時間。它是用Emacs寫的,所有人都愛死它了。

人們現在還很愛它。直到今天,我依舊不得不聽我們一些非技術員工跟我長篇大論的叨叨他們是多麼的懷念Mailman。我可絕不是滿嘴噴糞。上個聖誕節我參加了一個Amazon的派對,一個我不知道自己怎麼會被邀請的派對,裡面全是些西裝筆挺的商務人士,誰都長得比我帥,比我光鮮。以及一些我在公司裡曾經打過交道的人(這句不知道怎麼譯)。四個美女認出了我是在客服部裡幹的,把我包圍了,跟我說了十五分鐘她們是多麼的懷念Mailman和Emacs,而現在的亞馬遜(我們用JSP花了好多年準備換掉Mailman的那一套軟體)是怎麼的不能滿足她們,讓她們覺得跟以前一樣爽。

這一切都太夢幻了,我覺得她們可能是喝多了。

Shel是個天才。Emacs是天才。連非技術人員都愛Emacs。我現在就是在Emacs裡打這些文字。我絕不情願在任何其他地方打字。這不隻是關于讓你的效率得到飛躍,通過那些地球上其他地方找不到的快捷鍵和文本編輯功能。我每分鐘打一百三到一百四十個英文單詞,在Emacs裡,當我在寫沒有格式要求的文本的時候。我測過這個時間速度。自己寫了一個測打字速度的Emacs應用。但我想跟你說的不隻是這個。

Emacs有的是一種你叫不出名字來的品質。

我們現在不用Mailman了。那是因為我們有一種叫得出名字的品質—就是,爛。我們很爛。我們(當時)找不到Emacs-Lisp足夠牛的人把Mailman繼續搞下去。今天這應該不難了; 亞馬遜現在到處都是Emacs Lisp的黑客。但是在那時候,客服部的人沒法從别人那裡得到幫助。于是他們就用他們當時手頭有的資源去搞這件事。他們當時沒有足夠多的Emacs-Lisp的人。有一段時間,他們甚至找來Bob Glickstein當合同工,那個給O'Reilly寫了那本Gnu Emacs擴充的書的家夥,坐在一個小辦公室裡給Emacs寫Mailman的擴充。

客服應用部是Amazon的第一個兩塊比薩餅的團隊(我也不知道什麼意思,看下文)。這個團隊是完全自立的。不管是那時還是現在。沒人跟他們說話,沒人幫他們。沒有槍,沒有炮,他們自己造。他們沒有網頁工程師,沒有支援工程師。屁也沒有。有的隻是一堆骨灰級的工程師和一個能帶新人的文化。這就是他們需要的一切了。

但他們最終不得不讓Mailman光榮退休。媽哎。而我呢今天還聽到人們說他們是多麼的懷念它。甚至在派對上。

我想今天按人頭比例來說,客服部仍然擁有比亞馬遜任何其他團隊更多的Lisp黑客。可能他們用到Lisp的機會不多了,但是Eric Raymond說過,即使你很少用Lisp寫程式,學習Lisp會是意義深遠的一個經曆,能讓你下輩子都成為一個更好的工程師。

卡爾,宗教現在已經不是大衆的精神鴉片了。現在鴉片是內建開發環境了。(卡爾。馬克思。這個人不知道的話應該打屁屁)。

Java

Java是過去的10年中計算行業裡發生過的最好的同時也是最壞的事。

一方面,Java把你從C++程式設計的很多枯燥易錯的細節中解救出來了。沒有數組越界了,沒有core dump了。抛出來的異常能讓你精确定位到出錯的那一行代碼,而且99%的時候都是正确的那一行出錯了的代碼。對象們在需要的時候能智能地把它們自己列印出來。等等等等。

另一方面,除了是一種語言,一個虛拟機,一個巨無霸的類庫,一個安全模型,一個可移植的位元組碼格式,Java還是一個宗教。邪教。是以你不能太相信對它太虔誠的人。想要招一個好的Java工程師是一項很有技術挑戰的活。

但是總的來說,Java是軟體工程史上的一大進步。

從C++到Java不隻是文法上的改變。這是一種需要一段時間去好好體會的一種震撼性的世界觀的轉變。這有點像突然你被配了一個執行助理。你知道老總們為什麼總是好像有時間去開會,總是知道公司現在運作的情況,總是寫出很酷酷的文檔嗎? 老總們常常忘記其實他們不是一個人在戰鬥,他們都是兩個全職的人,他們和他們的執行助理們。有一個執行助理把你從瑣事中解救出來讓你有時間去思考那些真的需要你去解決的問題; 沒有的話你将不得不花一半的時間在那些無聊的世俗的事情上。切換到Java程式設計語言就把你變成了兩個程式員—一個處理那些你不需要關心的東西,另一個可以集中精力在問題本身上。這是一個很震人的改變,一個你應該很快就能習慣能喜歡上的改變。

就像Jamie Zawinski(Netscape牛人,開發Mozilla浏覽器,好像學曆是高中畢業?)在他著名的“Java真爛”那篇文章裡說的:“先說那些好東西:Java沒有free()函數。我必須一開始就承認,其他的東西都沒什麼了不起。(沒有free)是能讓我原諒其他所有東西的特性,不管其他東西有多爛。講完這一點後,我的文章裡其他一切幾乎都完全沒有重要性了。”

Jamie的文章寫在1997年,按Java年來算的話是很早以前了,跟他寫這篇文章時比Java已經有很大的改善; 一些他抱怨的東西甚至已經被fix了。

但是大多數還是沒有被fix。Java作為一門語言還是有點爛。但就如Jamie指出的,Java“是今天為止最好的語言。我的意思是說,它是今天市面上那些爛得底兒掉地一堆語言比起來有那麼一點能被我接受。”

真的,你應該讀讀他那篇文章。

Java幾乎每一方面都很好,除了它的語言本身,而這是JWZ抱怨的主要對象。但那是一個很大的抱怨。再好的庫也救不了一個爛語言。相信我:你可能比我知道多得多的東西,但是我知道好兵救不了爛将。在Geoworks搞了五年彙編語言都會了我這個道理。

跟C++比,Java作為一個語言還過得去。好吧,别扯了,Java要好很多。因為它有(内建)的字元串。哥們,你說一個沒有内建的字元串的語言是人用的嗎。

但是Java跟C++比少了一些好東西,比如(函數調用時)傳引用,棧上的對象,typedef,宏,以及運算符重載。一些時不時地會很稱手的東西。

哦,還有多重繼承,我現在老了,反而挺欣賞了的多重繼承。如果你認為我這個觀點僵硬不靈活的家夥是多态教義很好的反例的話,我倒是可以給你舉幾個為什麼你需要多态繼承的好例子,或者至少像Ruby那樣的mixin或者自動的派遣。下次問問我白龍馬的事情。今天我要告訴你為什麼Java的interface是個爛貨。

幾年前Gosling自己都說,如果一切都能重來的話,他不會搞出個interface的概念。

但是那正是Java的問題。當James說出那句話的時候,人們被雷到了。我甚至能感覺到那股雷勁兒,能感覺到Sun公司市場部和法務部的鳥人是多麼想把James滅口,然後告訴大家他沒那麼說過。

Java的問題就是人們都被那幫人搞的廣告效應蒙住了眼。C++,Perl,任何流行語言都有這個問題。這是很嚴重的,因為如果沒有一些說大話吹牛逼的廣告,一個語言是不會流行起來的。是以如果一個語言的設計者說他的語言沒有被設計得很完美的話,就是趕緊用麻醉槍射擊這胡說八道的家夥并關閉會議的時候了。

語言們需要放點兒衛星才能活,我隻希望人們不要被衛星耀瞎了眼。

我學了面向對象程式設計, 我自己也對此大吹大擂。當我加入亞馬遜時,我不能告訴你我有什麼智慧或者經驗,但我可以給你背誦出所有關于OOP的魔咒。多重繼承是邪惡的,因為大家都這麼說; 運算符重載是邪惡的,諸如此類。我甚至有點模糊地知道為什麼是邪惡的,但實際上不知道。後來我明白了,這些都不邪惡,不是爛玩意兒,爛的是開發者,是我。我現在還是爛,但是希望每年都不爛一點起來。

上禮拜我碰到一個來面試的,他告訴我多繼是邪惡的,因為,比如,你可以從頭,胳膊,腿,軀幹多重繼承出一個人來。他既是對的,又是錯的。那樣的多繼情形當然邪惡,但那都是因為他自己太邪惡了。那樣繼承出來的“東西”遠遠就能看見有多蠢,如果他還把這玩意兒弄進門來那就更邪惡了。

不良開發者,占了這世上開發者的大多數,他們能用你扔給他們随便什麼語言寫出不良的代碼。

說了這些,還是得說回來,多繼不是請客吃飯那麼輕松的事兒; mixin看起來是更好的解決方案,但是還沒人完美的解決這個問題。但我還是認為Java比C++好,即使它沒有多繼。因為我知道不管我的出發點是多麼好,某一天我還是會被一堆不懂怎麼寫好代碼的人包圍,讓他們用Java比用C++會帶來更少的傷害。

此外,Java除了語言本身外還有老多其他的重要有用的東西。且Java語言本身也在進化,雖然像冰川一樣慢,是以我們還是能看到希望。Java正是我們應該在亞馬遜推薦使用的語言。

你就是得小心點兒,因為各其他任何語言一樣,你能很容易找出一堆人,他們很懂一門語言及其程式設計環境,但對品味,計算或者其他任何重要的東西卻一無所知。

當你有懷疑時,還是雇那種會好幾門語言的Java程式員,那種厭憎J2EE/EJB之類松松跨跨的所謂架構的,那種使用Emacs的。這都是一些實戰經驗。

Perl

Perl,怎麼說呢?

Perl是個老朋友。老老朋友。我開始寫Perl代碼的時候,可能是1995年? 而它為我很好的服務了差不多10年的時間。

它就像你騎了十萬二十萬英裡的老自行車,你心裡永遠有一塊地方裝着它,雖然現在你已經換了一輛更加現代化的隻有五磅重的自行車,而且這一輛也不像老的那輛頂得你屁眼疼了。

Perl受歡迎原因有仨:

  1. 用Perl你很快就能搞定你的問題。而這是最終的衡量标準。
  2. Perl有世上最好的市場推廣。你可以寫一本介紹他們市場推廣有多絕的書。Sun公司砸大筆錢給Java推市場,Perl在受歡迎程度來說能跟Java齊頭并進,但Perl純粹是依靠Larry Wall和他那幫哥們的三寸不爛之舌做市場。哈佛商學院的人應該去研究Perl的市場是怎麼做出來的。真的讓人瞠目結舌。
  3. 直到差不多,呃,現在,Perl沒有真正的競争者。

有比Perl“好”的語言。操,有很多比Perl好的語言,如果你定義“好”為“不是給瘋子用的”的話。Lisp,Smalltalk,Python,媽呀,我可能可以列出二三十種比Perl“好”的語言。從這些語言不像這個夏天在台灣街頭爆了肚皮的抹香鲸這個角度來說。鲸魚腸子到處都是,汽車上,機車上,行人身上。這就是Perl。讓人着迷,真的。

但是Perl有很多很多好的特性,直到最近,都是其他語言沒有的。它們彌補了Perl腸子在外的不足。你可以從爆了肚皮的鲸魚可以做很多有用的東西出來,比如香水。這很有用。Perl也是這樣。

當其他的那些語言(尤其是Lisp和Smalltalk)都想假裝作業系統并不存在,清單(Lisp的)和對象(Smalltalk的)就是把屎搞出來的唯一存在,Perl卻走了截然相反的路子。Larry說:Unix和字元串是搞出屎來的唯一存在。

對很多任務來說,他絕對是正确的。是以Perl絕對是Unix系統管理和字元串處理的史上最強語言,除了一個,剛出來的一個,從哥斯拉(電影哥斯拉看過沒)之地出來的一個。我一會兒會講到那一個。

可惜,Larry太太太太在意Unix系統管理和字元串處理以緻他壓根忘了清單和對象,等他明白過來想改正的時候已經晚了。實際上,在Perl早期的…好吧,對鲸魚腸子我實在不想用“設計”這個詞,就說生命周期中吧,他犯的幾個關鍵錯誤讓把清單和對象加進來變得如此尴尬,以緻Perl已經進化成一個真正的Rube Goldberg機器,至少當你想在Perl裡用清單和對象的時候。(Rube Goldberg是一漫畫家,常畫一些很複雜的機器,但隻完成簡單的工作,比如一個小球滾過很多關卡,最後把門打開。譯者注)。

清單和對象也他媽的是很重要的,Larry!(farging應該是作者不想說fucking那麼直白,譯者注)

Perl沒法表達清單因為Larry一早犯了一個悲劇性的愚蠢的錯誤,把清單全抹平。于是(1,2,(3,4))魔術般地變成(1,2,3,4)。不是說你會想讓它這樣工作,而是Larry剛好那天在搞一個這樣會更友善的問題。于是Perl的資料結構從此就變得爆炸了的鲸魚了。

今天你看Perl的書,小教程或PPT的時候,不花三分之一的時間在“引用”上是不可能的。這就是Larry可憐的,壞了的,Goldberg(漫畫家,想起來沒? 譯者注)式的對他那抹平清單的瘋狂錯誤的解決方案。但是Perl的市場宣傳做得那麼難以置信地好以緻它讓你覺得這是你身上發生過的最好的東西。你可以對任何東西取它的引用。這很有趣!聞起來也很香(說腸子呢,譯者注,呵呵)!

Perl不能支援面向對象程式設計因為Larry壓根不相信這玩意兒。這可能沒什麼大不了; 我也不是很确定我是不是信這個OOP。但是那麼為啥他又要試着把對象加進Perl呢? Perl的面向對象是個半成品,且在Perl社群裡沒多少人重視。它就是不像字元串處理或Unix內建那樣充滿靈感。

當然了,Perl還有其他很多怪怪的特性。比如它的“上下文”,這是Larry要有N個變量名字空間的喜劇式決定的一個恐怖片式的産物。這些空間由sigil來區分(就是Perl裡變量名前面的‘$’,‘@’,‘%’字元),看着像是從shell腳本裡拷貝來的。在Perl裡,所有的運算符,所有的函數,所有的操作其行為都是六取一的随機的,取決于目前的“上下文”。沒有一些規則或助記法能幫你搞定這些特定操作在特定上下文裡的特定行為。你得把它們全記在腦子裡。

想要個例子? 這兒有一個:在一個值量(scalar,對應于vector,向量)上下文裡對一個哈希取值你得到一個字元串,裡面是個分數,分子是目前已配置設定的鍵,分母是總共有多少個桶。鲸魚腸子,我告訴你。

但就像我說的—直到最近,沒啥能像Perl那樣把屎搞定。

Ruby

每過15年左右,一門語言就會被更好的代替。C被C++代替,至少對大應用開發而又需要性能和資料類型的人們來說。C++被Java代替,而Java無疑在7年後又會被更好的東西代替—好吧,我說的是完全代替C++的7年後,這到目前為止還沒有發生,主要是因為微軟能在Java霸占桌面系統之前狙擊它。但是在伺服器上的應用而言,C++的陣地已經慢慢讓給Java了。

Perl有一天也會消逝。那是因為一門新的語言Ruby剛剛終于被翻譯成英語了。沒錯,它是在日本發明的,這麼多地兒,沒想到日本人搞出來了,還以為他們隻是硬體和制造上占有名氣,而不是他們的軟體業,是以大家都跟你一樣驚奇。為什麼呢,大家可能都在想。但是我認為這都是跟打字有關。我根本不能想象他們以前能打字打得足夠快,英文字母隻有26個,他們卻有上萬個字。但是Emacs幾年前支援多位元組字元了,是以我猜他們現在打字速度他媽的快多了。(是以能搞出Ruby來了,譯者猜作者是這個意思) (是的,他們也用Emacs—事實上日本人負責了Emacs多位元組支援的大部工作,而且搞得堅不可摧。)

不管怎麼樣,Ruby從Perl那裡偷師了所有的好東西; 實際上,Matz,Ruby的作者(Yukihiro Matsumoto,如果我沒記錯的話,但是他外号“Matz”),覺得他從Perl那裡偷的有點太多了,他的鞋上也粘了些鲸魚腸子。但是隻是一丢丢。

最重要的是,Ruby拿來了Perl的串處理和Unix內建,一點沒改,就是說文法都是一樣的,于是乎啥也不說了,你就擁有了Perl最好的那部分。這是個不錯的開局,特别是如果你不把Perl剩下的東西也拿進來的話。

但是之後Matz還從Lisp那裡拿來的最好的清單處理,Smalltalk和其他語言那裡拿來了最好的面向對象,CLU那裡拿來了最好的疊代器,以及基本上是每個人每個事的最好的東西。

而他讓這些東西全部都跑起來,跑得那麼順,你都不會注意到這些東西在那兒。我比其他任何語言都快就學會了Ruby,我總共會三十到四十門語言; 而我花了大概三天時間就能用Ruby比Perl還流暢地工作了,當了八年的Perl黑客後。這些東西是這麼的和諧你都能自己猜它們是怎麼工作的,而且大多數時候你都能猜對。漂亮。有趣。靠譜。

如果把語言比成自行車,那麼AWK就是一輛粉系的兒童自行車,前面有個白色小框,還插塊小旗,Perl就是沙灘車(還記得那有多酷吧? 唉。),而Ruby則是一輛七千五美金的钛合金山地自行車。從Perl飛躍到Ruby意義不下于從C++到Java的飛躍。卻沒有任何缺陷,因為Ruby幾乎是Perl功能的一個超集,而Java卻拿掉了一些人們想要的東西,且沒有真正的提供一個替代品。

下次我會寫更多關于Ruby的東西。我先需要靈感。去讀讀Lucky Stiff的(poignant) guide to Ruby吧。那本書是一本有靈感的書。真的,讀一下。超贊。我不了解産生它的那種頭腦,但它很有趣,很犀利,且全是關于Ruby的。好像。你會看到的。

Python

啊,Python怎麼說呢,一個不錯的語言,這麼多年來一直旁邊在等待它的機會? Python社群很長時間以來是那些勇敢地吞下紅藥片從Perl駭客帝國中醒來的人的避難營。

啊,有點像Smalltalk的人們,他們永遠在等待替代C++,沒想到半路殺出Java一下把它們操翻了,漂亮地,永久地。哎喲。Ruby正在對Python做着同樣的事,現在,今天。可能會在一夜之間吧。

Python本來可以統治世界,可惜它有兩個緻命缺陷:空格,和冷淡。

空格很簡單,就是說Python是用縮進來表達代碼塊之間的嵌套。它強制你必須按一定格式把所有的東西縮進,他們這樣做是為了讓所有人寫的代碼看上去一樣。不料蠻多程式員讨厭這點,因為他們覺得自己的自由被拿走了; 感覺就像Python侵犯了憲法賦予他們的可以随便縮進格式和全寫在一行上的權利。

Python的作者,Guido Van Rossum,也在早期犯過一些很傻地技術錯誤—沒有像Larry的失誤那麼嚴重,但是還是有幾個。比如,最早Python沒有字面變量範圍,但它同時也沒有動态變量範圍,而動态變量範圍可能會有它一些問題,但它還是有用的。Python卻沒有這些,隻有全局的和本地(函數)的兩種範圍。是以即使它是一個真正的OO系統,類甚至不能通路它們自己的動态成員變量。你必須給成員函數傳“self”參數,一大堆self參數很快就會把你搞瘋掉,即使你不在意空格問題。

等等之類。

但在我看來,Python不行其實是因為冷淡。這阻止了它成為首選腳本語言,或者首選一切語言。靠,人們現在還在用Tcl作嵌入解釋執行器,雖然Python比Tcl好得不要太多—除了,我說,這個冷淡問題。

此處開始我不知所雲。呵呵,這樣吧,把原文貼在最後面。

注1,Eric告訴我當時幾乎全是Jamie Zawinski,當他們在Lucid工作的時候。

注2,我寫了這個之後很多人告訴我Paul Graham是用VI的,想不到。

注3,為了有據可查,我個人根本不介意空格問題。我認為因為這個而不喜歡Python是很傻的。我隻是說有一堆比例讓人驚奇的其他工程師讨厭空格問題。

What's the frost thing, you ask? Well, I used to have a lot of exceptionally mean stuff written here, but since Python's actually quite pleasant to work with (if you can overlook its warts), I no longer think it's such a great idea to bash on Pythonistas。The "frost thing" is just that they used to have a tendency to be a bit, well, frosty。Why?

Because they were so tired of hearing about the whitespace thing!

I think that's why Python never reached Perl's level of popularity, but maybe I'm just imagining things。

Coda

That was the ADJ article I really wanted to write。Or at least something like it。For some reason, though, my true feelings only seem to come out during insomniac attacks between 3am and 6am。Time for bed!2 hours 'til my next meeting。

這才是我真正想給亞馬遜開發者雜志寫的文章。或者至少是這樣的。出于某些原因,我的真感情好像隻有在我淩晨三點到六點失眠的時候都會流露。該睡覺了!我下個會議再過兩小時就開始了。

(釋出于2004年9月,小小的更新在3/28/2006)