(快步進入Erlang的世界)html
做者:成立濤 (litaocheng@gmail.com)linux
做爲程序員,咱們曾經聞聽不少「業界動態」,「技術革新」,曾經接觸不少「高手箴言」,「權威推薦」。這些正確與否,都已成過去!程序員
如今,讓咱們迎接Erlang盛宴!web
2007年11月在koders.com搜索代碼時,發現*.erl格式的源文件,感嘆開發語言的花樣百出,此時,我以爲erlang是一個醜陋的小傢伙,看名字就沒有對它提起多少興趣。正則表達式
2008年初的時候,公司的項目開發中,我有緣認識了ejabberd,一個採用Erlang開發的開源jabber服務器。我開始爲其誘人的特性所傾倒。是時候認真看看Erlang到底什麼樣了!數據庫
2008年4月,經過各類資料的蒐集,瞭解,我決定系統的學習Erlang。apache
今天,經過4個月的認真學習,我已經熟悉了Erlang,已經在使用Erlang開發項目。做爲C++程序員,我不敢妄自使用「熟悉」,「精通」之類的字眼,可是對於Erlang我能夠很負責任的說:Erlang很巧,很強大!編程
面對一個新的事務,咱們本性都會充滿好奇,但是做爲程序員,不少時候對於新的語言咱們都充滿了抵觸:這個新東西值得學習麼?它會不會讓我拋棄舊愛?它文檔豐富麼?是否是很難理解?它的前景如何?······相信你們跟我有同樣的苦惱。windows
可是,請聽我說!咱們是程序員,咱們走在技術革新的最前沿。用戶的產品,體驗是經過咱們來產生!咱們不能畏縮不前,咱們的固步自封,就是咱們的公司,乃至整個行業的停滯不前!口號可能有些響亮,可是認真思考,我相信朋友們必定有所感悟。服務器
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中只有8種基本的數據類型:
integer、float、atom、reference、fun、port、pid、bitstring
同時提供2種複合結構:tuple,list,這就是Erlang的全部數據類型。
在Erlang的函數中,某些語法中,咱們可使用Pattern匹配,這是一個很是好的特性,咱們可讓代碼本身去決定如何執行 :
好比,咱們定義一個函數,其告訴咱們某種水果的價格:
price(apple) ->2.0;
price(banana) ->1.2.
咱們隨後調用 price(Fruit),會根據Fruit變量的內容返回具體的價格。這樣作的好處就是節省了咱們的代碼量,咱們不用if...else…或者switch…case的來伺候了。也便於代碼的擴展:加一個新的水果品種,咱們只須要加一行就能夠了。
學習Erlang一個很是重要的內容就是模式匹配,可是請不要混淆,這個匹配和正則表達式沒有任何干系。
這個是一個匪夷所思的特性,變量居然只能單次賦值!是的Erlang中變量一旦綁定某個數值之後,就不能再次綁定,這樣作的好處是便於調試出錯(更深層次的緣由是Erlang爲併發設計,若是變量能夠修改,那麼就涉及到資源的加鎖解鎖等問題),當發生錯誤時,某個變量是什麼就永遠是什麼,不用順藤摸瓜的查找誰修改過它,省了好多事情。惟一的麻煩就是須要一個信的變量時,你必須再爲它想一個名字。
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,用來進行單元測試。
Erlang最初爲電信產品的開發,這樣的目的,決定了其對錯誤處理的嚴格要求。Erlang中提供通常語言所提供的exception,catch,try…catch等語法,同時Erlang支持Link和Monitor兩種機制,咱們能夠將Process鏈接起來,讓他們組成一個總體,某個Process出錯,或推出時,其餘Process都具備得知其推出的能力。而Monitor顧名思義,能夠用來監控某個Process,判斷其是否退出或出錯。全部的這些Erlang都提供內在支持,咱們快速的開發堅固的產品,不在是奢望。
你的產品想不間斷的更新麼?Erlang能夠知足你這個需求,Erlang會在運行時自動將舊的模塊進行替換。一切都靜悄悄。
Erlang天生適合分佈式應用開發,其不少的BIF(內建函數,相API)都具備分佈式版本,咱們能夠經過BIF在遠程機器上建立Process,能夠向遠程機器上的某個Process發送消息。在分佈式應用的開發中,咱們能夠像C、C++,JAVA等語言同樣,經過Socket進行通信,也可使用Erlang內嵌的基於Cookie的分佈式架構,進行開發。固然也能夠二者混合。分佈式開發更加方便,快速。Erlang的Process的操做,Error的處理等都對支持分佈式操做。
因爲採用其自身Process,而沒有采用操做系統的進程和線程,咱們能夠建立大規模的併發處理,同時還簡化了咱們的編程複雜度。咱們能夠經過幾十行代碼實現一個併發的TCP服務器,這在其餘語言中都想都不敢想!
Erlang讓您的應用支持多個處理器,您不須要爲不一樣的硬件系統作不一樣的開發。採用Erlang將最大限度的發揮你的機器性能。
如同JAVA同樣,Erlang支持跨平臺(其目前支持linux,mac,windows等19種平臺),不用爲代碼的移植而頭疼。
咱們僅僅須要瞭解平臺的一些特性,對運行時進行優化。
開源是我很是喜歡的一個詞彙,開源意味這更增強壯,更加公開,更加的追求平等。開源會讓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也能夠做爲一種快速開發語言,進行原型開發。
<!--[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官方文檔 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://trapexit.org (國內封鎖,可使用http://trapexit.org.nyud.net:8080/或其餘代理登陸)