lisp 鳥瞰...

在人工智能的很多研究中,Lisp 家族語言是最古老的、並仍然是最廣泛使用的工具。不象 Fortran 那樣,在很大程度上出於經濟上的動機而保持語言存活了四分之一個世紀,Lisp 在 AI 社區的興旺是因爲它的某些特徵的優越。

Lisp 至關重要的一個方面是試探性程序開發的概念。符號到值的任何提交(commitment)可以延遲直到這樣的決定不可避免,即使如此它可以用很小的代價逆 轉(reverse)。這允許我們快速的探索可供選擇的設計並逐步增加的建造程序。Lisp 的語法是簡單的、並且它的程序自然的表示爲數據結構,所以很容易寫操縱其他程序的程序。

還有一些額外的因素被結合了進來,對 Lisp 的持久流行做出了貢獻[Hayes (1987)]: 不象 Fortan 或 Cobol,Lisp 持續自由的演化。直到最近 Lisp 程序的經濟上的重要性仍是非常低的,這意味着沒有任何壓力要凍結語言的定義爲一個標準的特徵集。作爲一門 AI 語言,Lisp 長期用來攻擊“艱深”問題,這種任務導致了很多新特徵和強力工具。Lisp 社區總是接受一種工具建造文化,工具開發者自身典型的也是工具的使用者的事實大力促成了這種事態。Lisp 是非常易於擴展的("增加更多泥巴") 並自願“讓機器去做”。AI 研究總是準備擴展計算機的能力來更好的使用人類資源,這個政策經常導致工具超越了所在時代。被同樣的動機所刺激,還有對編程環境和個人工作站的非常早期的 興趣。

這種語言創新的精神已經融入成 Lisp 歷史的一部分。這已經由 McCarthy (1978) 和 Stoyan (1980) 詳細的寫入編年史中。Lisp (List Processing Language) 最初設計爲 Fortran 的一個擴展。John McCarthy 那時是 Dartmouth 學院的數學助理教授,他對使用計算機做符號計算(就是說,數學表達式的簡化)發生了早期的興趣, 在“Dartmouth Summer School on Artificial Intelligence”期間受 Newell 和 Simon 對 IPL 介紹的進一步刺激,這個研討班是 1956 年 McCarthy 和 Shannon 和 Minsky 一起組織的。儘管那時沒有任何參與者對如何最終完成人工智能有任何概念,數值計算完全不重要好象是明顯的,而操縱符號表達式的能力好象是關鍵性的。IPL 已經包括了表處理和遞歸的想法,但它在風味上仍是非常“低級的”。Fortan,剛剛被 IBM 表彰爲第一個真正的“高級”編程語言,好象是在正確方向上的前進了一步。不幸的是 Fortran 的設計受滿足高效數值計算需要的支配,而導致的僵化使它對於操縱 McCarthy 感興趣的各種應用需要的高度動態的結構是一個非常薄弱的基礎。一個自包含的表處理語言好象是更好的解決方案。此時 McCarthy 也是派到歐洲 Algol(Algorithmic Language)委員會的美洲代表團成員。在這裏它提出了條件表達式的概念並依次受到其他成員想法的影響。McCarthy 現在正視 Lisp 爲帶有 Algol式語法的一個編譯語言,但是它的第一個原型 Lisp I,有着非常不同的風味。

