解晨
摘要:自從世界上第一個高級編程語言Fortran誕生以來,高級編程語言已經(jīng)發(fā)展了近六十年,無數(shù)的優(yōu)秀語言先后問世,至今全世界已有幾百種語言。Lisp,作為與Fortran同時代誕生的元老級高級編程語言之一,與Fortran一同引領(lǐng)著編程語言設(shè)計的兩大方向,一直被一些優(yōu)秀的計算機專家所喜愛,在編程語言世界里舉足輕重。該文探究了Lisp的歷史與發(fā)展,并對其未來做出了展望。
關(guān)鍵詞:Lisp編程; Lisp方言;計算機編程;小眾語言
中圖分類號:TP312 文獻標(biāo)識碼:A 文章編號:1009-3044(2012)36-8669-03
計算機,由硬件系統(tǒng)和軟件系統(tǒng)兩部分構(gòu)成。硬件系統(tǒng),是完成計算的一系列物理設(shè)備;軟件系統(tǒng),則是計算機程序或使機器硬件工作的指令集。編程語言便是程序員控制這個指令集的工具。
在計算機剛被發(fā)明的時候,程序員通過直接編寫0和1組成的機器指令對計算機進行控制,這是真正的計算機能直接識別的編程語言。然而對于人類來說,直接使用這兩個數(shù)字來進行編程,真是無比痛苦,尤其開發(fā)大型程序,面對成千上萬的0和1,程序員往往會精神崩潰。由此匯編語言應(yīng)運而生。但是匯編語言也只是將一些機器指令換成了人類能看懂的名字,對編程來說并無實質(zhì)性的進展。如計算機的加法命令,機器指令為11001101,匯編語言則只是將其改成了add。
使用匯編語言編程,與使用機器指令一樣,程序員費了九牛二虎之力,卻只能讓大多數(shù)計算機做一些很簡單的事。最終,為了能輕松的編程,也為了能高效的編程,高級編程語言終于千呼萬喚始出來。
表處理語言List Processor,也就是Lisp語言,便是作為最早的高級編程語言之一出現(xiàn)于世。
1 Lisp的發(fā)明
1959年,當(dāng)時人工智能這個學(xué)科剛被提出不久,作為人工智能專家的約翰·麥卡錫(John McCarthy),為了能輕松描述人工智能的各種算法,發(fā)表了具有重大歷史意義的一篇論文:“Recursive Functions of System Expressions and their Computation by Machine,Part 1”。在這篇論文里,麥卡錫介紹了一種運行于當(dāng)時IBM704計算機上的列表處理語言,全稱為List Processing,這便是最初的Lisp語言設(shè)想。
其實麥卡錫并沒有打算把Lisp設(shè)計成一種編程語言,他“設(shè)計這種書寫法完全是為了滿足論文寫作的需要”。然而,麥卡錫一個叫史蒂夫·拉塞爾(第一個電腦游戲的作者)的學(xué)生,看到了論文中有關(guān)定義,意識到可以將Lisp做成一種實際的編程語言,于是Lisp語言最終誕生于世。
Lisp是世界上第二個出現(xiàn)的高級編程語言,第一個是著名的Fortran。作為高級編程語言的兩大始祖,這兩門語言也代表了語言設(shè)計的兩個不同方向。Fortran一開始就是作為編程語言而被設(shè)計,以計算機硬件構(gòu)架為基礎(chǔ);而Lisp則是從純理論中誕生,以數(shù)學(xué)為其設(shè)計基礎(chǔ)。自從這兩門語言出現(xiàn)后,高級編程語言的設(shè)計就不斷在Fortran和Lisp所代表的兩個方向中進行折中。
2 Lisp的九大思想
Lisp語言被設(shè)計時,包含了時任編程領(lǐng)域的九種新思想,其中一些思想已成為現(xiàn)今編程語言的基礎(chǔ),另一些則成為設(shè)計語言的目標(biāo)。
這九種思想大致如下:
2.1 條件結(jié)構(gòu)
條件結(jié)構(gòu)是時下各種高級語言的基礎(chǔ)結(jié)構(gòu)之一,而Fortran最開始沒有條件構(gòu)。
2.2 函數(shù)作為一種數(shù)據(jù)類型而存在
函數(shù)與整數(shù)、字符串一樣,在Lisp中作為數(shù)據(jù)類型,可儲存在變量中,也可作為參數(shù)傳遞,擁有一切數(shù)據(jù)類型該有的功能。
2.3 遞歸
Lisp本身很多函數(shù)以遞歸形式出現(xiàn),是第一個支持遞歸的高級編程語言。
2.4 動態(tài)類型變量
在Lisp中,所有的變量都為指針,都為實際儲存的數(shù)據(jù)的地址。指針有類型之分,而變量本身沒有。
2.5 垃圾回收
垃圾回收,是當(dāng)一個變量再也用不到時,程序會自動對這個變量進行回收,釋放它所占的儲存空間。
2.6 程序由表達式構(gòu)成
用Lisp所寫的程序是由一些表達式樹所構(gòu)成的集合,每個表達式都有返回值。Fortran和以后眾多的編程語言的程序則由表達式和語句構(gòu)成。
2.7 符號類型
在Lisp中,符號是一種指針,指向字符串。
2.8 整個代碼用符號和常量組成的樹形表示法
2.9 整個語言無論何時都是可用的
Lisp不區(qū)分像其他高級語言中存在的讀取期、編譯期和運行期,整個代碼可以在任何時候運行。
在高級編程語言發(fā)展的早期,語言的各種設(shè)計原則主要由計算機硬件條件決定,因此這九種思想未完全被大眾所接受。
隨著時代的發(fā)展,計算機硬件性能越來越強大,各種語言的設(shè)計思想,開始向這九大思想靠近。至今,這九種思想仍是設(shè)計高級編程語言所努力達到與接近的目標(biāo)。我們可以看到,在一些語言的上手文檔里,比如Java或者C#,有不少諸如垃圾回收、函數(shù)作為參數(shù)傳遞等被大肆稱贊的段落。更有學(xué)者稱,現(xiàn)今著名的編程語言Python,就是在模仿Lisp。
迄今為止,Lisp已經(jīng)存在近六十年了,幾乎與計算機這門學(xué)科有著同樣悠久的歷史。Lisp的歷史與發(fā)展,也可謂是計算機學(xué)科的一個縮影。
3 Lisp的歷史與發(fā)展
自20世紀(jì)50年代Lisp被發(fā)明后,Lisp在各大計算機主流分支皆得到了發(fā)展。
在這里,不得不介紹Lisp的一個特有功能——宏,這是一種能生成代碼的代碼,對Lisp的發(fā)展起著重大影響?!昂辍边@一功能的存在,使得Lisp程序員可以根據(jù)程序設(shè)計的需要,或按自已的習(xí)慣,對Lisp進行擴展。當(dāng)擴展的規(guī)模達到一定程度,便發(fā)展出了一種與原版Lisp不太相同的新語言。另外,不同的程序員和組織,其擴展的語言也大有不同。這些被擴展的Lisp語言,便被稱為Lisp方言。
1975年,美國麻省理工學(xué)院(MIT)為了訓(xùn)練人的機械化思維,開發(fā)出了Lisp的著名方言之一:Scheme。著名的MIT計算機學(xué)科教材《計算機程序的構(gòu)造和解釋》(Structure and Interpretation of Computer Programs)就是通篇用Scheme進行算法程序描述。
到了20世紀(jì)80年代,Lisp得到了空前發(fā)展,是其黃金年代。
首先,這是一個人工智能(AI)繁榮昌盛的年代。Lisp本身就是由“人工智能之父”約翰·麥卡錫提出,其適于簡潔表達算法的性質(zhì),再加上本身超前的九種思想,使得Lisp被當(dāng)時的AI程序員們視為AI編程至寶。
同時,Lisp是從純理論中誕生,所代表的是符號處理,當(dāng)時常規(guī)的計算機適用于數(shù)值處理,并不能十分恰當(dāng)?shù)貪M足Lisp的編程需要。因此,20世紀(jì)80年代出現(xiàn)了專門用來運行Lisp的計算機——Lisp機,此后更是出現(xiàn)了許多生產(chǎn)Lisp機的商家,如symbolics 公司,德州儀器公司,Xerox公司,Integrated Inferenee Maehines公司等。20世紀(jì)80年代日本開始研制第五代計算機時,更是宣布以符號處理語言作為計算機核心語言。
在計算機制圖領(lǐng)域,美國Autodesk公司推出的計算機輔助設(shè)計軟件AutoCAD,是國際上廣為流行的繪圖工具,廣泛應(yīng)用于工程制圖、工業(yè)制圖、服裝加工、電子工業(yè)、土木建筑等行業(yè)。從1985年起,由于使用Lisp可大量節(jié)省工程師進行開發(fā)的時間,Autodesk公司決定將Lisp作為AutoCAD的擴展語言,并隨后開發(fā)了另一個著名的Lisp方言:AutoLisp。在該年的制圖軟件AutoCADV2.17- V2.18中,AutoLisp雛形初現(xiàn)。在1987年的版本AutoCADR3.0中,AutoLisp正式出現(xiàn)。從此AutoLisp的時代被開啟。
此外, Lisp也被用于著名的文本編輯器Emacs,并發(fā)展出了方言Elisp。
進入20世紀(jì)90年代,Lisp在經(jīng)歷了80年代的發(fā)展后,形成了眾多的方言版本。如此多的方言給Lisp程序員帶來了一定的麻煩,用不同方言寫出的程序無法兼容,導(dǎo)致很多程序無法移植與共享。早在1981年,考慮到Lisp能任意產(chǎn)生方言這一無法控制的特性,一個由Lisp黑客組織的草根組織成立,希望集眾Lisp方言之長,定義出一個新的標(biāo)準(zhǔn)化Lisp方言,以便各Lisp程序互相兼容,這就是現(xiàn)在最流行的Lisp方言Common Lisp的最初版。最終,在1994年,Common Lisp標(biāo)準(zhǔn)由美國國家標(biāo)準(zhǔn)協(xié)會(ANSI)發(fā)布的ANSI X3.226-1994所定義。Common Lisp的應(yīng)用很多,最著名的要數(shù)著名黑客保羅·格雷厄姆用Common Lisp創(chuàng)建的第一個互聯(lián)網(wǎng)軟件Viaweb,即后來雅虎的Yahoo Store,這個意義非凡的軟件最終開啟了互聯(lián)網(wǎng)軟件時代。
Lisp發(fā)展至今日,已形成了一個語言家族。
4 Lisp未來展望
時至今日,古老的高級編程語言Lisp仍在不斷自我更新。然而,如今Lisp的兩大主要流行方言,Scheme和Common Lisp,似乎卻處于編程語言的邊緣地帶,作為一門小眾語言存在。
毫無疑問,Lisp有著一批為數(shù)不多的狂熱崇拜者,這其中不乏許多優(yōu)秀黑客。黑客在這里的定義很廣泛,包括一切優(yōu)秀計算機專家。但是更多接觸過Lisp的人士卻認為:這只是一門沒什么實際用處的語言,只適合做一些學(xué)術(shù)研究。
從作者本人的觀點來看,Lisp并不僅僅只適合做學(xué)術(shù)研究,其應(yīng)用很多,但如文中所述,Lisp方言眾多,由于各方言互不兼容,導(dǎo)致很多程序運行非常困難,對Lisp的應(yīng)用造成了一定的阻礙。但這并不影響Lisp作為一門優(yōu)秀的語言繼續(xù)發(fā)展下去。正如黑客保羅·格雷厄姆所說的,Lisp的本質(zhì)是數(shù)學(xué),數(shù)學(xué)是不會過時的,更談不上淘汰。Lisp如今雖然只是一門小眾語言,但支持Lisp的人士大多是優(yōu)秀的計算機專家,這使得Lisp擁有足夠的資本生存下去。作者從一些網(wǎng)上資料中了解到,對Lisp為什么沒有流行起來,這些專家也做過探討,原因主要有以下兩點:1.大部分程序員習(xí)慣用類似C語言的語法和思維方式去編程,而Lisp的語法習(xí)慣和思維方式與程序員的慣性思維不同,導(dǎo)致Lisp程序乏人問津;2.Lisp一開始就不是以計算機硬件構(gòu)架為基礎(chǔ)而設(shè)計,由于其被提出的年代過早,計算機硬件跟不上其超前的思想,因此未能被大眾所接受,當(dāng)計算機硬件的性能發(fā)展到足夠強大時,又有眾多新語言出現(xiàn),導(dǎo)致Lisp失去流行時機。
目前來看,Lisp在未來幾年依舊會以語言家族的形式存在發(fā)展下去,并且在一段時間內(nèi),依然是作為一門小眾語言而生存。
但作為一門僅存在于少數(shù)優(yōu)秀計算機專家手中的小眾語言,反而給古老的Lisp增添了幾分傳奇色彩。正像一些優(yōu)秀黑客的想法那樣:“Lisp現(xiàn)在就應(yīng)該是一門小眾語言,讓這門語言掌握在少數(shù)精英分子手中并沒有什么不好,就讓它作為一件秘密武器,成為一門傳奇的小眾語言吧!”
參考文獻:
[1] Seibel P.Practical Common Lisp[M].北京:人民郵電出版社,2011.
[2] Graham P.Hackers and Painters[M].北京:人民郵電出版社,2011.
[3] Paul Graham.On Lisp[Z].2007.
[4] Abelson H,Sussman G J,Julie S.Structure and Interpretation of Computer Programs[M].北京:機械工業(yè)出版社,中信出版社,2010.