帶您走進七週七語言的程式世界

turingbooks發表於2012-05-11

編者按
這是一本2011年Jolt大獎圖書,在本文中,截選了七門各不相同的語言的概況,這七門語言,無論教還是學,對我們而言都是一個巨集偉目標。書中的程式碼足以深刻闡釋每一門語言的精髓。這七門語言都有非常優秀的支援社群,這也是我選擇它們的原因之一。本書為你鋪就的學習途徑......

第一週:Ruby

有糖相伴好下藥。——Mary Poppins

松本行弘(Yukihiro Matsumoto)大約在1993年發明了Ruby,大家多稱他為Matz。從語言的角度看,Ruby出身於所謂的指令碼語言家族,是一種解釋型、物件導向、動態型別的語言。解釋型,意味著Ruby程式碼由直譯器而非編譯器執行。動態型別,意味著型別在執行時而非編譯時繫結。從這兩方面看,Ruby採取的策略是在靈活性和執行時安全之間尋找平衡點,我們稍後還會深入討論這一點。物件導向,意味著Ruby支援封裝(把資料和行為一起打包)、類繼承(用一棵類樹來組織物件型別)、多型(物件可表現為多種形式)等特性。Ruby多年來一直默默蟄伏,只為等待一個恰當的出現時機。終於,隨著Rails框架嶄露頭角,Ruby也在2006年前後一鳴驚人。在企業開發的叢林中跋涉了十年之後,Ruby指引人們重新找回了程式設計樂趣。儘管從執行速度上說,Ruby談不上有多高效,但它卻能讓程式設計師的程式設計效率大幅提高。

關於Ruby、關於松本行弘請參見松本行弘的程式世界


第二週:Io

問題不是“我們要乾點兒什麼”而是“我們有什麼不能幹”。——Ferris Bueller

Io和Ruby一樣,Io懂得變通,行事不拘小節。他血氣方剛、聰明過人,想了解他不難,想猜透他要做什麼可就難了,活脫一個Ferris Bueller 。如果你願意享受喧囂熱鬧的狂歡,跟著Io逛逛絕對沒錯,他什麼都會帶你嘗試一遍。和他在一起,你可能會有最美妙刺激的體驗,但你老爸的車也可能變成一堆廢銅爛鐵。不過,無論發生什麼,你都決不會無聊。正如本頁最上方Ferris所說,沒那麼多清規戒律束手束腳。


第三週:Prolog

Prolog這門語言有時特別聰明,有時又特別令人失望。只有當你知道如何提問時,你才會得到令人驚奇的答案。回想一下《雨人》 這部電影。我還記得片中的主角Raymond,他在前一晚讀過一本電話簿後便可以背出Sally Dibbs的電話號碼,而他當時翻電話簿的時候根本沒有考慮是否需要記住這個號碼。對於Raymond和Prolog,我經常問出這樣兩個分量等同的問題,“他是怎麼知道的?”和“他怎麼不知道?”。只要你能以正確的方式表達你的問題,那麼他將是一個知識源泉。

Prolog與前兩章談到的程式語言有較大的不同。Io和Ruby被稱為命令式語言(imperative language)。命令式語言就像是一本烹飪食譜,你需要精確地告訴計算機如何去完成一項工作。更高階別的命令式語言可能會給你帶來更多槓桿效力,即將多個比較長的步驟合併為一個步驟。不過從根本上說,你其實是在列出原料的購物清單,並描述烤蛋糕的詳細步驟。


第四周:Scala

我們不是綿羊。——剪刀手 Edward

Scala可以說是一個科學怪人,但卻不是一個怪物。想一想《剪刀手愛德華》 這部電影。

隨著對計算機程式的需求越來越複雜,計算機語言也在發展演化。每隔20年左右,老的程式設計範型就會變得不足以應對一些組織和表達思想的新要求。新的範型必定會湧現出來,但這並不是一個簡單的過程。每個新的程式設計範型都會引入一批程式語言,而不僅僅只是一種語言。最初的語言往往具有驚人的生命力,但也很不實用。比如物件導向程式語言Smalltalk或者函數語言程式設計語言Lisp。接下來,其他範型的語言會加入一些新特性,允許開發人員在採用新概念的同時也可以安全地使用原先的老範型。例如Ada語言,它能夠在過程式語言中使用一些物件導向的核心思想,比如封裝。某些時候,一些混合語言恰恰是搭建在新老範型之間的一座實用的橋樑,比如C++。緊接著,你將看到一些可用於商業應用的程式語言,比如Java或C#。最後,你才會看到新範型的一些成熟且完整的實現。

Scala與Java的密切關係

Scala至少可以作為一座橋樑,也許還不僅如此。它與Java緊密整合,為人們提供了一個保護投資的機會,這體現在以下幾個方面。

  • Scala執行在Java虛擬機器上,這使得Scala可以和現存的應用同時執行。
  • Scala可以直接使用Java類庫,使得開發人員可以利用現有的框架和遺留程式碼。
  • Scala和Java一樣都是靜態型別語言,因此兩種語言遵循一樣的程式設計哲學。
  • Scala的語法與Java比較接近,使得開發人員可以快速掌握語言基礎。
  • Scala既支援物件導向範型也支援函數語言程式設計範型,這樣開發人員就可以逐步在程式碼中運用函數語言程式設計的思想。

