麥卡錫用數學實現了Lisp
1958年,約翰•麥卡錫第一個提出了Lisp語言。我認為,當前最流行的程式語言不過只是實現了他在1958年的想法而已。
這怎麼可能呢?計算機技術的發展不是日新月異嗎?1958年的計算機的運算能力還不如今天的電子錶,而體積卻大得像冰箱。 那時的技術怎麼可能超過今天的水平呢?
讓我告訴你原因。這是因為設計者本來沒打算把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那樣強大。
相關文章
- Lisp之父約翰•麥卡錫——不走尋常路的常識邏輯學家Lisp
- 用java寫lisp 直譯器 (10 實現物件和類)JavaLisp物件
- 簡評《實用Common Lisp程式設計》Lisp程式設計
- 《實用Common Lisp程式設計》書評Lisp程式設計
- 實用Common Lisp程式設計——函式Lisp程式設計函式
- lisp 變數的作用域Lisp變數
- “Lisp太難學了”是謊言,Racket語言是中學生都可以接受的Lisp/Python - DustyCloud BrainstormsLispRacketPythonCloudAIORM
- 哈夫曼編碼 —— Lisp 與 Python 實現LispPython
- 《實用Common Lisp程式設計》讀書小記Lisp程式設計
- 用除法實現查詢選修了所有課程的學生
- Bloom實現及其數學分析OOM
- 用SQL實現Farey數列SQL
- 數學簡史:現代數學的五大應用
- 函數語言程式設計學習-SICP-LISP-流STREAM的實現-流程式設計思路和惰性/延時求值2函數程式設計Lisp
- 用ImageMagick實現數字盲水印
- 用陣列實現大數加法陣列
- 連線:人工智慧之父約翰.麥卡錫人工智慧
- 【轉】Lisp 已死,Lisp 萬歲!Lisp
- 用宏實現PPT倒數計時
- 用java寫一個lisp 直譯器JavaLisp
- 用連結串列的方式實現大數相減-Java實現Java
- Redis應用一例(存證數量用計數器實現)Redis
- 用js實現將float型的科學計數法數字還原為正常寫法JS
- Composition實現科學文字計數器
- 轉:用Perl實現單詞計數器
- 《實用Common Lisp程式設計》作者Peter Seibel答讀者問Lisp程式設計
- Common lisp HyperSpec lisp 語法幫助Lisp
- SICP第四章閱讀心得 - Lisp直譯器的實現Lisp
- Lisp初學之暗礁(一):APPLY 與 MAPCARLispAPPPCA
- lisp 的邏輯計算採用短路策略Lisp
- .NET的數學庫NMath實用教程——從數值建立向量
- 用一個巨集實現求兩個數中的最大數
- 《實用Common Lisp程式設計》書評、讀書筆記有獎徵集Lisp程式設計筆記
- 用C語言實現八數碼問題C語言
- 關於lispLisp
- 99-lispLisp
- lisp入門Lisp
- lisp 閉包Lisp