趣學Erlang教程

rbyt 9年前發布 | 93K 次閱讀 Erlang開發 ErLang

關于本教程

這是趣學Erlang的開篇介紹,閱讀本教程也許是你學習Erlang的一個開始

趣學Erlang教程

首先我有這個想法是因為我閱讀了利波瓦卡(Miran Lipova?a)的 趣學Haskell(LYAH) 教程; 我認為他做的工作充分的展示了語言的美麗,同時讓語言學習過程更加友好。 由于我和他很熟識,我曾問他,我來寫Erlang的版本如何。 他感覺這主意不錯,并且他本人對Erlang也有一些興趣。

所以我開始編寫這個教程。 當然我寫本教程還有其它動機:主要我發現語言入門有點困難(要么使用文檔稀缺的網站或者你買一本書), 并且我認為像趣學Haskell的那種入門指南是對社區有益處的。 更重要的是, 我見過好多人,都是通過非常籠統的言論過度的稱贊或貶低Erlang。之后就有人認為Erlang只不過是一個噱頭。如果我想通過別的方式說服這些人,我認為是不會很快受到這些人的關注。

希望本書成為有命令式語言編程基礎(如 C/C++, Java, Python, Ruby, 等) 和那些知道或不知道函數式編程 (Haskell, Scala, Erlang, Clojure, OCaml...)的人的入門指南。 我也希望寫一本沒有偏見的書,闡述Erlang是什么,它的有點和它的缺點都是什么。

什么是Erlang

首先,Erlang是一門函數式語言。 如果你使用過命令式語言, 像這樣的語句i++對你來說很熟悉; 但是在函數式語言中,這是不被允許的。 事實上,改變一個變量的值是被嚴格禁止的! 這聽起來挺奇怪的,但是想想你之前上過的數學課的內容:

y = 2

x = y + 3

x = 2 + 3

x = 5
</div> </div>

我添加了下面這個例子:

x = 5 + 1

x = x

∴ 5 = 6
</div> </div>

你也許會感到困惑。 函數式語言認為: 如果我定義x是 5, 之后,在邏輯上我不能再次定義它為6! 這樣是不可靠的。 這也是為什么相同的函數相同的參數總返回相同的結果:

x = add_two_to(3) = 5

∴ x = 5
</div> </div>

