本文轉自網絡。
(快步進入Erlang的世界)
作者:成立濤 ([email protected])
作為程式員,我們曾經聞聽很多“業界動态”,“技術革新”,曾經接觸很多“高手箴言”,“權威推薦”。這些正确與否,都已成過去!
現在,讓我們迎接Erlang盛宴!
一、經曆
2007年11月在koders.com搜尋代碼時,發現*.erl格式的源檔案,感歎開發語言的花樣百出,此時,我覺得erlang是一個醜陋的小家夥,看名字就沒有對它提起多少興趣。
2008年初的時候,公司的項目開發中,我有緣認識了ejabberd,一個采用Erlang開發的開源jabber伺服器。我開始為其誘人的特性所傾倒。是時候認真看看Erlang到底什麼樣了!
2008年4月,通過各種資料的搜集,了解,我決定系統的學習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種基本的資料類型:
integer、float、atom、reference、fun、port、pid、bitstring
同時提供2種複合結構:tuple,list,這就是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中包含大量的資料結構如lists,array,dict,gb_sets,gb_trees,ets,dets等
mnesia提供一個分布式的資料庫系統
inets提供ftp client,http client/server,tftp 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中提供一般語言所提供的exception,catch,try…catch等文法,同時Erlang支援Link和Monitor兩種機制,我們可以将Process連接配接起來,讓他們組成一個整體,某個Process出錯,或推出時,其他Process都具有得知其推出的能力。而Monitor顧名思義,可以用來監控某個Process,判斷其是否退出或出錯。所有的這些Erlang都提供内在支援,我們快速的開發堅固的産品,不在是奢望。
6.代碼熱替換
你的産品想不間斷的更新麼?Erlang可以滿足你這個需求,Erlang會在運作時自動将舊的子產品進行替換。一切都靜悄悄。
7.天生的分布式
Erlang天生适合分布式應用開發,其很多的BIF(内建函數,相API)都具有分布式版本,我們可以通過BIF在遠端機器上建立Process,可以向遠端機器上的某個Process發送消息。在分布式應用的開發中,我們可以像C、C++,JAVA等語言一樣,通過Socket進行通訊,也可以使用Erlang内嵌的基于Cookie的分布式架構,進行開發。當然也可以兩者混合。分布式開發更加友善,快速。Erlang的Process的操作,Error的處理等都對支援分布式操作。
8.超強的并發性
由于采用其自身Process,而沒有采用作業系統的程序和線程,我們可以建立大規模的并發處理,同時還簡化了我們的程式設計複雜度。我們可以通過幾十行代碼實作一個并發的TCP伺服器,這在其他語言中都想都不敢想!
9.多核支援
Erlang讓您的應用支援多個處理器,您不需要為不同的硬體系統做不同的開發。采用Erlang将最大限度的發揮你的機器性能。
10.跨平台
如同JAVA一樣,Erlang支援跨平台(其目前支援linux,mac,windows等19種平台),不用為代碼的移植而頭疼。
我們僅僅需要了解平台的一些特性,對運作時進行優化。
11.開源
開源是我非常喜歡的一個詞彙,開源意味這更加強壯,更加公開,更加的追求平等。開源會讓Erlang更好。
五、Erlang與外界的互動
Erlang可以與其他的語言進行互動,如C、C++,Java。當然也有熱心的朋友提供了與其他語言的互動,如果需要你也可以根據Erlang的資料格式,提供一個庫,讓Erang與您心愛的語言互動。
Erlang支援分布式開發,您可以建立一個C Node,其如同一個Erlang節點,前提是你遵照Erlang的規範。
當然最常用的互動還是再同一個Node上,比如我們要調用某個lib,調用一些系統提供的功能,這時候主要有兩種方式:Port和嵌入式執行。
Port是Erlang最基本的與外界互動的方式,進行互動的雙方通過編碼,解碼,将資訊以位元組流的方式進行傳遞。(具體這個通道的實作方式,根據作業系統的不同而不同,比如unix環境下,采用PIPE實作,理論上任何支援對應Port通道實作的語言都可以與Erlang進行互動)。Erlang為了友善C和JAVA程式員,提供了Erl_Interface和Jinterface。
采用Port,您的代碼在Erlang的平台之外運作,其崩潰不會影響Erlang。
嵌入式執行,通過Erlang平台加載,是以這是非常危險的,如果您的程式崩潰,沒有任何理由,Erlang也會崩潰。
六、Erlang應用場景
分布式産品,網絡伺服器,用戶端,等各種應用環境。
Erlang也可以作為一種快速開發語言,進行原型開發。
七、Erlang的學習過程
<!--[if !supportLists]-->1. <!--[endif]-->安裝首先從Erlang官方網站,下載下傳安裝Erlang(http://www.erlang.org/download.html)
linux:擷取源代碼,根據說明編譯;windows:直接安裝
<!--[if !supportLists]-->2. <!--[endif]-->認真閱讀《programming erlang》(中文版圖書已經問世),并不斷動手練習書中的例程。
<!--[if !supportLists]-->3. <!--[endif]-->遇到問題時,不要退卻,堅持下去找到解決辦法
<!--[if !supportLists]-->4. <!--[endif]-->對語言熟悉時,浏覽一些好的開源項目
<!--[if !supportLists]-->5. <!--[endif]-->有信心時,開始動手做一個小項目
<!--[if !supportLists]-->6. <!--[endif]-->不間斷的與大家交流,共同提高
可能遇到的困難:
<!--[if !supportLists]-->a) <!--[endif]-->對于文法的不适應?
堅持看下去,代碼繼續寫下去,我相信1個月,你會喜歡上Erlang的文法
<!--[if !supportLists]-->b) <!--[endif]-->有些資料類型不清楚?
認真看資料,或者詢問朋友,比如我
<!--[if !supportLists]-->c) <!--[endif]-->中文資料的缺乏?
Erlang中文的資料會越來越多,此外,Erlang的相關的英文資料也比較容易了解,還是那句話,别怕麻煩
八、Erlang開源項目
排名不分先後
- couchdb 基于文檔等非結構化資料的資料庫,提供HTTP接口
- disco Map-Reduce架構,Erlang + Python
- ejabberd 性能出衆,使用廣泛的Jabber開源伺服器
- mochiweb 輕便,高效的HTTP應用架構
- rabbitmq 中間伺服器,實作AMQP協定
- yaws 高效的web server
- etorrent Bittorrent用戶端
- scalaris 分布式的key-value存儲
九、遇到問題
參看Erlang官方文檔 http://www.erlang.org/doc/
訂閱Erlang的maillist(http://www.erlang.org/mailman/listinfo/erlang-questions),進行提問
在Nabble提供的Erlang maillist存檔中搜尋(http://www.nabble.com/Erlang-f14095.html)
Google中搜尋答案
十、推薦閱讀
Erlang Design Principles (http://www.erlang.org/doc/design_principles/part_frame.html)
Erlang Efficiency Guide (http://www.erlang.org/doc/efficiency_guide/part_frame.html)
Erlang Programming Rules (http://www.erlang.se/doc/programming_rules.shtml)
十一、推薦網站
http://www.erlang.org
http://erlang-china.org
http://trapexit.org (國内封鎖,可以使用http://trapexit.org.nyud.net:8080/ 或其他代理登入)
http://toquick.com
http://blog.socklabs.com/
http://www.planeterlang.org/