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