為什么Lisp沒(méi)有流行起來(lái)
本文探討的是為什么Lisp語(yǔ)言不再被廣泛使用的。
很久以前,這種語(yǔ)言站在計(jì)算機(jī)科學(xué)研究的前沿,特別是人工智能的研究方面。現(xiàn)在,它很少被用到,這一切并不是因?yàn)楣爬?類似古老的語(yǔ)言卻被廣泛應(yīng)用.
其他類似的古老的語(yǔ)言有 FORTRAN, COBOL, LISP, BASIC, 和ALGOL 家族,這些語(yǔ)言的唯一不同之處在于,他們?yōu)檎l(shuí)設(shè)計(jì),FORTRAN是為科學(xué)家和工程師設(shè)計(jì)的,他們?cè)谟?jì)算機(jī)上編程的目的是是為了解決問(wèn)題.COBOL是為了商業(yè)設(shè)計(jì)的,***的體現(xiàn)在于讓商人們可以利用電腦時(shí)代.LISP是了計(jì)算機(jī)科學(xué)研究設(shè)計(jì)的,最突出的體現(xiàn)在計(jì)算機(jī)基本原理研究.BASIC是為初學(xué)者設(shè)計(jì)的.***,ALGOL語(yǔ)言是有計(jì)算機(jī)程序員修改,演變成其他流行的語(yǔ)言,如C,Pascal和Java的一個(gè)龐大的家族。
上面提到的某些語(yǔ)言已經(jīng)不像當(dāng)初那么流行了。我們?cè)谶@里可以把它們稱作“失敗”。問(wèn)題是它們?yōu)槭裁词。?**站出來(lái)的是COBOL. 很不幸,它以面向商業(yè)人員的很好的可讀性就是它的失敗點(diǎn)。商業(yè)人員發(fā)現(xiàn),他們可以雇傭程序員去管理他們的系統(tǒng)。程序員自然會(huì)偏向于為他們?cè)O(shè)計(jì)的語(yǔ)言,而不是他們的老板。所以隨著時(shí)間推移,越來(lái)越多的商業(yè)功能都使用例如VB, C, C++ 和JAVA實(shí)現(xiàn)了。現(xiàn)在,只有很少一部分軟件仍通過(guò)COBOL語(yǔ)言編寫(xiě)。
BASIC卻有不同的命運(yùn)。他是為入門人員設(shè)計(jì)的。那些在微機(jī)上學(xué)習(xí)編程,他們會(huì)使用內(nèi)置的BASIC語(yǔ)言作為起點(diǎn)。隨著時(shí)間推移,微機(jī)被運(yùn)行微軟操作系統(tǒng)的個(gè)人電腦,或者M(jìn)acOS的蘋(píng)果電腦所代替。這種語(yǔ)言逐漸被VB所取代。雖然他是面向初級(jí)程序員,它有一段時(shí)間代替了COBOL。為什么要耗費(fèi)這么多的資源在昂貴的編譯器上,而便宜的解釋器在我們的電腦上已經(jīng)存在?最近,微軟以遷移到.NET框架上,讓VB跟在后面。它的替代者, C#就是ALGOL家族中的一員,跟Java相近。
這些年FORTRAN的使用起起伏伏。在某一階段,差不多所有科學(xué)方面的代碼是用它來(lái)寫(xiě)的。它的優(yōu)點(diǎn)是這門語(yǔ)言中沒(méi)有指針,并且不允許存在遞歸。這意味著所有數(shù)據(jù)的引用位置都可以在編譯時(shí)確定。FORTRAN編譯器利用這些額外的信息使程序運(yùn)行格外地迅速。不幸的是,隨著時(shí)間的推移,固定大小的數(shù)組這種數(shù)據(jù)結(jié)構(gòu)變得過(guò)時(shí)了?,F(xiàn)在,科學(xué)要處理任意形狀的風(fēng)格,甚至表述更為復(fù)雜的真實(shí)世界。這需要在語(yǔ)言中額外地加入指針。這些情況發(fā)生的時(shí)間段里,F(xiàn)ORTRAN逐漸走向沒(méi)落?,F(xiàn)在,它被轉(zhuǎn)移到高性能計(jì)算工作,其中新的并行矩陣和矢量運(yùn)算最近添加到這門語(yǔ)言中,仍然使它擁有性能優(yōu)勢(shì)。
ALGOL語(yǔ)言家族取得了成功。其原因是,這些語(yǔ)言是由程序員為程序員寫(xiě)的。隨著時(shí)間的推移,這些與系統(tǒng)和應(yīng)用相關(guān)的語(yǔ)言成為了現(xiàn)在最常用的語(yǔ)言。它的優(yōu)點(diǎn)是越多地程序員使用,這門語(yǔ)言就能得到更多地改進(jìn),并且越來(lái)越多地程序是用它們來(lái)寫(xiě)就的。這提供了一個(gè)良性循環(huán),更多的程序員們又被聘請(qǐng)?jiān)诩壕帉?xiě)的程序上工作。這是一個(gè)網(wǎng)絡(luò)效應(yīng)的例子。一個(gè)系統(tǒng)的“價(jià)值”是它的用戶數(shù)目的平方,在于以此速率增長(zhǎng)的用戶之間的交互作用。
那么為什么Lisp語(yǔ)言家族會(huì)站在失敗者一邊呢?有些人認(rèn)為是語(yǔ)法的錯(cuò)。Lisp因?yàn)樗睦ㄌ?hào)而臭名昭著。我并不認(rèn)為是這個(gè)理由。許多用戶說(shuō)良好的格式可以讓他們跟上這些括號(hào)。同時(shí),Lisp語(yǔ)言被發(fā)明不久后,有一個(gè)叫“super-bracket”的語(yǔ)法可以讓人快速表示出任意數(shù)量的回括號(hào)")"。這個(gè)特性在今天已經(jīng)很少有人使用了。***,優(yōu)秀的編輯器解決了大多數(shù)的語(yǔ)法問(wèn)題。
另一些人經(jīng)常抱怨Lisp是一門函數(shù)式語(yǔ)言。這是失敗的理由嗎?自然,跟早期的語(yǔ)言相比,只有Lisp算是函數(shù)式的。但事實(shí)上,我認(rèn)為沒(méi)有這么簡(jiǎn)單。Lisp也有命令式語(yǔ)言的特性,ALGOL系列語(yǔ)言也可以被當(dāng)作一門純正的函數(shù)式語(yǔ)言來(lái)用。 如果有人想選擇一種特定的編程范式來(lái)寫(xiě)代碼,一些特定的語(yǔ)言可以讓這個(gè)選擇更容易的實(shí)現(xiàn)。然而,現(xiàn)代語(yǔ)言已經(jīng)足夠靈活,它們能支持多種編程范式,近乎完全命令式的Lisp沒(méi)有理由不存在。
或許lisp的問(wèn)題在于他使用了垃圾回收?在那個(gè)時(shí)候,只有l(wèi)isp作為計(jì)算機(jī)語(yǔ)言采用了這個(gè)特性。誠(chéng)然,垃圾回收會(huì)占用大量的計(jì)算資源,而早期計(jì)算機(jī)在該方面的不足足以組織lisp大展拳腳了。但是,我認(rèn)為這仍然不是主要的原因。lisp是用來(lái)寫(xiě)那些復(fù)雜度相當(dāng)高的程序的,而這些程序在事實(shí)上都必須帶有一個(gè)垃圾回收模塊,如果你用其他的語(yǔ)言來(lái)寫(xiě)……大概很難比lisp實(shí)現(xiàn)的要好吧?眾所周知的事實(shí)是,任何一個(gè)如此復(fù)雜的程序,如果用其他語(yǔ)言寫(xiě)的話都不可避免的戴上一個(gè)比lisp垃圾回收臃腫不少的功能模塊……
lisp的失敗,恰恰是因?yàn)樗晒?,這讓他的目標(biāo)變得模糊。lisp相對(duì)與早期的語(yǔ)言實(shí)在是非常靈活,靈活到足以改變自身形式以適應(yīng)需求。對(duì)于其他的語(yǔ)言來(lái)說(shuō),如果想要完成一個(gè)龐大的任務(wù),就需要把這個(gè)任務(wù)打碎成一小塊一小塊的然后完成。如果是一個(gè)更大的呢?甚至連編譯都需要分步完成了。但是lisp不是這樣的,由于他強(qiáng)大的能力,程序員可以將lisp改造成特定領(lǐng)域的專門工具——順手的工具將順手的解決問(wèn)題——任務(wù)輕松完成了。由于語(yǔ)言的正交性(譯者注:這里可能應(yīng)該理解為“自洽”),我們改造過(guò)的lisp仍然可以使用原有的編譯器,解釋器運(yùn)行。
那么建立特定領(lǐng)域的語(yǔ)言來(lái)作為一個(gè)問(wèn)題的解決方案,它會(huì)出現(xiàn)什么問(wèn)題呢?結(jié)果是它非常高效。然而,這種做法會(huì)使語(yǔ)言分化。這導(dǎo)致許多子語(yǔ)言都略有不同。這是Lisp代碼對(duì)其他人而言可讀性差的真正原因。在其他語(yǔ)言中,相對(duì)來(lái)說(shuō)比較簡(jiǎn)單就能臆測(cè)出一段給定代碼的作用。有著超強(qiáng)的表達(dá)力的Lisp,由于一個(gè)給定的符號(hào)(symbol)可能是一個(gè)變量,函數(shù)或操作,需要閱讀大量代碼才能找出它。
Lisp失敗的原因是因?yàn)樗乃槠?,并且它的碎片化是因?yàn)槠湔Z(yǔ)言天性與特定領(lǐng)域方案的風(fēng)格造成的。而網(wǎng)絡(luò)效應(yīng)則恰恰相反。越來(lái)越少的程序員使用相同的方言,因此它相對(duì)與ALGOL語(yǔ)言家族的總價(jià)值下降。
如果有人現(xiàn)在設(shè)計(jì)一種語(yǔ)言,該如何避免這種問(wèn)題呢?如果語(yǔ)言的表達(dá)性是我們的目標(biāo),那么它必須以某種方式加以調(diào)整。這門語(yǔ)言必須要有特意的限制,來(lái)保證所編寫(xiě)代碼的可讀性。Python是一門成功的語(yǔ)言,它已經(jīng)做到了這些,其中某些限制是硬編碼的,而另一些則是以約定成俗的方式存在。
不幸的是,這么久過(guò)去了并且發(fā)明了這么多Lisp的變種語(yǔ)言,在其之上建立的其它新語(yǔ)言大概并不是所要的答案。根本不會(huì)有足夠多的用戶使它與眾不同。也許解決的辦法是,慢慢加入類似Lisp的語(yǔ)言功能到ALGOL語(yǔ)言家族中。幸運(yùn)的是,這似乎是正在所發(fā)生的事。新的語(yǔ)言(C#,D,Python等)趨向于擁有垃圾回收機(jī)制。他們也往往比舊的語(yǔ)言更具正交性。在未來(lái),最終會(huì)有行為很像Lisp的一種流行語(yǔ)言。
原文鏈接:http://www.oschina.net/translate/why_lisp_failed
英文原文:Why Lisp Failed