Lisp“稀少的”語法結構和解釋性本 質是非常偶然的發展出來的。我們對這些事件的討論遵循 Stoyan (1980) 給出的細帳。在 1958 年晚些時候 McCarthy 獲得了在 MIT 電子工程系的一個助理教授職務。與 Minsky 一起,接着是一個數學助理教授,他建立了“MIT 人工智能計劃”,配備了 2 個程序員,1 個祕書,1 個電傳打字機和 6 個學生(其中有 Kleinrock、 Bobrow 和 Slagl - [Stoyan (1980), 165])。 這個小組開始從事寫 Lisp 編譯器的一個適度的嘗試,但是 Fortan 計劃報告的 30 “人年”使完全實現好象是一個不可完成的目標。最初用彙編語言手工編碼了一些簡單的表處理函數和圓括號包圍的前綴表達式(就是 “(plus 2 2)” )用於測試。這種表示法後來被稱爲“Cambridge Polish”。紀念 Quine (一個(麻省)劍橋哲學家) 和 Lukasiewicz (表達式的“波蘭表示法”前綴形式的發明者)。儘管實驗得到了合理的進展,而遞歸和垃圾收集好象是小組必須最終解決的最困難的障礙,仍然沒有語言的精確定 義。在 1959 年 McCarthy (1960) 寫了一篇論文來展示 Lisp 等價於圖靈機,能作爲“可計算性”的可作爲替代的理論。爲此他需要一個一致的表示法,可以使用符號表達式來描述 Lisp 表達式和 Lisp 函數二者。這導致了“引用”和“求值”操作符,它們最初單獨的用作促成一個證明的理論工具。但是這篇論文帶來了大量未預期的結果。這個計劃的程序員之一, S. Russell 用彙編語言實現了“求值”,從而在編譯器計劃完全開始之前,提供了測試手工編碼的函數的方式。爲了以解釋性方式運行這樣的簡單 Lisp 程序,所有表達式都必須是嵌套進去,這樣程序自身成爲應用於某些數據的一個表達式。幸運的是 MIT 計算實驗室也介入了 MAC (Multi Access Computing)計劃中;最早期的努力是使用電傳終端進入分時系統中。Lisp 解釋器與交換式電傳終端一起使用(著名的“讀,求值,打印”週期)逐漸變得非常流行。這個解釋器識別的記號後來被稱爲“S-語言”,而第一個工作的 Lisp 系統在 1959 年 Association for Computing Machinery [McCarthy (1959)]年度會議上提出了。Lisp 1 有大約 90 個預定義函數,第一個應用例子是做初等函數的微分的一個簡單例程。這個解釋器馬上被進一步精製和擴展爲 Lisp 1.5 [140 個函數 - McCarthy (1962)],它擁有所有後來的 Lisp 系統的“祖先”的榮耀。Lisp 1.5 迅速成爲對於在 Boston 區域內從事語言轉換和人工智能工作的人很有吸引的工具。當他們離開並受僱於其他地方的時候,他們經常帶上一個複本,因而導致了廣泛的分佈。 McCarthy 自己在 1962 年去了 Stanford 大學。因爲他的研究轉移到更加理論性的領域,而沒有被牽涉到語言的進一步開發中。

Lisp 2,Algol 式的編譯版本從未出現。這有很多原因。首先,在解釋性上下文中 S 語言“稀少的”語法(Lisp = "Lots of Irritating, Spurious Parentheses")被證實是資產而不是債務。它使分析表達式非常的容易,因此允許快速開發嫁接在 Lisp 之上的子語言。幾乎所有所謂的“AI 語言”的都以這種方式實現的,很多 Lisp 程序員猛烈的抵制介入語法糖衣的額外層。Lisp 2 死亡的另一個因素是歸咎於“creeping featuritis”[Clinger (1988a), 25]。60 年代早期在 BBN(Bolt, Beranek 和 Newman)成立了一個委員會定義 Lisp 2 的特徵。這導致語言規定迅速增長,爲了保持“每個人”都高興而增加新特徵。實現由於財務上的限制最終被廢棄了並從未復活過。在 Edinburgh 大學開發的 Pop [Burstall 等 (1971), Burton 和 Shadbolt (1987)],可能最接近於 Lisp 2 的樣子。現代 Lisp 系統的語法同最初的“S-表示法”是一致的。McCarthy 自己總是稱之爲“M-表示法”[McCarthy et al. (1962)],它也用於 Allen (1978)優秀的教科書中。Allen 稱“M-表示法”爲規定而“S-表示法”是表示語言。

很 多基於 Lisp 1.5 的主要方言出現了。所有這些都基於一個共同祖先,但在提供的特徵和工具上顯示了引人注意的區別。這些不同在傳統上通過叫做“兼容函數”的包來跨越,它在另 一個上下文中解釋一個語言的構造。當然,這種方式在計算上是有花費的,而對於支持嚴肅工作通常需要某種形式的“手工”轉換。

定理證明(比如 SAINT 和 SIN)和代數公式操縱系統(比如 MACSYMA)方面的工作,在 MIT 的 MAC 計劃導致了 MacLisp[Moon (1974)]。這個方言特別注意了數值計算的效率,這是對很多早期 Lisp 系統的常見的批評。MacLisp 自豪於一組豐富的數據類型(數組,hunk ...),用於程序開發和調試的用戶友好的環境,和一組豐富的預定義函數(大約 300 個)。它還擔當了 ZetaLisp 的基礎,這是用於 MIT (現在是 Symbolics)的 Lisp-機器計劃[Weinreb 和 Moon (1981)]的 Lisp 版本。“標準” Lisp 和它的後代 “可移植”標準 Lisp [Griss 和 Morrison (1981)] 由 Hearn 和其他人在 Utah 大學設計和實現。 最初用作 REDUCE,和其他公式操縱系統的基礎,它現在是 Hewlett Packard 工作站的 Lisp 方言,它的名字有某種誤導,因爲它明確的不是 Lisp 標準,並且也不比其他方言容易移植。

