大貓共和國

Meow

Erlang入門心得、學習資源推薦

幾個月前,我在Survey一些並行運算的技術時,注意到了Erlang這個語言。引述一下維基百科對Erlang的介紹

Erlang is a general-purpose concurrent programming language and runtime system. The sequential subset of Erlang is a functional language, with strict evaluation, single assignment, and dynamic typing.
Erlang擁有許多近似Pure Functional Language的特性,對於習慣於物件導向、指令式編程的Programmer來說,應該算是相當奇怪的語言。

這幾個月,我利用業餘的時間進行Erlang的Study,對於Erlang以及函數編程,我自認都還在初學的階段。本文整理了一些我對於Erlang的入門心得,以及我推薦的學習資源。我假設讀者對於Erlang已經有最基本的了解,所以一些細節的東西不會深入提及。若你對Erlang還一無所知,推薦可以看看蔡學鏞先生對Erlang的介紹或是維基百科。

誰適合學習Erlang?

首先,我先簡短的介紹一下Erlang的優缺點。Erlang的強項在於建構並行(Concurrent)、分散(Distributed)、容錯 (Fault-tolerance)的系統。但他也有一些致命的缺點:內建函式庫的貧乏、對Unicode支援度低、缺乏良好的IDE及Debug Tool。

如果你建構的系統需要擁有並行、分散、容錯其中的一種特性,Erlang是值得一看的語言。就算你的項目沒有要以Erlang開發,我相信你在接觸這套語言時,可以得到一些有用的設計觀念。

如果你沒有以上的需求,而想學習一些函數編程(Functional Programming)語言來建構你的應用。那麼F#Scala可能都是不錯的選擇,這兩套語言分別可以輕鬆的與.Net Framework及Java整合,擁有強大的程式庫可以調用。

如果你想要找一套程式語言鑽研,擁有接近Purely Functional Language的特性 (Ex. Signel assignment, No Side-Effect) 。在這類語言中 (Ex. Haskell, Oz, Erlang…),我認為Erlang仍然是相當好的學習選擇。

最後,如果你喜歡寫程式,喜歡鑽研未知的技術,只要能學到有趣的東西就很開心,而不在乎學習的成果是否能拿到工作或應用上。恭喜你,你絕對是適合學習這類奇怪的語言的人。

學習Erlang不可不看的文件

以下是我主觀地認為學習Erlang不可不看的文件。
  • Programming Erlang: Software for a Concurrent World, Joe Armstrong著
    Erlang的書輯甚少,這本書應該可以說是Erlang的聖經。中規中矩的依序講述Erlang的語言特性、Sequential Programming、Concurrent Programming、Distributed Programming的實作方式。另外也提及了Mneisa(Erlang Database)、Socket、OTP Application等等重要的項目,並附帶有完整的應用範例。

    這本書是我在五月左右買的,現在台灣已經買的到蔡學鏞先生翻譯的Erlang程式設計。聽到這個名字應該可以相信其翻譯水準,有興趣的話可以買中譯本來看,至少可以省下幾百塊,原文書好貴 Q.Q
  • Making reliable distributed systems in the presence of software errors, Joe Armstrong的博士論文
    這篇似乎是比較容易被忽略的重要教學資源 (Well, 重要是我的主觀認定) 。大家不用看到「論文」兩個字就感到害怕,這篇論文沒有什麼深奧的數學公式,而是精彩的闡述了Erlang的設計核心理念。

    在Programming Erlang這本書中,我學習到了Erlang的基礎概念及語法。但唸完之後總覺得少了些什麼。試圖寫一些需要Concurrency的小工具時, 我發現我對於如何切分工作到不同進程(Process)相當沒有頭緒,直到我唸了這篇論文才補足了一個環節。

    這篇論文的第一、二章指出來Erlang的設計理念:
    「進程(Process)是封裝錯誤的單元」
    「進程要嘛就正正確確的活著,要嘛就痛痛快快的死掉」
    「一個錯誤從發生到被檢測出的時間越長,錯誤就越難以回復」

    這些觀念在Programming Erlang一書中只是約略地帶過,而在這篇論文中則是不斷的強調,所以我認為這篇論文特別值得一看。若不了解這些Erlang的核心設計理念,在設計Erlang系統時,應該是只能得其形而不得其髓。

    這篇論文可以免費下載,而對岸已有熱心人士將這篇論文翻譯成簡體中文的版本
以上是我學習到現在,覺得最有助益的Document。官方的文件有的地方寫的太仔細了,有空的話也可以多多參考:Getting Started算是精簡的Tutorial,Efficiency Guide有助於迅速的了解一些率考量的細節。而Programming Rule提出了一些很有用的Erlang Design Principle。

其他Erlang資源

目前國內深入接觸Erlang的人似乎還很少。繁體中文的資源首推蔡學鏞【言程序】部落格。其中對於程式語言、函數編程、Erlang都有相當精彩的見解。此外lazy Guy (不是東西的東西 vs 沒有邏輯的邏輯)這個Blog也有一些關於Erlang的文章。有些遺憾的,這兩個Blog是我目前找到僅有的繁體中文Erlang資源。

蔡學鏞先生在這篇文章中,整理了許多Erlang的學習資源(似乎都是英文的)。此外,中國大陸似乎也有不少人在玩Erlang。像是Erlang-ChinaJavaEye上的Erlang討論、以及Erlang | Ocaml China(目前似乎是當站的狀態),或許都值得一看。

Comments