第五週:Erlang

似Erlang這般充滿神祕感的語言寥寥無幾。這門併發語言既可將難事化易,也可將易事變難。在健壯企業部署方面,它的虛擬機器BEAM是唯一堪與Java虛擬機器匹敵的對手。它呼叫起來十分高效,甚至效率以外的東西它都很少考慮。因此,它的語法也不像Ruby那樣優雅和簡潔。

Erlang其名,乍聽之下很怪。但你若知道,它既是Ericsson Language的縮寫,又恰是一位丹麥數學家的大名,你就不會再抱怨“這什麼破名兒”了。作為電話網路分析的數學奠基人,Agner Karup Erlang 可稱得上是赫赫有名。

1986年,Joe Armstrong在愛立信公司(Ericsson)開發了Erlang語言的首個版本。隨後的五年間,Erlang在他的精心雕琢下日漸完善。20世紀90年代整整十年間,Erlang的發展都不溫不火、時斷時續,但到了2000年之後,它卻開始成為眾人矚目的焦點。兩個廣受歡迎的雲資料庫CouchDB和SimpleDB,都是用Erlang開發出來的,此外,Erlang還是Facebook的聊天系統所採用的語言。正因為Erlang身懷可伸縮併發性和可靠性這兩項拿手絕技,而其他語言在這兩方面都力不從心,所以Erlang開始越來越多地成為人們談論的話題。


第六週:Clojure

做或不做,不要嘗試。 ——Yoda(尤達大師)

Clojure是JVM上的Lisp實現。Lisp複雜強大,是計算機領域裡最早和最新的程式語言之一。許多Lisp方言都曾嘗試擠進主流語言的行列,卻都無功而返。即便是對今天的開發者而言,其語法和程式設計模型也有些難以消化。即便如此,Lisp的特質仍叫人禁不住去重溫,去回味,新的方言層出不窮,一些程式設計領域最好的院校也用Lisp語言來幫助學生們塑造創新、開放的思維方式。

從很多方面來看,Clojure就像是睿智的功夫大師,神隱山脈的先知或是高深莫測的絕地師父。想想Yoda。在《星球大戰系列之五:帝國反擊戰》 中,Yoda是一位小巧、可愛的配角。他總是使用“倒裝”語序說話,但卻意味高深 ,就像Lisp所使用的字首表示法(相信過一會兒你就會明白)。他小巧到難以辨別,就像Lisp的語法不過是一些括號和符號。但是和Yoda一樣,它絕非看上去那麼簡單。Yoda和Lisp年歲都很高,擁有的智慧(例如開頭的引語)經過時間磨礪與烈火考驗。Lisp巨集和高階程式設計單元如同Yoda掌握的內在原力,看似無人能掌控。從許多角度講, Lisp開創了一切。在深入Clojure之前,讓我們先來談談Lisp,然後再來了解Clojure的激動人心之處。


第七週:Haskell

邏輯是草地上幾隻吱吱作聲的小鳥在鳴叫。 ——Spock

對於很多函數語言程式設計的忠實擁躉來說,Haskell 象徵著純潔和自由。它的功能豐富且強大,但擁有這些功能是需要付出一定代價的。你不可能輕易地就掌握這門語言,因為Haskell 會迫使你去了解關於函數語言程式設計的全部內容。想想《星際迷航》的Spock吧,他上面說的那句話 很有代表性,完美地結合了邏輯和真理。他性格中擁有的那種堅定的純潔性,這使他得到了幾代人的愛戴。當Scala、Erlang和Clojure還允許你少量使用指令式程式設計概念的時候,Haskell卻沒有留下任何的迴旋餘地。在使用Haskell做I/O操作或狀態累積(accumulate state)時,你將遇到這門純函式語言所帶來的挑戰。

和以往一樣,如果想了解一門語言為何包含那些妥協方案,就應該從它的歷史開始。在20世紀80年代中前期,純函式程式設計領域湧現出了多門語言。純函數語言程式設計和我們曾在Clojure語言中見到過的惰性處理(lazy processing)等關鍵概念引領著新研究的方向。1987 年的“函數語言程式設計語言與計算機體系結構大會”(Functional Programming Languages and Computer Architecture)成立了一個小組,決定建立一個關於純函式程式語言的開放標準。Haskell就出自於這個小組,它於1990年誕生並於1998年重新修訂。目前的標準是Haskell 98,經過多次修訂,包括一份Haskell 98 標準的修訂版和一個稱為Haskell Prime的新版本定義。

因此,Haskell是一門從開始就按照純函數語言程式設計思想構建的語言,它結合了一些最好的函式式語言思想,並著重於支援惰性處理。

和Scala一樣,Haskell也是一門強型別定義的靜態型別語言。它的型別模型基於推斷理論(inferred)並被公認為是函式語言中最高效的型別系統之一。你會發現該型別系統支援多型語義並有助於人們作出十分整潔清晰的設計。


相關文章