這一系列,是以一個相當有歷史典故的程式語言家族為主角,從它的故事,到語言特性,到實務應用。每一篇盡量控制在各位三分鐘以內可以閱讀完畢的篇幅。
我不是程式語言專家,我只是個喜歡寫程式的人。
之前聽過一個笑話,那笑話是這麼說的。
美蘇冷戰時期,有個蘇聯間諜費盡千辛萬苦地從美國偷來一個 Lisp 程式碼片段,結果因為偷到的是最後一頁,只有成堆的右括號 ))))))))))))))))))))))))))))))))))))))))
在人類開始用機器進行運算時,便一直有個夢想,那就是機器可以與人同等。第一個正式提出人工智慧的,是一名叫 John McCarthy 的電腦科學家[1]。他不只提出人工智慧這個想法,還著手設計了一個語言,希望可以讓機器像人類一樣思考。那時,電腦是大型主機,程式要寫,必須使用組合語言來進行,在 John Backus 設計出 Fortran 的後一年(1958年),John McCarthy 設計出了 LISP 語言[2]。
起初,他希望可以設計一個語言,來進行 Alonzo Church 的 Lambda 演算[3] 處理,一時之間,對語法沒有太多的想法,起先是用 FUN[PARAM] 之類的語法,後來演變成為 (FUN PARAM) 這樣的語法,簡稱 s-exp(s 表示式)。最後,Lisp 的開發人員發現這樣的語法簡潔而有效率,便使用至今。
Lisp 在電腦界很紅,可是它有個缺點,它使用了 dynamic scoping[4] 的機制,這個字暫無中文翻譯,所以我們使用原文。它的意思是說,當你的函數呼叫了一個不存在它內部定義的變數時,這時語言會到函數被呼叫時的那個區塊裡找尋這個變數,這導致了程式常常發生出乎意料的事情。
到了 1975 年,MIT 有兩位教授 — Guy L. Steele 與 Gerald Jay Sussman 提出 Scheme 語言 [5],使用了 lexical scoping [4],並簡化了 Lisp 的設計後,使得這樣子的一門語言,穩定性與嚴謹度得到相當大的提昇。
Gerald Jay Sussman 並為這門語言寫了一部曠世鉅作 — Structure and Interpretation of Computer Programs,簡稱 SICP [6]。本系列文章,偶爾會拿 SICP 的基本範例來說明。
Scheme 其實不算是一門具有特定實作的語言,像 C# 完全由 Microsoft 實作與維護那樣。Scheme 的設計者們透過標準的制定,使得外界各個學術與開源團體可以自行實作,最新的版本已經到了 R7RS。而在漫長的發展過程中,有另一支來自 Northeast University 與 Brown University,以 Matthias Felleisen 與 Mattew Flatt 教授為首的 PLT 團隊開發了自己的 Scheme 實作 — PLT Scheme。顧名思義,那時的 PLT Scheme 主要的語言特性是由 Scheme 規範而來。
於 2010 年,PLT Scheme 改名為 Racket [7],從名字與 Scheme 開始分道揚鑣,也有了些自己的語言特性。原本是兄弟,但現在或許稱朋友倒是比較合適。
lisp, scheme 入門好久都還沒入門到,
之前還裝過 dr scheme,
現在竟也變成 racket 了。
也曾裝了 haskell,
也有裝沒有在用.....
也搞不清楚 haskell 與這些有什麼淵源?
只會覺得都是算 lisp 之類。
你可以參考這兩張圖,這是程式語言的發展源流說明,雖然我不是很確定它是否完全正確,但你可以發現一個很特別的地方:Haskell 是從 ML (Meta Language,不是 Machine Learning) 而來。換個角度,你可以去比較看看 Haskell 的語法與概念,是否與 OCaml 有類似之處。