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語言特性
簡單小巧
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中變量一旦綁定某個數值以后,就不能再次綁定,這樣做的好處是便于調試出錯。當發生錯誤時,某個變量是什么就永遠是什么,不用順藤摸瓜的查找誰修改過它,省了好多事情。唯一的麻煩就是需要一個信的變量時,你必須再為它想一個名字。
豐富的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,用來進行單元測試。
靈活多樣的錯誤處理
Erlang最初為電信產品的開發,這樣的目的,決定了其對錯誤處理的嚴格要求。Erlang中提供一般語言所提供的exception,catch,try…catch等語法,同時Erlang支持Link和Monitor兩種機制,我們可以將Process連接起來,讓他們組成一個整體,某個Process出錯,或推出時,其他Process都具有得知其推出的能力。而Monitor顧名思義,可以用來監控某個Process,判斷其是否退出或出錯。所有的這些Erlang都提供內在支持,我們快速的開發堅固的產品,不在是奢望。
代碼熱替換
你的產品想不間斷的更新么?Erlang可以滿足你這個需求,Erlang會在運行時自動將舊的模塊進行替換。一切都靜悄悄。#p#
天生的分布式
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與外界的交互
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的學習過程
1. 安裝首先從Erlang官方網站,下載安裝Erlang(http://www.erlang.org/download.html)
2. 認真閱讀《programming erlang》(中文版圖書已經問世),并不斷動手練習書中的例程。
3. 遇到問題時,不要退卻,堅持下去找到解決辦法
4. 對語言熟悉時,瀏覽一些好的開源項目
5. 有信心時,開始動手做一個小項目
6. 不間斷的與大家交流,共同提高
可能遇到的困難:
a) 對于語法的不適應?
堅持看下去,代碼繼續寫下去,我相信1個月,你會喜歡上Erlang的語法
b) 有些數據類型不清楚?
認真看資料,或者詢問朋友
c) 中文資料的缺乏?
Erlang中文的資料會越來越多,此外,Erlang的相關的英文資料也比較容易理解,還是那句話,別怕麻煩
Erlang開源項目(排名不分先后)
◆couchdb 基于文檔的數據庫,擁有RestfulAPI,MVCC,View,諸多特性
◆ejabberd 性能出眾,使用廣泛的Jabber開源服務器
◆mochiweb 輕便,高效的HTTP應用框架
◆nitrogen 基于事件的Web開發框架
◆rabbitmq 中間服務器,實現AMQP協議
◆yaws 高效的web server
◆etorrent Bittorrent客戶端
◆Scalaris 分布式的key-value存儲
◆disco Map-Reduce框架,Erlang + Python
【編輯推薦】