麥卡錫用數學實現了Lisp

出版圈郭志敏發表於2011-11-07

1958年,約翰•麥卡錫第一個提出了Lisp語言。我認為,當前最流行的程式語言不過只是實現了他在1958年的想法而已。

這怎麼可能呢?計算機技術的發展不是日新月異嗎?1958年的計算機的運算能力還不如今天的電子錶,而體積卻大得像冰箱。 那時的技術怎麼可能超過今天的水平呢?

enter image description here

讓我告訴你原因。這是因為設計者本來沒打算把Lisp設計成程式語言,至少不是我們現在意義上的程式語言。我們今天所說的程式語言指的是用來告訴計算機怎麼做的一種工具。麥卡錫最後確實有意開發這種意義上的程式語言,但是實際上他做出來的Lisp卻是完全不同的一種東西,語言的基礎是他的一種理論演算,他想用更簡潔的方式定義圖靈機。正如他後來所說:

Lisp比圖靈機表達起來更簡潔。證明這一點的一種方法就是寫一個Lisp通用函式,證明它比圖靈機的一般性描述更短、更易懂。這個Lisp函式就是eval……它用來計算Lisp表示式的值……。編寫eval函式需要發明一種表示法,能夠把Lisp函式表示成Lisp資料。設計這種書寫法完全是為了滿足論文寫作的需要。(我)根本沒有想過用它來編寫Lisp程式並在計算機上執行。

1958年年底,麥卡錫的一個學生史蒂夫•拉塞爾 看到了eval函式的定義,意識到如果把它翻譯成機器語言,就可以把Lisp直譯器做出來。

這在當時是非常令人吃驚的事。麥卡錫後來回憶:

拉塞爾對我說:“我想把eval編成程式……”我告訴他,別把理論和實踐混淆,eval只是用來讀的,不是用來做計算的。但是他執意要做,並且還真的做出來了。就是說,他把我論文中的eval編譯成了[IBM] 704計算機的機器碼,修正了bug,然後對外宣佈做出了Lisp語言的一種直譯器,這倒沒有說錯,確實如此。所以,從那個時候開始,Lisp語言就基本上是它現在的樣子了……

這樣一下子,就在幾個星期之內,麥卡錫發現他的理論演算變成了一種實際的程式語言,而且出乎意料地強大。

由此也就得出了20世紀50年代的程式語言到現在還沒有過時的原因。簡單說,因為這種語言本質上不是一種技術,而是數學。數學是不會過時的。你不應該把Lisp語言與50年代的硬體聯絡在一起,而是應該把它與快速排序(Quicksort)演算法進行類比。這種演算法是1960年提出的,至今仍然是最快的通用排序方法。

Fortran語言也是20世紀50年代出現的,並且一直使用至今。它代表了語言設計的一種完全不同的方向。Lisp語言是無意中從純理論發展為程式語言的,而Fortran從一開始就是作為程式語言設計出來的。但是,今天我們把Lisp看成高階語言,而把Fortran看成一種相當低層次的語言。

1956年Fortran剛誕生的時候,叫做Fortran I,與今天的Fortran語言差別極大。Fortran I實際上是組合語言加上數學,在某些方面還不如今天的組合語言強大。比如,它沒有子例程,只有分支跳轉結構(branch)。今天的Fortran語言可以說更接近Lisp而不是Fortran I。

Lisp和Fortran代表了程式語言發展的兩大方向。前者的基礎是數學,後者的基礎是硬體架構。從那時起,這兩大方向一直在互相靠攏。Lisp語言剛設計出來的時候就很強大,接下來的二十年它提高了執行速度。而那些所謂的主流語言把更快的執行速度作為設計的出發點,然後再用四十多年的時間一步步變得更強大。直到今天,最高階的主流語言也只是剛剛接近Lisp的水平。雖然已經很接近了,但還是沒有Lisp那樣強大。

相關文章