在 J. McCarthy 離開 MIT 到 Stanford 的時候,很多他以前的研究生被其他大學和研究機構僱傭。Bobrow 兩兄弟工作於 Bolt, Beranek and Newman,一個美國研究公司。D. Bobrow 加入了在 California 的 Xerox Palo Alto 研究中心(PARC)。一段時間內在這兩個機構都維持着一個聯合開發的 Lisp 系統(Interlisp - Teitelman (1974))。Interlisp 也用在 Stanford 大學,在這裏它成長爲今天能獲得的最複雜的 Lisp 系統(大約 600 個預定義函數),帶有大量的工具和被認爲最用戶友好的環境[Sandewall (1978), Teitelman 和 Masinter (1981)]。這個系統的一個更新版本(Interlisp-D)後來在 Xerox “Lisp 機器”上(就是 Dandelion, Dorado 和 Dolphin),還被移植到 Siemens 和 IBM 設備上。

Bobrow 兩兄弟的第二個,R. Bobrow,最終擔任 California 大學在 Irvine (UCI)的教師,在這裏他開發了 UCI-Lisp [Meehan (1979)],這是在很多研究機構流行的方言。在很多年中 UCI-Lisp 充當 Carnegie Mellon 大學的 AI 程序的主要編程工具。

自從捐贈了第一個 PDP6 到 MIT 的計算實驗室,DEC10 行列的機器在整個世界成爲 AI 研究的標準設備; 同樣的,Lisp 被控制爲一個編程工具。這種現象可以部分的由它被設計爲一個真正分時機器的事實來解釋,當時多數其他廠商的設備仍是面向批處理的。快速人/機交互被強制爲 支持 AI 的典型編程風格。另一個起作用的因素在於主要的 AI 中心(MIT、Stanford、Carnegie Mellon、Edinburgh)使用這些機器用於他們大批的工作的事實;使得要運行他們的軟件的拷貝就必須是選用 Lisp,而它又是自由發佈的。在七十年代後期和八十年代的 Unix 操作系統的流行日益增長,仍然在 DEC 的小型機行列上產生了大量的 Lisp 實現。 PDP11 Lisp,再次基於 MacLisp,在 Harvard 開發出來。當它的一些職員去 California 大學 Berkeley 分校的時候被拿到了美國西海岸,這裏已經對 Unix 有了強烈的興趣。FranzLisp [Foderaro (1979)]是最終出現的方言。它是基於 Unix 的並運行在 VAX 和其他在大學環境流行的機器上(比如 Suns, ...)。它的持續流行很大程度歸功於它的低大學使用價格。

最近在標準化上的興趣復興了,很大程度上受使用 Lisp 作爲專家系統開發工具的刺激。很多主要計算機廠商委託設計叫做 Common Lisp 的“標準” Lisp 變體[Steele (1984)]。“最初的目標是規定足夠接近 MacLisp 後代家族的每個成員的 Lisp,保證這些實現樂於朝向這個公共定義來發展自身。... 委員會的一個主要的子目標是用這個 COMMON LISP 寫的程序可以實現直接的源碼-可傳送,而不用管下層硬件” [Brooks 和 Gabriel (1984), p. 1]。迄今爲止這個計劃好象成功了。現在已經存在了很多實現。但是,仍有待觀察對規整 Lisp 以前不受限制的“特徵”增加的嘗試是否最終會成功[Allen (1987)]。仍有懷疑的餘地,因爲多數 Lisp 程序員是高度個人主義的,在風格問題上帶有強烈的信念,因爲 Lisp 使實現“新”特徵非常容易。已經有對 Common Lisp 的大小和它的更加不可思議特徵(經常包括它們來確保與過去兼容)的普遍批評。但是,這是一個好機會,商業壓力將至少導致一個公共基礎,更加專門的方言或子 集可以萌發於此,還有一個希望,反映在朝向 ISO Lisp 標準的努力上。

新出現的方言之一是 Scheme,一個詞法作用域版本的 MacLisp(象 NIL, T, ..)。Scheme 在 MIT 用來講授計算機編程的介紹性課程,並在 Abelson 等人(1985)的一本優秀的書中被加以良好的文檔。從作者的觀點看來 Scheme 是一個非常有表現力的和優雅的語言,圍繞着一個簡單的小核心,準備了正交性和非常靈活的特徵。嵌入到適當的交互編程環境中,它在實踐上反擊了通常針對  Lisp 的所有批評。它唯一的缺點在於缺乏與傳統的 Lisp 系統特別是 Common Lisp 的兼容性。

並行處理近些年已經成爲主要的研究焦點,由此產生了很多語言提議。MultiLisp [Halstead (1985)] 是一個有趣的基於 Scheme 的例子。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章