Lisp 對於編程語言的發展有哪些貢獻?

Lisp語言發明者、「人工智慧之父」 John McCarthy與世長辭(2011.10.25)。有人說Lisp開創了其他很多語言的編程思想,諸如python,ruby等


來歪一下樓,指正下二樓的答案。lisp在編程語言史上居功至偉,但是要說lisp代表最高水平,現代編程語言只不過在抄lisp,謬矣。

真當PLT(Programming Language Theory)學者們吃了幾十年乾飯?先拿lisp里最簡潔的scheme說,這貨當初發表出來的title是interpreter for extended lambda calculus,可以說是一個加了語法糖的lambda演算解釋器(基於SECD抽象機器)。而lambda演算還有多種帶類型變種,多種不同的抽象機器實現,惰性求值,graph reduction等更新的技術在之後的函數式語言中得到充分研究和應用。

我提到的技術當然可以用lisp實現,但是用lisp實現與語言內建的根本區別還有一個,就是類型系統。lisp是動態類型語言,而為什麼之後搞ML/Haskell這幫人硬是折騰麻煩的Hindley-Milner類型推導?一個高級的類型系統可以:

1. 做到parametric polymorphism/ad hoc polymorphism,實現最大程度的代碼復用。可以類比c++的template或java的generics。

2. 實現上一條時,編譯器的安全檢查能夠排除大量人工錯誤,你甚至可以用機器證明的方法證明程序滿足一定性質,在開發要求高可靠性軟體時尤其有用。(參見Coq與更新更冷門的Idris)

3. 更強的優化。動態語言的優化已經可以很逆天(多謝瀏覽器大戰),但跟靜態比還是弱。容易做機器證明就容易找到和應用更逆天的優化假設,比如我記得有一項stream fusion技術已經可以將部分haskell代碼的中間結構直接給優化掉(已在ghc中應用)

說白了,lisp有易於元編程的s-exp語法以及好用的宏,使其表達能力無出其右,模擬任何編程範式都能做到。可是,人們還想程序更快,還想程序更安全,還想程序員合作更好,編程語言幾十年發展史為這些做出的努力不要看不見啊喂。

======UPDATE: 2014/11/05======

暑假寫的答案,回頭看感覺跑題了,單去炫耀一點PL知識了,抱歉。回到題主問題:

Lisp貢獻有哪些?

  • 最早探索一些語言概念,譬如高階函數與宏;
  • 最先踩了一些坑,比如Scheme之前沒有lexical scoping,之後lexical scoping成為編程語言標配;hygienic macro expansion也是之後提出來的;
  • 早期Lisp實現也是內存管理技術的先驅,最早實驗了garbage collection;

Lisp是不是最厲害?

  • 這不是技術問題,是價值觀問題。價值觀就是,你選定幾種比較的語言,把你覺得厲害的特性抽出來打分。Lisp的宏是個挺高的加分項就是了。
  • 忽略軟體工程的需求(寫容易驗證容易測試容易集體合作的軟體),那Lisp的確就是最厲害的了,因為在抽象鏈頂端。搜The Lisp Curse有真相。(Lisp魔咒)


這麼說吧,現代編程語言中最基本的也是標配的 if-then-else 判斷結構最早就是 McCarthy 為了寫 Lisp 而創造出來的。樹形結構、垃圾回收機制、動態類型也是最早在 Lisp 中體現。如果按照「假如丘處機沒有路過牛家村」的思路,我們還可以說 Alan Kay 受到 Lisp 的影響發明了 Smalltalk 語言——而 Smalltalk 基本上被認為是面向對象編程的鼻祖。

上面的這些都是現代編程語言要考慮的問題。我不相信有任何一個語言作者能做到完全閉門造車而不受前人影響。

說到函數式編程,Lisp 則算是最早的實踐者。這個直接影響了所有具有函數式編程特性的編程語言如 Ruby、Python、JavaScript、Haskell、Scala、Lua、Cloujure 等等。當然,這個背後要歸功於 Alan Church 和 Stephen Cole Kleene 提出的 lambda 運算元。

對於 Lisp 本身的魅力,則可以用 @Neo Lee 在 Twitter 上的一推來說明:「1960 年 John McCarthy 在一篇論文中創造了 Lisp 語言,整個語言構建在7個函數和2個特型之上(atom car cdr cond cons eq quote lambda label),這種簡潔純粹的美感能夠媲美人類歷史上創造的任何藝術品。」(https://twitter.com/#!/soulhacker/statuses/41821587527172096)

推薦閱讀:

  1. Paul Graham 的 The Roots of Lisp:http://www.paulgraham.com/rootsoflisp.html
  2. John McCarthy 的 Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I:http://www-formal.stanford.edu/jmc/recursive/recursive.html


Lisp語言是計算機科學中的麥克斯韋方程,在《計算機程序的構造和解釋》一書的前言中,艾倫佩利說Lisp是活在計算機中的精靈,並將永世長存。


Lisp的最大作用在於揭示和實踐了計算的本質就是evaluation,無論在什麼層次上(機器、語言、系統、應用)都是這樣

只要你有一個圖靈完備的eval,又有動態構造eval的參數的手段,你就有了編程世界的原初之核。剩下的都是從此衍生而出而已


What Made Lisp Different

PG 在他的這篇文章中做了一個介紹。


垃圾回收?


有一句話來說:現代編程語言的所有發展,實質都是把更多的Lisp功能抄襲過來。

還有人說:現代編程語言的任何新功能,其實都是在炒Lisp十年前的現飯。

當然,上面的話通常是 Lisp 死忠說的。咱不是。

邏輯上講,要說 Lisp 是否真的對現代編程語言有貢獻,這個前提在於:現代那些語言的作者們,發明那些新功能的時候,是真的因為自己想到的,還是從 Lisp 裡面借鑒的?

如果不能證明這些語言的作者確實是從 Lisp 借鑒,而非自己獨立想出來的,那麼似乎也不能說這個貢獻是來自 Lisp。畢竟 Lisp 是一個非常小眾的語言。

當然,題設的理解是不準確的,Lisp 開創的主要不是編程思想,而是編程語言級的功能。要說思想或許也有,是函數式編程,當然函數式編程這個重要的思想,幾乎可以確認一定是 Lisp 開始引入的。


list comprehension, lazy loading, stream processing, and so on. 當然很多不是語言的特性而是函數式編程衍生出來的運算方法


函數式語言,perl語言,schema,smalltalk、等語言都從lisp中汲取了營養和靈感,而且現在的語言設計據說都沒有超越lisp語言,lisp語言表達能力最強,恐怕是計算機編程語言最基本和最根本的形式。


自動垃圾收集最早就是在lisp語言里實現的


推薦閱讀:

在lambda表達式中如何使用遞歸?
Python 中的 lambda 和「真正的」lambda 有什麼區別?
Lisp的精髓是什麼?

TAG:編程語言 | 編程 | 計算機科學 | Lisp |