LISP定義
LISP是一種通用高級(jí)計(jì)算機(jī)程序語(yǔ)言,長(zhǎng)期以來(lái)壟斷人工智能領(lǐng)域的應(yīng)用。LISP作為因應(yīng)人工智能而設(shè)計(jì)的語(yǔ)言,是第一個(gè)聲明式系內(nèi)函數(shù)式程序設(shè)計(jì)語(yǔ)言,有別于命令式系內(nèi)過(guò)程式的C、Fortran和面向?qū)ο蟮?a href="http://www.delux-kingway.cn/v/tag/852/" target="_blank">Java、C#等結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言。
Lisp是一門(mén)歷史悠久的語(yǔ)言,全名叫LISt Processor,也就是“表處理語(yǔ)言”,它是由John McCarthy于1958年就開(kāi)始設(shè)計(jì)的一門(mén)語(yǔ)言。和Lisp同時(shí)期甚至更晚出現(xiàn)的許多語(yǔ)言如Algo等如今大 多已經(jīng)消亡,又或者僅僅在一些特定的場(chǎng)合有一些微不足道的用途,到現(xiàn)在還廣為人知的恐怕只剩下了 Fortran和COBOL。但唯獨(dú)Lisp,不但沒(méi)有隨著時(shí)間而衰退,反倒是一次又一次的煥發(fā)出了青春,從Lisp分支出來(lái)的Scheme、ML等語(yǔ)言在很多場(chǎng)合的火爆程度甚至超過(guò)了許多老牌明星。那么這顆常青樹(shù) 永葆青春的奧秘究竟在哪里呢?
如果你只接觸過(guò)C/C++、Pascal這些“過(guò)程式語(yǔ)言”的話,Lisp可能會(huì)讓你覺(jué)得十分不同尋常,首先吸引你眼球(或者說(shuō)讓你覺(jué)得混亂的)一定是Lisp程序中異常多的括號(hào),當(dāng)然從現(xiàn)在的角度來(lái)講,這種設(shè)計(jì)的確對(duì)程序員不大友好,不過(guò)考慮到五六十年代的計(jì)算機(jī)處理能力,簡(jiǎn)化語(yǔ)言本身的設(shè)計(jì)在那時(shí)算得上是當(dāng)務(wù)之急了。
Lisp的基本語(yǔ)法很簡(jiǎn)單,它甚至沒(méi)有保留字(有些語(yǔ)言學(xué)家可能對(duì)這一點(diǎn)有異議),它 只有兩種基本的數(shù)據(jù),僅有一種基本的語(yǔ)法結(jié)構(gòu)就是表達(dá)式,而這些表達(dá)式同時(shí)也就是程序結(jié)構(gòu),但是正如規(guī)則最簡(jiǎn)單的圍棋卻有著最為復(fù)雜的變化一樣,Lisp使用最基本的語(yǔ)言結(jié)構(gòu)定義卻可以完成其它語(yǔ)言難于實(shí)現(xiàn)的、最復(fù)雜的功能。
語(yǔ)言應(yīng)用
LISP是函數(shù)式程序設(shè)計(jì)的先鋒,其諸多革命性的創(chuàng)新思維影響了后續(xù)編程語(yǔ)言的發(fā)展,亦完全壟斷人工智能領(lǐng)域的應(yīng)用長(zhǎng)達(dá)三分之一個(gè)世紀(jì)。曾在開(kāi)展初年出現(xiàn)的低效率因素亦在集體改良中被移去,成就了現(xiàn)在廣被應(yīng)用于軟件開(kāi)發(fā)、電子商務(wù)及金融系統(tǒng)的Common Lisp、Scheme、Emacs Lisp和Clojure等。
?
關(guān)于Lisp9種語(yǔ)言思想
Lisp語(yǔ)言誕生的時(shí)候就包含了9種新思想。其中一些我們今天已經(jīng)習(xí)以為常,另一些則剛剛在其他高級(jí)語(yǔ)言中出現(xiàn),至今還有2種是Lisp獨(dú)有的。按照被大眾接受的程度,這9種思想依次如下排列。
(1) 條件結(jié)構(gòu)(即if-then-else結(jié)構(gòu))?,F(xiàn)在大家都覺(jué)得這是理所當(dāng)然的,但是Fortran I就沒(méi)有這個(gè)結(jié)構(gòu),它只有基于底層機(jī)器指令的goto結(jié)構(gòu)。
(2) 函數(shù)也是一種數(shù)據(jù)類型。在Lisp語(yǔ)言中,函數(shù)與整數(shù)或字符串一樣,也屬于數(shù)據(jù)類型的一種。它有自己的字面表示形式(literal representation),能夠存儲(chǔ)在變量中,也能當(dāng)作參數(shù)傳遞。一種數(shù)據(jù)類型應(yīng)該有的功能,它都有。
(3) 遞歸。Lisp是第一種支持遞歸函數(shù)的高級(jí)語(yǔ)言。
(4) 變量的動(dòng)態(tài)類型。在Lisp語(yǔ)言中,所有變量實(shí)際上都是指針,所指向的值有類型之分,而變量本身沒(méi)有。復(fù)制變量就相當(dāng)于復(fù)制指針,而不是復(fù)制它們指向的數(shù)據(jù)。
(5) 垃圾回收機(jī)制。
(6) 程序由表達(dá)式組成。Lisp程序是一些表達(dá)式樹(shù)的集合,每個(gè)表達(dá)式都返回一個(gè)值。這與Fortran和大多數(shù)后來(lái)的語(yǔ)言都截然不同,它們的程序由表達(dá)式和語(yǔ)句組成。
區(qū)分表達(dá)式和語(yǔ)句在Fortran I中是很自然的,因?yàn)樗恢С终Z(yǔ)句嵌套。所以,如果你需要用數(shù)學(xué)式子計(jì)算一個(gè)值,那就只有用表達(dá)式返回這個(gè)值,沒(méi)有其他語(yǔ)法結(jié)構(gòu)可用,否則就無(wú)法處理這個(gè)值。
后來(lái),新的編程語(yǔ)言支持塊結(jié)構(gòu),這種限制當(dāng)然也就不存在了。但是為時(shí)已晚,表達(dá)式和語(yǔ)句的區(qū)分已經(jīng)根深蒂固。它從Fortran擴(kuò)散到Algol語(yǔ)言,接著又?jǐn)U散到它們兩者的后繼語(yǔ)言。
(7) 符號(hào)類型。符號(hào)實(shí)際上是一種指針,指向存儲(chǔ)在散列表中的字符串。所以,比較兩個(gè)符號(hào)是否相等,只要看它們的指針是否一樣就行了,不用逐個(gè)字符地比較。
(8) 代碼使用符號(hào)和常量組成的樹(shù)形表示法。
(9) 無(wú)論什么時(shí)候,整個(gè)語(yǔ)言都是可用的。Lisp并不真正區(qū)分讀取期、編譯期和運(yùn)行期。你可以在讀取期編譯或運(yùn)行代碼,也可以在編譯期讀取或運(yùn)行代碼,還可以在運(yùn)行期讀取或者編譯代碼。
在讀取期運(yùn)行代碼,使得用戶可以重新調(diào)整(reprogram)Lisp的語(yǔ)法;在編譯期運(yùn)行代碼,則是Lisp宏的工作基礎(chǔ);在運(yùn)行期編譯代碼,使得Lisp可以在Emacs這樣的程序中充當(dāng)擴(kuò)展語(yǔ)言(extension language);在運(yùn)行期讀取代碼,使得程序之間可以用S表達(dá)式(S-expression)通信,近來(lái)XML格式的出現(xiàn)使得這個(gè)概念被重新“發(fā)明”出來(lái)了。
Lisp語(yǔ)言剛出現(xiàn)的時(shí)候,這些思想與其他編程語(yǔ)言大相徑庭,后者的設(shè)計(jì)思想主要由50年代后期的硬件決定。隨著時(shí)間流逝,流行的編程語(yǔ)言不斷更新?lián)Q代,語(yǔ)言設(shè)計(jì)思想逐漸向Lisp靠攏。思想(1)到思想(5)已經(jīng)被廣泛接受,思想(6)開(kāi)始在主流編程語(yǔ)言中出現(xiàn),思想(7)在Python語(yǔ)言中有所實(shí)現(xiàn),不過(guò)似乎沒(méi)有專用的語(yǔ)法。
思想(8)可能是最有意思的一點(diǎn)。它與思想(9)只是由于偶然原因才成為L(zhǎng)isp語(yǔ)言的一部分,因?yàn)樗鼈儾粚儆邴溈ㄥa的原始構(gòu)想,是由拉塞爾自行添加的。它們從此使得Lisp語(yǔ)言看上去很古怪,但也成為了這種語(yǔ)言最獨(dú)一無(wú)二的特點(diǎn)。說(shuō)Lisp語(yǔ)言古怪倒不是因?yàn)樗恼Z(yǔ)法很古怪,而是因?yàn)樗緵](méi)有語(yǔ)法,程序直接以解析樹(shù)(parse tree)的形式表達(dá)出來(lái)。在其他語(yǔ)言中,這種形式只是經(jīng)過(guò)解析在后臺(tái)產(chǎn)生,但是Lisp直接采用它作為表達(dá)形式。它由列表構(gòu)成,而列表則是Lisp的基本數(shù)據(jù)結(jié)構(gòu)。
用一門(mén)語(yǔ)言自己的數(shù)據(jù)結(jié)構(gòu)來(lái)表達(dá)該語(yǔ)言是非常強(qiáng)大的功能。思想(8)和思想(9),意味著你可以寫(xiě)出一種能夠自己編程的程序。這可能聽(tīng)起來(lái)很怪異,但是對(duì)于Lisp語(yǔ)言卻是再普通不過(guò)。最常用的做法就是使用宏。
術(shù)語(yǔ)“宏”在Lisp語(yǔ)言中的意思與其他語(yǔ)言中的不一樣。Lisp宏無(wú)所不包,它既可能是某樣表達(dá)式的縮略形式,也可能是一種新語(yǔ)言的編譯器。無(wú)論是想真正理解Lisp語(yǔ)言,還是只想拓寬編程視野,最好都學(xué)學(xué)宏。就我所知,宏(采用Lisp語(yǔ)言的定義)目前仍然是Lisp獨(dú)有的。一個(gè)原因是為了使用宏,你大概不得不讓你的語(yǔ)言看上去像Lisp一樣古怪。另一個(gè)可能的原因是,如果你想為自己的語(yǔ)言添上這種終極武器,你從此就不能聲稱自己發(fā)明了新語(yǔ)言,只能說(shuō)發(fā)明了一種Lisp的新方言。
我把這件事當(dāng)作笑話說(shuō)出來(lái),但是事實(shí)就是如此。如果你創(chuàng)造了一種新語(yǔ)言,其中有car、cdr、cons、quote、cond、atom、eq這樣的功能,還有一種把函數(shù)寫(xiě)成列表的表示方法,那么在它們的基礎(chǔ)上完全可以推導(dǎo)出Lisp語(yǔ)言的所有其他部分。事實(shí)上,Lisp語(yǔ)言就是這樣定義的,麥卡錫把語(yǔ)言設(shè)計(jì)成這個(gè)樣子就是為了讓這種推導(dǎo)成為可能
評(píng)論