1. 程式人生 > >一位Erlang程式設計師的自白

一位Erlang程式設計師的自白

Erlang不能錯過的盛宴

(快步進入Erlang的世界)

作為程式設計師,我們曾經聞聽很多“業界動態”,“技術革新”,曾經接觸很多“高手箴言”,“權威推薦”。這些正確與否,都已成過去!

現在,讓我們迎接Erlang盛宴!

一、經歷

200711月在koders.com搜尋程式碼時,發現*.erl格式的原始檔,感嘆開發語言的花樣百出,此時,我覺得erlang是一個醜陋的小傢伙,看名字就沒有對它提起多少興趣。

2008年初的時候,公司的專案開發中,我有緣認識了ejabberd,一個採用Erlang開發的開源jabber伺服器。我開始為其誘人的特性所傾倒。是時候認真看看Erlang到底什麼樣了!

20084月,通過各種資料的蒐集,瞭解,我決定系統的學習Erlang

今天,通過4個月的認真學習,我已經熟悉了Erlang,已經在使用Erlang開發專案。作為C++程式設計師,我不敢妄自使用“熟悉”,“精通”之類的字眼,但是對於Erlang我可以很負責任的說:Erlang很巧,很強大!

二、困惑

面對一個新的事務,我們本性都會充滿好奇,可是作為程式設計師,很多時候對於新的語言我們都充滿了抵觸:這個新東西值得學習麼?它會不會讓我拋棄舊愛?它文件豐富麼?是不是很難理解?它的前景如何?······相信大家跟我有一樣的苦惱。

但是,請聽我說!我們是程式設計師,我們走在技術革新的最前沿。使用者的產品,體驗是通過我們來產生!我們不能畏縮不前,我們的固步自封,就是我們的公司,乃至整個行業的停滯不前!口號可能有些響亮,但是認真思考,我相信朋友們一定有所感悟。

三、Erlang是什麼

Erlang是什麼是我們最先要面對的問題,只有清楚了它是什麼,我們才能做出我們的決定。可見這個問題的重要性,它決定了很多讀者是否會繼續看下去!非常緊張。

Erlang最初是愛立信為開發電信相關產品而產生。

Erlang是一種面向併發(Concurrency Oriented),面向訊息(Message Oriented)的函式式(Functional)程式語言。

面向併發說明Erlang支援大規模的併發應用,我們可以在應用中處理成千上萬的併發,而不相互影響。面向訊息,其實是為併發服務!我們應該都熟悉多執行緒,熟悉加鎖解鎖操作,熟悉可能出現的資源競爭與死鎖。在

Erlang的世界裡,我們可以將輕輕的抹去這些令人苦惱的詞彙。Erlang的世界,每個處理都是獨立的個體,他們之間的互動僅僅靠訊息!因此不會有死鎖,不會有那種痛苦的程式設計經歷。

Erlang中一個非常重要的名詞:Process,也就是我們前面提到的“個體”。它不是我們作業系統中的程序,也不是執行緒。它是Erlang提供給我們的超級輕量的程序。為了適應大規模併發的特性,Process需要能夠快速建立,快速銷燬。Process之間通訊的唯一方法就是訊息,我們只要知道一個Process的名字即pid,就可以向其傳送訊息。Process也可以在任何時候,接收訊息。我們這樣做只有一個目的:讓我們的系統更加簡單,用一種樸素的做法,實現一個高效的語言。

Erlang是種函數語言程式設計語言,對此我沒有很深刻的理解,最明顯的特徵就是,Erlang中到處都是函式,函式構成了我們的產品的主體,把這些函式放到一個個的Process中去,讓他們執行起來,那麼就組成了我們朝氣蓬勃的產品。

Erlang支援對資料的位操作,擁有豐富的資料持久化機制。

同時需要說明的是Erlang內建垃圾回收機制(GC)。

四、Erlang的語言特性

1.簡單小巧

Erlang中只有8種基本的資料型別:

integerfloatatomreferencefunportpidbitstring

同時提供2種複合結構:tuplelist,這就是Erlang的所有資料型別。

2.模式匹配

Erlang的函式中,某些語法中,我們可以使用Pattern匹配,這是一個非常好的特性,我們可以讓程式碼自己去決定如何執行

比如,我們定義一個函式,其告訴我們某種水果的價格:

price(apple) -> 2.0;

price(banana) -> 1.2.

我們隨後呼叫 price(Fruit),會根據Fruit變數的內容返回具體的價格。這樣做的好處就是節省了我們的程式碼量,我們不用if...else…或者switch…case的來伺候了。也便於程式碼的擴充套件:加一個新的水果品種,我們只需要加一行就可以了。

學習Erlang一個非常重要的內容就是模式匹配,但是請不要混淆,這個匹配和正則表示式沒有任何干系。

3.變數單次賦值

這個是一個匪夷所思的特性,變數竟然只能單次賦值!是的Erlang中變數一旦繫結某個數值以後,就不能再次繫結,這樣做的好處是便於調試出錯(更深層次的原因是Erlang為併發設計,如果變數可以修改,那麼就涉及到資源的加鎖解鎖等問題),當發生錯誤時,某個變數是什麼就永遠是什麼,不用順藤摸瓜的查詢誰修改過它,省了好多事情。唯一的麻煩就是需要一個信的變數時,你必須再為它想一個名字。

4.豐富的libs

Erlang中提供豐富的libs

stdlib中包含大量的資料結構如listsarraydictgb_setsgb_treesetsdets

mnesia提供一個分散式的資料庫系統

inets提供ftp clienthttp client/servertftp client/server