函數接受相同參數時總返回相同的結果被稱為引用透明。 這將允許我們用5來替換add_two_to(3),因為計算3+2的結果將永遠是5。 這代表著我們可以用很多函數組合再一起去解決一個問題,并且我們可以非常確信我們將得到我們想要的結果。 (That means we can then glue dozens of functions together in order to resolve more complex problems while being sure nothing will break.) 這難道不是非常清晰且符合邏輯的嗎?(Logical and clean isn't it?) 盡管這有一個問題:

x = today() = 2009/10/22

-- wait a day --

x = today() = 2009/10/23

x = x

∴ 2009/10/22 = 2009/10/23
</div> </div>

天哪! 我完美的等式!在一瞬間它們全變成錯誤的了! 為什么我的函數每天都會返回一個不同的結果呢?

很明顯,在某些情況下打破引用透明是必須的。(Obviously, there are some cases where it's useful to break referential transparency.) Erlang是一個非常務實的函數式編程語言:遵循純函數的相關規則(引用透明,避免可變數據, 等等), 但是當面對部分現實世界的問題的時候,它打破這一規則。

趣學Erlang教程

當前,我們將Erlang定義為函數式語言, 但是它同樣具備高可靠和高并發的特性。 為了能在同一個時間內,執行大量的任務, Erlang使用actor模型, 并且在Erlang的虛擬機中,每個actor都是一個Erlang的進程。 簡而言之,如果你是Erlang世界中的一個actor, 你將是一個孤獨的個體,在一間沒有窗戶的小黑屋子中,守著一個郵箱等待消息的到來。 一旦你收到了一個消息, 你將使用以下方式處理: 你需要在接收消息的時候支付郵資,當你收到了生日賀卡你會回復感謝并且忽略那些你不能讀懂的消息。

Erlang的actor模型,可以被認為是一個所有人都坐在自己的屋子中處理不同任務的世界。 所有人之間的通信,只有通過郵件,且僅有這么一個方式。 盡管這聽起來挺無聊的(這將是郵遞服務的一個全新的時代), 這代表著你可以要求別人幫你處理一些特殊的任務,并且沒有人會做錯事情或者做出影響別人工作的錯誤;他們甚至都不知道除你之外的別人的存在(這非常好)。

比喻到此為止, Erlang強制你寫actors(Erlang進程), 除了通過消息傳遞進行通信,這些Erlang進程除了代碼外不共享任何信息或數據。每次通信都是準確的,安全的并且可追蹤的。

當我們定義Erlang時,我們是在一個語言層面上,但是從廣義上講,這并不是Erlang的全部:Erlang不單是一個語言,也是一個整體的開 發環境。 Erlang的代碼被編譯成字節碼,并使用Erlang虛擬機來運行。所以Erlang更像Java或者這種類型的加強版,可以跨平臺運行。標準的發型版 包含開發工具(編譯器,調試器,profiler,測試框架), Open Telecom Platform (OTP) Framework,一個Web服務器,一個Parser生成器, 和支持分布式,嵌套事務的Mneisa數據庫,該數據庫可以讓你輕松的存儲Erlang數據。

虛擬機和庫都支持代碼熱更新,并且提供了簡單且強大的代碼部署和容錯機制。

趣學Erlang教程

我們將使用這些工具獲得更多的可靠性,但是現在,我將告訴你Erlang的基本策略: 讓它崩潰。 并不像一個有很多乘客的飛機墜毀那樣,更像一個有足夠安全措施的走鋼絲表演者一樣。 雖然你應當避免犯錯,但是在絕大部分情況下,你不需要檢查每個類型和錯誤條件。

Erlang的從錯誤中恢復, 使用actor模型來組織代碼,通過使用并發和分布式讓整個系統可動態擴容這些很棒的特性,我們將在以后的章節逐步介紹。

不要盲從(Don't drink too much Kool-Aid)

在這本書中,將有很多這個標題的黃橙色的小條(你很容易辨識它們的)。 由于很多熱門話題的討論,Erlang變得比以前普及了一些,但是這些熱門的話題討論導致人們對Erlang有一些言過其實的認知。 (Erlang is currently gaining lots of popularity due to zealous talks which may lead people to believe it's more than what it really is.) 這些小條,將幫助你不至于飄飄然。 (These reminders will be there to help you keep your feet on the ground if you're one of these overenthusiastic learners.)

第一個例子是關于Erlang的擴展能力的,因為Erlang使用了輕量級的進程才使Erlang具有很強的擴展能力。 Erlang的進程確實非常輕量級:在同一個時刻,我們可以擁有成百上千的Erlang進程,但是這不代表你因為能這樣才去這樣使用它。 舉個例子, 創建一個連子彈都是actor的射擊游戲是很瘋狂的。如果你真的這么做了,那么很有可能把事情搞砸。(The only thing you'll shoot with a game like this is your own foot.) 雖然發送消息代價很小,但是過度的拆分任務,你會讓任務變慢的

當我們學習了足夠多知識,我將深入的說明這方面我們真正需要關心的是什么,目前,我們只需要記得,隨便的使用并行去解決某個問題并不一定能帶來速度的提升。 (I'll cover this with more depth when we're far enough into the learning to actually worry about it, but just keep in mind that randomly throwing parallelism at a problem is not enough to make it go fast.) 不過不要傷心;我們將會有很多機會去使用成百上千的進程!只不過,不是每次都需要。

一個說法是Erlang的擴展能力和電腦的CPU數量成正比的方式,但這通常是不正確的: 趣學Erlang教程 雖然這是可能的,但是絕大部分問題是不能轉化成一組可并行的完全相同的行為。

同時,請謹記: 即便Erlang做某些事情非常好,并且從技術角度上講,做一件事情時可以獲得和使用其它語言相同的結果。 反過來一樣;我們需要謹慎的評估我們面對的問題,并根據問題選擇合適的工具。 Erlang并非銀彈,并且做某些事情非常差,如圖像處理,信號處理和系統的驅動等。 但是非常適合大規模的服務端軟件(例如:消息隊列,map-reduce計算),還有配合其它語言使用,高級協議實現等。 而是否適合都根據你的判斷。你沒有必要把自己使用Erlang的范圍限制在服務端軟件:曾經有人用它做出了一些讓人意想不到的東西。 一個例子是IANO,UNICT團隊創造的一個機器人,該機器人使用Erlang編寫的人工智能系統,并在2009年贏得了銀牌。eurobot competition。 另一個例子是Wings 3D, 一個Erlang編寫的跨平臺的3D建模工具(但不是一個渲染器)。

我們如何開始

所有你必須的,一個文本編輯器和Erlang環境。 你可以從以下地方獲取Erlang官方網站。 我不想太多介紹安裝細節,對于Windows,只需要下載安裝即可。 不過不要忘記將Erlang文件夾添加到系統變量PATH中,這樣我們才能通過命令行使用它。

在Debian系Linux發型版上,你可以用$ apt-get install erlang來安裝。 在Fedora上(如果你安裝了yum),你可以使用# yum install erlang來安裝。 但是,這些倉庫中的Erlang版本都是非常老舊的。 當你使用本教程的一些例子的時候,使用老版本的Erlang會給你帶來一些不同或者性能問題。 因此我推薦你從代碼編譯一個Erlang。 使用google去搜索安裝相關的問題和翻閱README文件,將會比我能給出的答案更好。

在FreeBSD上,這就都看你自己的決定了。如果你用portmaster,portmaster lang/erlang。 如果使用Ports系統, 可以這樣cd /usr/ports/lang/erlang; make install clean。 如果,你只用packages系統,那么執行pkg_add -rv erlang。

如果你用OSX,那么用brew安裝是不錯的選擇$ brew install erlang(Homebrew) 或者使用$ port install erlang(如果你更喜歡MacPorts。)

另一個選擇, Erlang Solutions Ltd. 提供了絕大部分都可以完美工作的主流操作系統安裝包



教程地址: http://mbooks.me/LYEFGG/introduction.html

 本文由用戶 rbyt 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!