圣經(jīng)記載:在遠古的時候兜辞,人類都使用一種語言,全世界的人決定一起造一座通天的塔夸溶,就是巴別塔弦疮,后來被上帝知道了,上帝就讓人們使用不同的語言蜘醋,這個塔就沒能造起來胁塞。 巴別塔不建自毀,與其說上帝的分化將人類的語言復雜化,不如說是人類自身心靈和諧不再的分崩離析啸罢。之所以后來有了翻譯编检,不僅是為了加強人類之間的交流,更寄達了一種愿望扰才,希望能以此消除人際的隔閡允懂,獲求來自心靈的和諧及慰藉。真正的譯者衩匣,把握血脈蕾总,撫平創(chuàng)痕,通傳天籟琅捏,開啟心門生百。
這是我寫的旋風式的編程語言簡介 —— 我本來為亞馬遜開發(fā)者雜志本月的期刊寫的,但是發(fā)現(xiàn)我寫的東西沒法見人柄延。
首先蚀浆,我偶爾一不小心口出臟話,或者對上帝不恭的話搜吧,所以在很官方很正式的亞馬遜上發(fā)表是不合適的市俊; 所以我就把它塞到我的博客里了,我的博客反正沒人看的滤奈。除了你以外摆昧。是的,只有你會看蜒程,你好啊据忘。
其次,這是一項進行中的工程搞糕,現(xiàn)在只是東打一耙西搞一下勇吊,還沒有精加工過的。又一個把它寫到博客里的很大的理由窍仰。不需要很好汉规,或很完整。就是我今天想說的一些話驹吮。請隨便针史!
我的旋風式簡介會講C、C++碟狞、Lisp啄枕、Java、Perl (我們在亞馬遜用到的所有語言)族沃、Ruby (我就是喜歡) 和 Python频祝,把 Python 加進來是因為 —— 好吧泌参,你看了就知道了,現(xiàn)在我可不說常空。
C
你必須懂C沽一。為哈? 因為出于所有現(xiàn)實的理由,這個世界上你過去漓糙,現(xiàn)在铣缠,將來會用到的每一臺計算機都是一臺馮·諾曼機器,而C是一種輕量級的昆禽,很有表達力的語法蝗蛙,能很好的展現(xiàn)馮·諾曼機器的能力。
馮·諾曼架構就是你每天都用的計算機的架構的標準:一個 CPU醉鳖,內存捡硅,硬盤,一條總線辐棒。多核計算機并沒有帶來本質上的變化。馮·諾曼機是一個很方便牍蜂,很便宜漾根,上世紀五十年代的實現(xiàn)圖靈機的技術,圖靈機是執(zhí)行計算的最知名的抽象模型鲫竞。
世上還有其他的計算的機器辐怕。比如,Lisp 機器从绘,是上世紀 50 年代對 Lisp 計算模型的實現(xiàn)寄疏。Lisp 模型是基于 lambda 代數(shù)的一種計算語言表示法,后者是與圖靈機同構的一種模型僵井。不像圖靈機陕截,lambda 代數(shù)能被人類讀和寫。但是這二者是同等能力的批什。它們同樣精確的表示了計算機能干什么农曲。
Lisp 機現(xiàn)在不是很流行了,除了在跳蚤市場里驻债。從誰更受歡迎來說乳规,馮·諾曼機器贏了。還有一些其他的計算機合呐,比如神經(jīng)網(wǎng)絡計算機暮的,譯者也不知道怎么翻的計算機(cellular automata),但是這些都不夠大眾化淌实,至少現(xiàn)在是這樣的冻辩。
所以你必須知道C猖腕。
還有一個你必須知道C的原因是,Unix 是用C寫的微猖。巧的是谈息,Windows 也是×莅基本上所有的其他操作系統(tǒng)都是用C寫的侠仇。因為這些操作系統(tǒng)都是馮·諾曼機的操作系統(tǒng),你還能用別的嗎? 任何跟C很不一樣的東西都會跟硬件的實際能力相差太遠而導致無法滿足性能上的需要犁珠,至少對一個操作系統(tǒng)來說是這樣—至少在上個世紀是這樣逻炊,碰巧這些系統(tǒng)都是上個世紀的。
你還應該知道 Lisp犁享。你不必用它來干實際工作余素,雖然它在很多 GNU 的軟件里都會很用得著。尤其是炊昆,你應該學會 Scheme桨吊,Lisp 的一種小巧化的,純潔的方言凤巨。GNU 的版本叫 Guile视乐。
他們在麻省理工和加州伯克利教新學生一到兩個學期的 Scheme,這些學生都對他們?yōu)楣獙W這么奇怪的語言抓破腦袋敢茁。實話實說佑淀,作為第一門學習的語言,這是一個很爛的選擇彰檬,第二門也是很爛伸刃。你應該學會它,最終逢倍,但不是作為第一門或第二門語言捧颅。
這是很難的哦。這是很大的一步较雕。學會怎么用 Lisp 寫出像C語言的程序是不夠的隘道,那沒有意義。C 和 Lisp 一個就像紅外線郎笆,一個就像紫外線谭梗,它們分布在光譜的最兩端。它倆一個牛逼的地方剛好是另一個傻逼了的地方宛蚓。
如果說激捏,C是最靠近計算機是如何工作的語言模型,Lisp 就是最能反映計算(注意凄吏,這里沒有了“機”字,計算機和計算是很不同的!譯者注)是如何工作的模型涯曲。你不需要懂很多 Lisp冠息,真的匀泊。緊咬 Scheme 就哦了,因為它是最簡單最干凈的。其他的 Lisp 已經(jīng)發(fā)展成了很大,很復雜(很好很強大? 譯者:-)的編程環(huán)境例诀,就像 C++ 和 Java,要有很多庫啊裁着,工具啊等等之類繁涂。那些,你不需要知道二驰。但是你應該能用 Scheme 寫程序扔罪。如果你能夠做出 The Little Schemer 和 The Seasoned Schemer 這兩本書里的所有習題,你懂得就夠多了桶雀,我認為矿酵。
但是對于你天天要做的編程工作,你應該基于以下條款選擇你的語言:庫矗积,文檔全肮,工具支持,操作系統(tǒng)集成漠魏,資源倔矾,和一堆其他的東西妄均。這些條款跟計算機如何工作關系很小柱锹,但是跟人類如何工作關系甚大。
人們還在用很直白的C語言寫東西丰包。很多東西禁熏。你應該懂C!
C++
C++是地球上最蠢的語言邑彪,即使是從蠢這個字的真正意義上出發(fā)瞧毙。C++很無厘頭。它不知道自己是什么東西寄症。它沒有自省(introspective宙彪,面向對象里的一個概念,譯者注)有巧。C也沒有释漆,但是C不是“面向對象”的,而面向對象很大程度上是關于要讓你的程序知道它自己篮迎。對象就像演員男图。所以面向對象語言應該有運行時的自省機制示姿,知道自己是個什么類的對象。C++不是這樣的逊笆,真的栈戳,你不會那樣用它。
關于C:寫一個C的編譯器是那么的簡單难裆,以至于你可以用C寫一個關于C的工具子檀,用起來就像是有內省機制。而 C++ 呢差牛,基本上是不可解析的命锄,所以如果你想寫一個很牛逼的工具用來 —— 比如,告訴你你的虛函數(shù)的原型偏化,或者幫你重構你的代碼脐恩,你將不得不依賴別人的工具集,因為你自己在除非腦子進屎的情況下是根本不會去寫一個 C++ 的解析器的侦讨。而市面上所有的 C++ 的解析器都很傻逼驶冒。
C++很蠢,你不能用蠢語言創(chuàng)造一個好系統(tǒng)韵卤。語言決定世界骗污,蠢語言決定蠢世界。
所有的計算都基于抽象沈条。你用低級的東西創(chuàng)造出高級的東西需忿。但是你不能用分子創(chuàng)造出一個城市。嘗試使用太低級別的抽象只會給你帶來麻煩蜡歹。
我們就惹上麻煩了 (是指亞馬遜的員工屋厘,還是所有 C++ 的程序員? 我也不知道,譯者注)月而。
理智的情況下汗洒,你用C寫的最大的東東就是一個操作系統(tǒng)。而操作系統(tǒng)其實不是很大的父款,真的溢谤。它們看起來很大,但那是因為它們有很多應用軟件憨攒,操作系統(tǒng)本身的內核是蠻小的世杀。
你用 C++ 能寫的最大的東東是…也是操作系統(tǒng)。好吧肝集,或許稍微再大點兒瞻坝。讓我們說,再大三倍吧包晰∈疲或者 10 倍吧炕吸。但是操作系統(tǒng)內核最多也就,那啥勉痴,一百萬行代碼? 所以我說你能用 C++ 寫的最大的系統(tǒng)大概也就是一千萬行代碼吧赫模,再大的話就開始不行了,這玩意兒你沒法控制了蒸矛,就像恐怖片里的…
我說的一千萬行是指如果你那時候還能讓你的系統(tǒng)編譯通過的話瀑罗。
我們(在亞馬遜,譯者注)有五千萬行 C++ 代碼雏掠。不斩祭,現(xiàn)在還要更多了。我已經(jīng)不知道有多少行了乡话。上個圣誕節(jié)是五千萬行摧玫,那是九個月前,而它以每季度八百萬行的規(guī)模增長绑青。增長率本身也增長诬像,媽呀。
我們想在這個系統(tǒng)里干點啥好像要一萬年闸婴。一個亞馬遜工程師有一次這樣描述我們的代碼庫:“一座很大的屎山坏挠,你見過的最大的山,每次你想修正一個 bug邪乍,你的工作就是爬到屎山的正中心去降狠。”
伙計們庇楞,那哥們可是在四年前說的這話榜配。他現(xiàn)在已經(jīng)到更環(huán)保綠色的牧場上去了。真是太可惜了姐刁,他可是個實實在在的高手啊芥牌。
這都是 C++ 的錯烦味。別跟我爭論聂使。就是的。我們用的是世上最蠢的語言谬俄。這簡直有點老板級的蠢柏靶,你說呢? (譯者注,meta 在計算機術語里通常表示更高一個層次溃论,比如屎蜓,meta-language,比普通的 language 高一個層次钥勋,意思是關于語言的語言炬转。哲學里應該會經(jīng)常用到這個詞辆苔。我不懂哲學,但是我覺得老板們總是比我們高一級扼劈,所以 meta-dump 我就翻譯成老板級的蠢嘍驻啤。:-)
說了以上這些難聽的話,話得說回來了荐吵。用 C++ 寫出漂亮的代碼顯然是可以的骑冗,我的意思是說,這樣的代碼應該大部分還是C先煎,偶爾很有品味的贼涩,很有節(jié)制的用一點C++。但是這種代碼幾乎從來不會被寫出來薯蝎。C++是個很好玩的游樂場遥倦,而如果你把它玩兒得門兒清的話你會覺得自己特牛,所以你總是被誘惑把你知道的所有的東西都用上占锯。但是那是很難做好的谊迄,因為從一開始這個語言就太狗屎了,最終烟央,你會弄得一塌糊涂统诺,即使你很能干。
我知道疑俭,我說的都是異端邪說粮呢,該被釘?shù)绞旨苌系摹kS便吧钞艇。我在大學里的時候老喜歡 C++ 了啄寡,因為我那時候就只知道這一門語言。當我聽到我的語言教授哩照,Craig Chambers挺物,絕對的厭憎C++,我想:“為啥呢? 我覺得它挺好的啊”飘弧。而當我聽到 STL (標準模板庫)的發(fā)明者被采訪時說他恨 OOP (面向對象編程)時识藤,我更是認為他肯定是磕藥了。怎么會有人恨 OOP 呢次伶,而這個人竟然還是 STL 的發(fā)明者?
親不敬痴昧,熟生厭(語出圣經(jīng),譯者注)冠王。說的是在大多數(shù)情況下赶撰,跟一件事物熟悉了之后你就失去對它的膜拜尊敬了; 在計算機語言里情況不是這樣的。光對一門語言熟悉不會導致你看輕這門語言。你必須成為另一門更優(yōu)秀的語言的專家(才能讓你明白原來那門語言有多么多的問題)豪娜。
所以如果你不喜歡我針對 C++ 大放厥詞餐胀,請你去學另一門語言并成為一個專家(我推薦 Lisp),只有那時你才有足夠的武器與我爭論瘤载。然而骂澄,那時你將不會跟我爭了。你上了我的當了惕虑。你也會跟我一樣變得不喜歡 C++ 了坟冲,你或許會覺得我這個人很惡心,把你騙得不喜歡自己曾經(jīng)的最愛了溃蔫。所以或許你應該把我說的一切都忘了健提。C++挺好的其實,真的伟叛。它就是很棒棒(譯者注私痹,作者在這里用了 ducky,這是一個女性喜歡用的夸某物好的詞统刮,近來也為玻璃們喜愛)紊遵。忘了我說的話。C++不錯的侥蒙。
Lisp
(我打賭這一節(jié)會讓你覺得驚訝暗膜,即使你已經(jīng)關注我的博客有一陣了[譯者注,作者也可能是說鞭衩,即使你成為亞馬遜的員工有一陣了])
亞馬遜創(chuàng)業(yè)之初学搜,我們有很多明星級的工程師。我不認識他們所有人论衍,但是我認識幾個瑞佩。
比如?Shel Kaphan, 大拿坯台。Greg Linden, 大拿炬丸。Eric Benson。即使在他加入亞馬遜之前就已經(jīng)有自己響亮的名氣了蜒蕾。也是大拿稠炬。
他們寫了 Obidos 服務器。是 Obidos 讓亞馬遜成功的滥搭。只是后來那些生產(chǎn)大便很拿手的工程師酸纲,網(wǎng)頁開發(fā)者捣鲸,搞前端的人 —— 這些人因為生產(chǎn)大便很拿手而總是能讓經(jīng)理們滿意 —— 只是在后來這些人把 Obidos 搞糟了瑟匆。(他們的大便)把整條河都堵了,打個比方說的話。但是 Obidos 是亞馬遜最初的成功的一塊關鍵的基石愁溜。
這些最早的牛人們在亞馬遜神圣的代碼庫里只允許兩種語言:C 和 Lisp疾嗅。
你自己去想吧。
當然冕象,他們所有人都使用 Emacs代承。靠渐扮,Eric Benson 是 XEmacs 的作者之一论悴。這個世界上所有偉大的工程師都在用 Emacs[注1]。那種世界因你而不同級別的偉大墓律。不是坐在你旁邊的格子里的那哥們那種偉大膀估。也不是 Fred,走廊盡頭那哥們耻讽。我說的是我們這個行業(yè)里最偉大的軟件開發(fā)者察纯,那些能改變這個工業(yè)的面貌的人。像 James Gosling 們(Java 語言設計者)针肥,Donald Knuth 們(這個人沒有聽說過的話趕緊改行吧饼记,別搞計算機了),Paul Graham 們[注2]慰枕,Jamie Zawinski 們具则,Eric Benson 們。真正的工程師用 Emacs具帮。你必須很有點聰明才能把 Emacs 用好乡洼,而如果你能成為一個 Emacs 大師的話它會給你難以置信的牛力。有機會的話你應該站到 Paul Nordstrom 的肩后看看他是怎么工作的匕坯,如果你不相信我的話束昵。對那些一輩子都在用爛 Visual Studio 之類的集成開發(fā)環(huán)境的人來說,一定會大開眼界的葛峻。
Emacs 是那種你可以用 100 年的編輯器锹雏。
Shel, Eric, Greg,和其他像他們那樣的人术奖,我沒有足夠幸運能跟他們直接一起工作:他們禁止在這里使用C++礁遵,他們禁止使用 Perl(或者 Java,為完整起見)采记。他們是明白人佣耐。
現(xiàn)在我們都在用C++,Java 和 Perl 了唧龄,所有的代碼都用這些語言兼砖。我們的前輩們已經(jīng)到更環(huán)保的牧場上去了 (指沒有大便的牧場,譯者注)。
Shel 用 C 寫了 Mailman讽挟,客服部的人把它用 Lisp 封裝了一下懒叛。Emacs-Lisp。你不需要知道 Mailman 是什么東西耽梅。除非你是個 Amazon 的老員工薛窥,或許不是搞技術的,而且你曾經(jīng)不得不讓客戶哈皮 (只有在這種情況下你才需要知道 Mailman眼姐,譯者注)诅迷。不是間接的,因為你用 C++ 寫的一個狗屎功能跑不起來了众旗,讓客戶很生氣竟贯,于是你不得不去搞定它以恢復客戶的哈皮度。不逝钥,我是說直接的屑那,意思是,你必須跟他們聊艘款。我們可愛的持际,不識字的,呱呱其談的哗咆,心地善良的蜘欲,充滿希望的,困惑的晌柬,能幫點小忙的姥份,憤怒的,哈皮的客戶們年碘,真正的客戶們澈歉,那些從咱們這里買東西的人,我們的客戶們屿衅。(如果你必須跟他們打交道的話埃难,)那你就會知道 Mailman 這個東西。
Mailman 是客服部的客戶電子郵件處理軟件涤久,我們用了它有…四涡尘,五年? 反正是很長時間。它是用 Emacs 寫的响迂,所有人都愛死它了考抄。
人們現(xiàn)在還很愛它。直到今天蔗彤,我依舊不得不聽我們一些非技術員工跟我長篇大論的叨叨他們是多么的懷念 Mailman川梅。我可絕不是滿嘴噴糞疯兼。上個圣誕節(jié)我參加了一個 Amazon 的派對,一個我不知道自己怎么會被邀請的派對挑势,里面全是些西裝筆挺的商務人士镇防,誰都長得比我?guī)浝裁任夜怩r潮饱。以及一些我在公司里曾經(jīng)打過交道的人(這句不知道怎么譯)。四個美女認出了我是在客服部里干的诫给,把我包圍了香拉,跟我說了十五分鐘她們是多么的懷念 Mailman 和 Emacs,而現(xiàn)在的亞馬遜(我們用 JSP 花了好多年準備換掉 Mailman 的那一套軟件)是怎么的不能滿足她們中狂,讓她們覺得跟以前一樣爽凫碌。
這一切都太夢幻了,我覺得她們可能是喝多了胃榕。
Shel 是個天才盛险。Emacs 是天才。連非技術人員都愛 Emacs勋又。我現(xiàn)在就是在 Emacs 里打這些文字苦掘。我絕不情愿在任何其他地方打字。這不只是關于讓你的效率得到飛躍楔壤,通過那些地球上其他地方找不到的快捷鍵和文本編輯功能鹤啡。我每分鐘打一百三到一百四十個英文單詞,在 Emacs 里蹲嚣,當我在寫沒有格式要求的文本的時候递瑰。我測過這個時間速度。自己寫了一個測打字速度的 Emacs 應用隙畜。但我想跟你說的不只是這個抖部。
Emacs 有的是一種你叫不出名字來的品質。
我們現(xiàn)在不用 Mailman 了议惰。那是因為我們有一種叫得出名字的品質 —— 就是您朽,爛。我們很爛换淆。我們(當時)找不到 Emacs-Lisp 足夠牛的人把 Mailman 繼續(xù)搞下去哗总。今天這應該不難了; 亞馬遜現(xiàn)在到處都是 Emacs Lisp 的黑客。但是在那時候倍试,客服部的人沒法從別人那里得到幫助讯屈。于是他們就用他們當時手頭有的資源去搞這件事。他們當時沒有足夠多的 Emacs-Lisp 的人县习。有一段時間涮母,他們甚至找來 Bob Glickstein 當合同工谆趾,那個給 O’Reilly 寫了那本 Gnu Emacs 擴展的書的家伙,坐在一個小辦公室里給 Emacs 寫 Mailman 的擴展叛本。
客服應用部是 Amazon 的第一個兩塊比薩餅的團隊(代表團隊人數(shù)的增加沪蓬,編者注)。這個團隊是完全自立的来候。不管是那時還是現(xiàn)在跷叉。沒人跟他們說話,沒人幫他們营搅。沒有槍云挟,沒有炮,他們自己造转质。他們沒有網(wǎng)頁工程師园欣,沒有支持工程師。屁也沒有休蟹。有的只是一堆骨灰級的工程師和一個能帶新人的文化沸枯。這就是他們需要的一切了。
但他們最終不得不讓 Mailman 光榮退休赂弓。媽哎绑榴。而我呢今天還聽到人們說他們是多么的懷念它。甚至在派對上拣展。
我想今天按人頭比例來說彭沼,客服部仍然擁有比亞馬遜任何其他團隊更多的 Lisp 黑客”赴#可能他們用到 Lisp 的機會不多了姓惑,但是 Eric Raymond 說過,即使你很少用 Lisp 寫程序按脚,學習 Lisp 會是意義深遠的一個經(jīng)歷于毙,能讓你下輩子都成為一個更好的工程師。
卡爾辅搬,宗教現(xiàn)在已經(jīng)不是大眾的精神鴉片了∥ň冢現(xiàn)在鴉片是集成開發(fā)環(huán)境了。(卡爾·馬克思堪遂。這個人不知道的話應該打屁屁)介蛉。
Java
Java 是過去的 10 年中計算行業(yè)里發(fā)生過的最好的同時也是最壞的事。
一方面溶褪,Java 把你從 C++ 編程的很多枯燥易錯的細節(jié)中解救出來了币旧。沒有數(shù)組越界了,沒有 core dump 了猿妈。拋出來的異常能讓你精確定位到出錯的那一行代碼吹菱,而且 99% 的時候都是正確的那一行出錯了的代碼巍虫。對象們在需要的時候能智能地把它們自己打印出來。等等等等鳍刷。
另一方面占遥,除了是一種語言,一個虛擬機输瓜,一個巨無霸的類庫瓦胎,一個安全模型,一個可移植的字節(jié)碼格式前痘,Java 還是一個宗教凛捏。邪教担忧。所以你不能太相信對它太虔誠的人芹缔。想要招一個好的 Java 工程師是一項很有技術挑戰(zhàn)的活。
但是總的來說瓶盛,Java 是軟件工程史上的一大進步最欠。
從 C++ 到 Java 不只是語法上的改變。這是一種需要一段時間去好好體會的一種震撼性的世界觀的轉變惩猫。這有點像突然你被配了一個執(zhí)行助理芝硬。你知道老總們?yōu)槭裁纯偸呛孟裼袝r間去開會,總是知道公司現(xiàn)在運行的情況轧房,總是寫出很酷酷的文檔嗎? 老總們常常忘記其實他們不是一個人在戰(zhàn)斗拌阴,他們都是兩個全職的人,他們和他們的執(zhí)行助理們奶镶。有一個執(zhí)行助理把你從瑣事中解救出來讓你有時間去思考那些真的需要你去解決的問題; 沒有的話你將不得不花一半的時間在那些無聊的世俗的事情上迟赃。切換到 Java 編程語言就把你變成了兩個程序員 —— 一個處理那些你不需要關心的東西,另一個可以集中精力在問題本身上厂镇。這是一個很震人的改變纤壁,一個你應該很快就能習慣能喜歡上的改變。
就像 Jamie Zawinski (Netscape 牛人捺信,開發(fā) Mozilla 瀏覽器酌媒,好像學歷是高中畢業(yè)?)在他著名的“Java 真爛(java sucks)”那篇文章里說的:“先說那些好東西:Java 沒有 free() 函數(shù)。我必須一開始就承認迄靠,其他的東西都沒什么了不起秒咨。(沒有 free)是能讓我原諒其他所有東西的特性,不管其他東西有多爛掌挚。講完這一點后雨席,我的文章里其他一切幾乎都完全沒有重要性了∫叻蹋”
Jamie 的文章寫在 1997 年舅世,按 Java 年來算的話是很早以前了旦委,跟他寫這篇文章時比,Java 已經(jīng)有很大的改善; 一些他抱怨的東西甚至已經(jīng)被 fix 了雏亚。
但是大多數(shù)還是沒有被 fix缨硝。Java 作為一門語言還是有點爛。但就如 Jamie 指出的罢低,Java“是今天為止最好的語言查辩。我的意思是說,它是今天市面上那些爛得底兒掉地一堆語言比起來有那么一點能被我接受网持∫说海”
真的,你應該讀讀他那篇文章功舀。
Java 幾乎每一方面都很好萍倡,除了它的語言本身,而這是 JWZ 抱怨的主要對象辟汰。但那是一個很大的抱怨列敲。再好的庫也救不了一個爛語言。相信我:你可能比我知道多得多的東西帖汞,但是我知道好兵救不了爛將戴而。在 Geoworks 搞了五年匯編語言都會了我這個道理。
跟 C++ 比翩蘸,Java 作為一個語言還過得去所意。好吧,別扯了催首,Java 要好很多扶踊。因為它有(內建)的字符串。哥們翅帜,你說一個沒有內建的字符串的語言是人用的嗎姻檀。
但是 Java 跟 C++ 比少了一些好東西,比如(函數(shù)調用時)傳引用涝滴,棧上的對象绣版,typedef,宏歼疮,以及運算符重載杂抽。一些時不時地會很稱手的東西。
哦韩脏,還有多重繼承缩麸,我現(xiàn)在老了,反而挺欣賞了的多重繼承赡矢。如果你認為我這個觀點僵硬不靈活的家伙是多態(tài)教義很好的反例的話杭朱,我倒是可以給你舉幾個為什么你需要多態(tài)繼承的好例子阅仔,或者至少像 Ruby 那樣的 mixin 或者自動的派遣。下次問問我白龍馬的事情弧械。今天我要告訴你為什么 Java 的 interface 是個爛貨八酒。
幾年前 Gosling 自己都說,如果一切都能重來的話刃唐,他不會搞出個 interface 的概念羞迷。
但是那正是 Java 的問題。當 James 說出那句話的時候画饥,人們被雷到了衔瓮。我甚至能感覺到那股雷勁兒,能感覺到 Sun 公司市場部和法務部的鳥人是多么想把 James 滅口抖甘,然后告訴大家他沒那么說過热鞍。
Java 的問題就是人們都被那幫人搞的廣告效應蒙住了眼。C++单山,Perl碍现,任何流行語言都有這個問題幅疼。這是很嚴重的米奸,因為如果沒有一些說大話吹牛逼的廣告,一個語言是不會流行起來的爽篷。所以如果一個語言的設計者說他的語言沒有被設計得很完美的話悴晰,就是趕緊用麻醉槍射擊這胡說八道的家伙并關閉會議的時候了。
語言們需要放點兒衛(wèi)星才能活逐工,我只希望人們不要被衛(wèi)星耀瞎了眼铡溪。
我學了面向對象編程, 我自己也對此大吹大擂泪喊。當我加入亞馬遜時棕硫,我不能告訴你我有什么智慧或者經(jīng)驗,但我可以給你背誦出所有關于 OOP 的魔咒袒啼。多重繼承是邪惡的哈扮,因為大家都這么說; 運算符重載是邪惡的,諸如此類蚓再。我甚至有點模糊地知道為什么是邪惡的滑肉,但實際上不知道。后來我明白了摘仅,這些都不邪惡靶庙,不是爛玩意兒,爛的是開發(fā)者娃属,是我六荒。我現(xiàn)在還是爛护姆,但是希望每年都不爛一點起來。
上禮拜我碰到一個來面試的掏击,他告訴我多繼是邪惡的签则,因為,比如铐料,你可以從頭渐裂,胳膊,腿钠惩,軀干多重繼承出一個人來柒凉。他既是對的,又是錯的篓跛。那樣的多繼情形當然邪惡膝捞,但那都是因為他自己太邪惡了。那樣繼承出來的“東西”遠遠就能看見有多蠢愧沟,如果他還把這玩意兒弄進門來那就更邪惡了蔬咬。
不良開發(fā)者,占了這世上開發(fā)者的大多數(shù)沐寺,他們能用你扔給他們隨便什么語言寫出不良的代碼林艘。
說了這些,還是得說回來混坞,多繼不是請客吃飯那么輕松的事兒; mixin 看起來是更好的解決方案狐援,但是還沒人完美的解決這個問題。但我還是認為 Java 比 C++ 好究孕,即使它沒有多繼啥酱。因為我知道不管我的出發(fā)點是多么好,某一天我還是會被一堆不懂怎么寫好代碼的人包圍厨诸,讓他們用 Java 比用 C++ 會帶來更少的傷害镶殷。
此外,Java 除了語言本身外還有老多其他的重要有用的東西微酬。且 Java 語言本身也在進化响巢,雖然像冰川一樣慢缆八,所以我們還是能看到希望吱七。Java 正是我們應該在亞馬遜推薦使用的語言仪糖。
你就是得小心點兒,因為和其他任何語言一樣忙上,你能很容易找出一堆人拷呆,他們很懂一門語言及其編程環(huán)境,但對品味,計算或者其他任何重要的東西卻一無所知茬斧。
當你有懷疑時腰懂,還是雇那種會好幾門語言的 Java 程序員,那種厭憎 J2EE/EJB 之類松松跨跨的所謂框架的项秉,那種使用 Emacs 的绣溜。這都是一些實戰(zhàn)經(jīng)驗。
奇獲奇才——套利交易第五期實戰(zhàn)訓練營娄蔼,開課啦怖喻!
上課地點:上海
培訓時間:2016年8月20日—26日
咨詢電話/微信:13061694649
Perl
Perl,怎么說呢?
Perl 是個老朋友岁诉。老老朋友锚沸。我開始寫 Perl 代碼的時候,可能是 1995 年涕癣。而它為我很好的服務了差不多 10 年的時間哗蜈。
它就像你騎了十萬二十萬英里的老自行車,你心里永遠有一塊地方裝著它坠韩,雖然現(xiàn)在你已經(jīng)換了一輛更加現(xiàn)代化的只有五磅重的自行車距潘,而且這一輛也不像老的那輛頂?shù)媚闫ㄑ厶哿恕?/p>
Perl 受歡迎原因有仨:
用 Perl 你很快就能搞定你的問題。而這是最終的衡量標準只搁。
Perl 有世上最好的市場推廣音比。你可以寫一本介紹他們市場推廣有多絕的書。Sun 公司砸大筆錢給 Java 推市場须蜗,Perl 在受歡迎程度來說能跟 Java 齊頭并進硅确,但 Perl 純粹是依靠 Larry Wall 和他那幫哥們的三寸不爛之舌做市場。哈佛商學院的人應該去研究 Perl 的市場是怎么做出來的明肮。真的讓人瞠目結舌。
直到差不多缭付,呃柿估,現(xiàn)在,Perl 沒有真正的競爭者陷猫。
有比 Perl “好”的語言秫舌。操,有很多比 Perl 好的語言绣檬,如果你定義“好”為“不是給瘋子用的”的話足陨。Lisp, Smalltalk, Python,媽呀娇未,我可能可以列出二三十種比 Perl “好”的語言墨缘。從這些語言不像這個夏天在臺灣街頭爆了肚皮的抹香鯨這個角度來說。鯨魚腸子到處都是,汽車上镊讼,機車上宽涌,行人身上。這就是 Perl蝶棋。讓人著迷卸亮,真的。
但是 Perl 有很多很多好的特性玩裙,直到最近兼贸,都是其他語言沒有的。它們彌補了 Perl 腸子在外的不足吃溅。你可以從爆了肚皮的鯨魚可以做很多有用的東西出來寝受,比如香水。這很有用罕偎。Perl 也是這樣很澄。
當其他的那些語言(尤其是 Lisp 和 Smalltalk)都想假裝操作系統(tǒng)并不存在,列表(Lisp 的)和對象(Smalltalk 的)就是把屎搞出來的唯一存在颜及,Perl 卻走了截然相反的路子甩苛。Larry 說:Unix 和字符串是搞出屎來的唯一存在。
對很多任務來說俏站,他絕對是正確的讯蒲。所以 Perl 絕對是 Unix 系統(tǒng)管理和字符串處理的史上最強語言,除了一個肄扎,剛出來的一個墨林,從哥斯拉(電影哥斯拉看過沒)之地出來的一個。我一會兒會講到那一個犯祠。
可惜旭等,Larry 太太太太在意 Unix 系統(tǒng)管理和字符串處理以致他壓根忘了列表和對象,等他明白過來想改正的時候已經(jīng)晚了衡载。實際上搔耕,在 Perl 早期的…好吧,對鯨魚腸子我實在不想用“設計”這個詞痰娱,就說生命周期中吧弃榨,他犯的幾個關鍵錯誤讓把列表和對象加進來變得如此尷尬,以致 Perl 已經(jīng)進化成一個真正的 Rube Goldberg 機器梨睁,至少當你想在 Perl 里用列表和對象的時候鲸睛。(Rube Goldberg 是一漫畫家,常畫一些很復雜的機器坡贺,但只完成簡單的工作官辈,比如一個小球滾過很多關卡箱舞,最后把門打開。譯者注)钧萍。
列表和對象也他媽的是很重要的褐缠,Larry!(farging 應該是作者不想說 fucking 那么直白风瘦,譯者注)
Perl 沒法表達列表因為 Larry 一早犯了一個悲劇性的愚蠢的錯誤队魏,把列表全抹平。于是(1, 2, (3, 4))魔術般地變成(1, 2, 3, 4)万搔。不是說你會想讓它這樣工作胡桨,而是 Larry 剛好那天在搞一個這樣會更方便的問題。于是 Perl 的數(shù)據(jù)結構從此就變得爆炸了的鯨魚了瞬雹。
今天你看 Perl 的書昧谊,小教程或 PPT 的時候,不花三分之一的時間在“引用”上是不可能的酗捌。這就是 Larry 可憐的呢诬,壞了的,Goldberg (漫畫家胖缤,想起來沒? 譯者注)式的對他那抹平列表的瘋狂錯誤的解決方案尚镰。但是 Perl 的市場宣傳做得那么難以置信地好以致它讓你覺得這是你身上發(fā)生過的最好的東西。你可以對任何東西取它的引用哪廓。這很有趣狗唉!聞起來也很香(說腸子呢,譯者注涡真,呵呵)分俯!
Perl 不能支持面向對象編程因為 Larry 壓根不相信這玩意兒。這可能沒什么大不了; 我也不是很確定我是不是信這個 OOP哆料。但是那么為啥他又要試著把對象加進 Perl 呢? Perl 的面向對象是個半成品缸剪,且在 Perl 社區(qū)里沒多少人重視。它就是不像字符串處理或 Unix 集成那樣充滿靈感剧劝。
當然了橄登,Perl 還有其他很多怪怪的特性。比如它的“上下文”讥此,這是 Larry 要有N個變量名字空間的喜劇式?jīng)Q定的一個恐怖片式的產(chǎn)物。這些空間由 sigil 來區(qū)分(就是 Perl 里變量名前面的‘$’谣妻,‘@’萄喳,‘%’字符),看著像是從 shell 腳本里拷貝來的蹋半。在 Perl 里他巨,所有的運算符,所有的函數(shù),所有的操作其行為都是六取一的隨機的染突,取決于當前的“上下文”捻爷。沒有一些規(guī)則或助記法能幫你搞定這些特定操作在特定上下文里的特定行為。你得把它們全記在腦子里份企。
想要個例子? 這兒有一個:在一個值量(scalar也榄,對應于 vector,向量)上下文里對一個哈希取值你得到一個字符串司志,里面是個分數(shù)甜紫,分子是目前已分配的鍵,分母是總共有多少個桶骂远。鯨魚腸子囚霸,我告訴你。
但就像我說的—直到最近激才,沒啥能像 Perl 那樣把屎搞定拓型。
Ruby
每過 15 年左右,一門語言就會被更好的代替瘸恼。C被 C++ 代替劣挫,至少對大應用開發(fā)而又需要性能和數(shù)據(jù)類型的人們來說。C++ 被 Java 代替钞脂,而 Java 無疑在 7 年后又會被更好的東西代替—好吧揣云,我說的是完全代替 C++ 的 7 年后,這到目前為止還沒有發(fā)生冰啃,主要是因為微軟能在 Java 霸占桌面系統(tǒng)之前狙擊它邓夕。但是在服務器上的應用而言,C++ 的陣地已經(jīng)慢慢讓給 Java 了阎毅。
Perl 有一天也會消逝焚刚。那是因為一門新的語言 Ruby 剛剛終于被翻譯成英語了。沒錯扇调,它是在日本發(fā)明的矿咕,這么多地兒,沒想到日本人搞出來了狼钮,還以為他們只是硬件和制造上占有名氣碳柱,而不是他們的軟件業(yè),所以大家都跟你一樣驚奇熬芜。為什么呢莲镣,大家可能都在想。但是我認為這都是跟打字有關涎拉。我根本不能想象他們以前能打字打得足夠快瑞侮,英文字母只有 26 個的圆,他們卻有上萬個字。但是 Emacs 幾年前支持多字節(jié)字符了半火,所以我猜他們現(xiàn)在打字速度他媽的快多了越妈。(所以能搞出 Ruby 來了,譯者猜作者是這個意思) (是的钮糖,他們也用 Emacs —— 事實上日本人負責了 Emacs 多字節(jié)支持的大部工作梅掠,而且搞得堅不可摧。)
不管怎么樣藐鹤,Ruby 從 Perl 那里偷師了所有的好東西; 實際上瓤檐,Matz, Ruby 的作者(Yukihiro Matsumoto,如果我沒記錯的話娱节,但是他外號“Matz”)挠蛉,覺得他從 Perl 那里偷的有點太多了,他的鞋上也粘了些鯨魚腸子肄满。但是只是一丟丟谴古。
最重要的是,Ruby 拿來了 Perl 的串處理和 Unix 集成稠歉,一點沒改掰担,就是說語法都是一樣的,于是乎啥也不說了怒炸,你就擁有了 Perl 最好的那部分带饱。這是個不錯的開局,特別是如果你不把 Perl 剩下的東西也拿進來的話阅羹。
但是之后 Matz 還從 Lisp 那里拿來的最好的列表處理勺疼,Smalltalk 和其他語言那里拿來了最好的面向對象,CLU 那里拿來了最好的迭代器捏鱼,以及基本上是每個人每個事的最好的東西执庐。
而他讓這些東西全部都跑起來,跑得那么順导梆,你都不會注意到這些東西在那兒轨淌。我比其他任何語言都快就學會了 Ruby,我總共會三十到四十門語言; 而我花了大概三天時間就能用 Ruby 比 Perl 還流暢地工作了看尼,當了八年的 Perl 黑客后递鹉。這些東西是這么的和諧你都能自己猜它們是怎么工作的,而且大多數(shù)時候你都能猜對藏斩。漂亮梳虽。有趣≡肿拢靠譜窜觉。
如果把語言比成自行車,那么 AWK 就是一輛粉系的兒童自行車北专,前面有個白色小框禀挫,還插塊小旗,Perl 就是沙灘車(還記得那有多酷吧? 唉拓颓。)语婴,而 Ruby 則是一輛七千五美金的鈦合金山地自行車。從 Perl 飛躍到 Ruby 意義不下于從 C++ 到 Java 的飛躍驶睦。卻沒有任何缺陷砰左,因為 Ruby 幾乎是 Perl 功能的一個超集,而 Java 卻拿掉了一些人們想要的東西场航,且沒有真正的提供一個替代品缠导。
下次我會寫更多關于 Ruby 的東西。我先需要靈感溉痢。去讀讀 Lucky Stiff 的(poignant) guide to Ruby 吧僻造。那本書是一本有靈感的書。真的孩饼,讀一下髓削。超贊。我不理解產(chǎn)生它的那種頭腦镀娶,但它很有趣立膛,很犀利,且全是關于 Ruby 的梯码。好像宝泵。你會看到的。
Python
啊忍些,Python 怎么說呢鲁猩,一個不錯的語言,這么多年來一直旁邊在等待它的機會? Python 社區(qū)很長時間以來是那些勇敢地吞下紅藥片從 Perl 駭客帝國中醒來的人的避難營罢坝。
啊廓握,有點像 Smalltalk 的人們,他們永遠在等待替代C++嘁酿,沒想到半路殺出 Java 一下把它們操翻了隙券,漂亮地,永久地闹司。哎喲娱仔。Ruby 正在對 Python 做著同樣的事,現(xiàn)在游桩,今天牲迫∧推樱可能會在一夜之間吧。
Python 本來可以統(tǒng)治世界盹憎,可惜它有兩個致命缺陷:空格筛峭,和冷淡。
空格很簡單陪每,就是說 Python 是用縮進來表達代碼塊之間的嵌套影晓。它強制你必須按一定格式把所有的東西縮進,他們這樣做是為了讓所有人寫的代碼看上去一樣檩禾。不料蠻多程序員討厭這點挂签,因為他們覺得自己的自由被拿走了; 感覺就像 Python 侵犯了憲法賦予他們的可以隨便縮進格式和全寫在一行上的權利。
Python 的作者盼产,Guido Van Rossum饵婆,也在早期犯過一些很傻的技術錯誤 —— 沒有像 Larry 的失誤那么嚴重,但是還是有幾個辆飘。比如啦辐,最早 Python 沒有字面變量范圍,但它同時也沒有動態(tài)變量范圍蜈项,而動態(tài)變量范圍可能會有它一些問題芹关,但它還是有用的。Python 卻沒有這些紧卒,只有全局的和本地(函數(shù))的兩種范圍侥衬。所以即使它是一個真正的 OO 系統(tǒng),類甚至不能訪問它們自己的動態(tài)成員變量跑芳。你必須給成員函數(shù)傳“self”參數(shù)轴总,一大堆 self 參數(shù)很快就會把你搞瘋掉,即使你不在意空格問題博个。
等等之類怀樟。
但在我看來,Python 不行其實是因為冷淡盆佣。這阻止了它成為首選腳本語言往堡,或者首選一切語言」菜#靠虑灰,人們現(xiàn)在還在用 Tcl 作嵌入解釋執(zhí)行器,雖然 Python 比 Tcl 好得不要太多 —— 除了痹兜,我說穆咐,這個冷淡問題。