crypto 提供加密解密相關函式,基於openssl相關實現

ssl 實現加密socket通訊,基於openssl實現

ssh 實現ssh協議

xmerl 實現XML相關解析

snmp 實現SNMP協議(Simple Network Management Protocol

observer 用來分析與追蹤分散式應用

odbc 使Erlang可以連線基於SQL的資料庫

orber 實現CORBA物件請求代理服務

os_mon 提供對作業系統的監控功能

dialyzer提供一個靜態的程式碼或程式分析工具

edoc 依據原始檔生成文件

gs 可以為我們提供某些GUI的功能(基於Tcl/Tk

還有很多朋友提供了一些開源的lib,比如eunit,用來進行單元測試。

5.靈活多樣的錯誤處理

Erlang最初為電信產品的開發,這樣的目的,決定了其對錯誤處理的嚴格要求。Erlang中提供一般語言所提供的exceptioncatchtry…catch等語法,同時Erlang支援LinkMonitor兩種機制,我們可以將Process連線起來,讓他們組成一個整體,某個Process出錯,或推出時,其他Process都具有得知其推出的能力。而Monitor顧名思義,可以用來監控某個Process,判斷其是否退出或出錯。所有的這些Erlang都提供內在支援,我們快速的開發堅固的產品,不在是奢望。

6.程式碼熱替換

你的產品想不間斷的更新麼?Erlang可以滿足你這個需求,Erlang會在執行時自動將舊的模組進行替換。一切都靜悄悄。

7.天生的分散式

Erlang天生適合分散式應用開發,其很多的BIF(內建函式,相API)都具有分散式版本,我們可以通過BIF在遠端機器上建立Process,可以向遠端機器上的某個Process傳送訊息。在分散式應用的開發中,我們可以像CC++,JAVA等語言一樣,通過Socket進行通訊,也可以使用Erlang內嵌的基於Cookie的分散式架構,進行開發。當然也可以兩者混合。分散式開發更加方便,快速。ErlangProcess的操作,Error的處理等都對支援分散式操作。

8.超強的併發性

由於採用其自身Process,而沒有采用作業系統的程序和執行緒,我們可以建立大規模的併發處理,同時還簡化了我們的程式設計複雜度。我們可以通過幾十行程式碼實現一個併發的TCP伺服器,這在其他語言中都想都不敢想!

9.多核支援

Erlang讓您的應用支援多個處理器,您不需要為不同的硬體系統做不同的開發。採用Erlang將最大限度的發揮你的機器效能。

10.跨平臺

如同JAVA一樣,Erlang支援跨平臺(其目前支援linuxmacwindows19種平臺),不用為程式碼的移植而頭疼。

我們僅僅需要了解平臺的一些特性,對執行時進行優化。

11.開源

開源是我非常喜歡的一個詞彙,開源意味這更加強壯,更加公開,更加的追求平等。開源會讓Erlang更好。

五、Erlang與外界的互動

Erlang可以與其他的語言進行互動,如CC++,Java。當然也有熱心的朋友提供了與其他語言的互動,如果需要你也可以根據Erlang的資料格式,提供一個庫,讓Erang與您心愛的語言互動。

Erlang支援分散式開發,您可以建立一個C Node,其如同一個Erlang節點,前提是你遵照Erlang的規範。

當然最常用的互動還是再同一個Node上,比如我們要呼叫某個lib,呼叫一些系統提供的功能,這時候主要有兩種方式:Port和嵌入式執行。

PortErlang最基本的與外界互動的方式,進行互動的雙方通過編碼,解碼,將資訊以位元組流的方式進行傳遞。(具體這個通道的實現方式,根據作業系統的不同而不同,比如unix環境下,採用PIPE實現,理論上任何支援對應Port通道實現的語言都可以與Erlang進行互動)。Erlang為了方便CJAVA程式設計師,提供了Erl_InterfaceJinterface

採用Port,您的程式碼在Erlang的平臺之外執行,其崩潰不會影響Erlang

嵌入式執行,通過Erlang平臺載入,因此這是非常危險的,如果您的程式崩潰,沒有任何理由,Erlang也會崩潰。

六、Erlang應用場景

分散式產品,網路伺服器,客戶端,等各種應用環境。

Erlang也可以作為一種快速開發語言,進行原型開發。

七、Erlang的學習過程

linux:獲取原始碼,根據說明編譯;windows:直接安裝

2.認真閱讀《programming erlang》(中文版圖書已經問世),並不斷動手練習書中的例程。

3.遇到問題時,不要退卻,堅持下去找到解決辦法

4.對語言熟悉時,瀏覽一些好的開源專案

5.有信心時,開始動手做一個小專案

6.不間斷的與大家交流,共同提高

可能遇到的困難:

a)對於語法的不適應?

堅持看下去,程式碼繼續寫下去,我相信1個月,你會喜歡上Erlang的語法

b)有些資料型別不清楚?

認真看資料,或者詢問朋友,比如我

c)中文資料的缺乏?

Erlang中文的資料會越來越多,此外,Erlang的相關的英文資料也比較容易理解,還是那句話,別怕麻煩

八、Erlang開源專案

排名不分先後

  • 基於文件等非結構化資料的資料庫,提供HTTP介面
  • disco Map-Reduce框架,Erlang + Python
  • 效能出眾,使用廣泛的Jabber開源伺服器
  • 輕便,高效的HTTP應用框架
  • 中間伺服器,實現AMQP協議
  • yaws 高效的web server
  • 客戶端
  • 分散式的key-value儲存

九、遇到問題

Google中搜索答案

十、推薦閱讀

十一、推薦網站