與眾不同的Lisp(圖片出自這里)
Lisp被許多資深程序員視為編程語言中的圣杯,因?yàn)閷W(xué)起來很難。著名程序員、最熱門的技術(shù)問答網(wǎng)站StackOverflow創(chuàng)始人Joel Spolsky曾經(jīng)在“Java語言學(xué)校的危險(xiǎn)性”一文中說,自己當(dāng)年在大學(xué)里學(xué)習(xí)用Lisp的導(dǎo)論課程也是苦不堪言,而Lisp這樣的函數(shù)式語言實(shí)際開發(fā)中并不常用,但是一旦到了體現(xiàn)優(yōu)勢的時(shí)候,你如果不懂,將失之千里。他還認(rèn)為,Google的核心技術(shù)之一MapReduce就來自函數(shù)式語言,而且使Google領(lǐng)先微軟多年。請注意,Spolsky曾經(jīng)1990年代微軟的Excel項(xiàng)目經(jīng)理,VBA的主要?jiǎng)?chuàng)造者。
《Unix編程藝術(shù)》的作者Eric Raymond也在“如何成為黑客”(英文版)中說過,Lisp是對黑客特別重要的語言,“掌握了之后,你會得到豐富的啟迪和經(jīng)驗(yàn)。 即使實(shí)際上很少使用Lisp,這些經(jīng)驗(yàn)也會使你在以后的日子里成為更好的程序員?!?/p>
而Paul Graham更是Lisp的頭號吹鼓手,他曾與蠕蟲病毒發(fā)明者Robert Morris一起,成功地用Lisp開發(fā)歷史上第一個(gè)Web應(yīng)用——ViaWeb,并高價(jià)賣給Yahoo致富。他在2001年寫了一篇宣傳Lisp的名文“Beating the Averages”(英文),其中說到:“Lisp之所以極為優(yōu)秀,并不是因?yàn)橹挥需F桿粉絲才知道的某些魔術(shù)般的性質(zhì),而在于它確實(shí)是最強(qiáng)大的編程語言。大家不用它的原因,在于編程語言不只是技術(shù),而且也是思維習(xí)慣,這是改變起來最慢的東西。”
有意思的是,美國時(shí)間10月18日,著名技術(shù)新聞網(wǎng)站Hacker News上,名為kung-fu-master的用戶發(fā)了一篇名為“問PG: Lisp與Python (2010)”的帖子,內(nèi)容很簡單:“好像許多Lisp老槍都開始轉(zhuǎn)而用Python的(比如Peter Norvig)。今天你怎么看Lisp與Python?”
這里的PG就是指Hacker News的創(chuàng)始人、著名Lisp程序員與吹鼓手Paul Graham。而其中提到的Peter Norvig則是另一個(gè)著名Lisp程序員,現(xiàn)任Google研發(fā)總監(jiān)。他有一篇經(jīng)典的文章“十年學(xué)會編程”(英文版),相信大家都已經(jīng)看過,他的首選推薦語言當(dāng)然也是Lisp(更準(zhǔn)確的說是Lisp的方言Scheme)。
面對這樣直接的問題,專家們是怎么回答的呢?
Paul Graham說:
這問題好像來自2005年而不是2010年。Lisp現(xiàn)在由于Clojure(Lisp的現(xiàn)代方言,可以運(yùn)行在JVM和.NET上——CSDN編者注)的出現(xiàn),已經(jīng)又變得時(shí)髦了。當(dāng)然Python也有很好的庫,但是我覺得用缺乏宏的語言編程很受局限。 |
許多網(wǎng)友對Python沒有宏的問題進(jìn)行了討論。有人說不支持宏是出于代碼可讀性的考慮。而更多的人則認(rèn)同宏是一種抽象工具,任何工具都會被誤用、濫用,但并不表示工具本身有問題。
另一Lisp專家,《Coder at Work》和《Practical Common Lisp》作者>Peter Seibel也加入了討論(他最近忙于編輯一種雜志Code Quarterly)。他說:自己與Peter Norvig有類似的體驗(yàn)。雖然自己Lisp非常熟練,但是在表達(dá)算法方面Python是最佳選擇。不過,相比Lisp實(shí)現(xiàn),CPython的運(yùn)行速度慢得驚人,甚至差5-10倍。
而Peter Norvig也罕見地現(xiàn)出真身,給出了自己的回答,內(nèi)容一如既往地經(jīng)典:
我是Peter Norvig。我轉(zhuǎn)向Python不是因?yàn)樗萀isp更好、更令人滿意、更實(shí)用,而是因?yàn)樗米鱾未a更合適。許多學(xué)生說,在《人工智能》(Norvig與Russell合著的經(jīng)典教材)一書中的偽代碼與我們在網(wǎng)上提供的Lisp代碼之間進(jìn)行轉(zhuǎn)換太難了。于是我要尋找一種更近似偽代碼的語言,發(fā)現(xiàn)Python是最合適的。然后我就自學(xué)了Python,熟練到足以實(shí)現(xiàn)教材中示例的地步。我發(fā)現(xiàn)Python對于一些類型的小問題非常合適,有些庫也是我與其他的一些代碼(包括在Google內(nèi)和網(wǎng)上其他地方的代碼)集成非常需要的。 我認(rèn)為Lisp對更大的項(xiàng)目和編譯速度很重要的應(yīng)用而言仍然具有優(yōu)勢。但是在主要目的是交流而非編程的時(shí)候(比如針對數(shù)量眾多的學(xué)生),Python更有優(yōu)勢。 就更一般意義上的編程而言,在Google和其他地方,我認(rèn)為語言的選擇并不如其他方面的選擇那么重要:如果你有了正確的總體架構(gòu)、正確的程序員團(tuán)隊(duì)、正確的開發(fā)過程(能夠快速開發(fā)、持續(xù)改善),那么很多語言都能勝任;但如果以上的東西你沒有,那無論選擇什么語言,你都會陷入一團(tuán)糟。 |
還有人找出今年2月Norvig在一次采訪(無法直接訪問)中類似的話,透露了Google內(nèi)部的一些信息:
(1) Google最開始似乎核心程序員都是用C++的,效率很高。這部分形成了公司的文化。 (2) Google早期的Lisp程序員(Erann Gat) 注意到其他程序員和自己的效率差不多,甚至更好。關(guān)鍵還是在人,與20年前相比,現(xiàn)在語言的選擇不那么重要了。 (3) Lisp是為單個(gè)程序員或者一小組程序員進(jìn)行探索性工作而專門設(shè)計(jì)的……如果我想自己在周末修改代碼,會更愿意用Lisp,但是如果有幾百個(gè)程序員一起改代碼,那就不是編程語言的問題,而是社會問題了。 (4) 庫。 |
其他人舉出的材料中,最有意思的應(yīng)該來自Lisp之父、計(jì)算機(jī)科學(xué)巨人約翰麥卡錫。這篇博客(無法直接訪問)里生動(dòng)講述了這位圖靈獎(jiǎng)得主在某次聽Peter Norvig改而鼓吹Python的演講后的情景:
Norvig演講后,進(jìn)入提問環(huán)節(jié)。出乎我的意料,他點(diǎn)了一位皺巴巴的老頭。老頭的胡子和頭發(fā)都花白了,而且亂糟糟的,看上去像是來此參觀但是迷路了,到這里來休息一下,好奇地聽聽我們在說什么。我第一個(gè)念頭是,估計(jì)他已經(jīng)被這么艱深的話題弄暈了。但是馬上想到,不對啊,這里離斯坦福很近,這老頭的年紀(jì)也對,難道是…… 只聽Norvig說:“是,John,你有什么問題?”我記不清Lisp之父當(dāng)時(shí)怎么問的了,但不超過十個(gè)詞,就是問Python是否能如Lisp那樣優(yōu)雅地像數(shù)據(jù)一樣處理代碼。“不,John,不行。”Norvig回答,然后靜等麥卡錫繼續(xù)發(fā)問。但是,老人什么也沒有再說。此時(shí)真是無言勝千語啊…… |
看來,在大師眼中,數(shù)據(jù)與代碼等同處理是最重要的語言特性之一。他還曾經(jīng)在訪談中這樣評價(jià)Ruby(提問者說Ruby從Lisp中借鑒了很多):“Ruby能像數(shù)據(jù)那樣使用列表結(jié)構(gòu)嗎?那每次算加和減的時(shí)候,都得進(jìn)行解析啰?這方面Ruby還不如1960年的Lisp?!?/p>
聯(lián)系客服