Erlang在1991年由愛立信公司向用戶推出了第一個版本,經過不斷地改進完善和發展,在1996年愛立信又為所有的Erlang用戶提供了一個非常實用且穩定的OTP軟件庫并在1998年發布了第一個開源版本。Erlang同時支持的操作系統有Linux,windows,unix等,可以說適用于主流的操作系統上,尤其是它支持多核的特性非常適合多核CPU,而分布式特性也可以很好融合各種分布式集群。
簡要介紹
Erlang是一種通用的面向并發的編程語言,它由瑞典電信設備制造商愛立信所轄的CS-Lab開發,目的是創造一種可以應對大規模并發活動的編程語言和運行環境。Erlang問世于1987年,經過十年的發展,于1998年發布開源版本。Erlang是運行于虛擬機的解釋性語言,但是也包含有烏普薩拉大學高性能Erlang計劃(HiPE)開發的本地代碼編譯器,自R11B-4版本開始,Erlang也開始支持腳本式解釋器。在編程范型上,Erlang屬于多種范型編程語言,涵蓋函數式、并發式及分布式。順序執行的Erlang是一個及早求值,單次賦值和動態類型的函數式編程語言。
Erlang是一個結構化,動態類型編程語言,內建并行計算支持。最初是由愛立信專門為通信應用設計的,比如控制交換機或者變換協議等,因此非常適合于構建分布式,實時軟并行計算系統。
使用Erlang來編寫分布式應用要簡單得多,因為它的分布式機制是透明的:對于程序來說并不知道自己是在分布式運行。Erlang運行時環境是一個虛擬機,有點像Java虛擬機,這樣代碼一經編譯,同樣可以隨處運行。它的運行時系統甚至允許代碼在不被中斷的情況下更新。另外如果需要更高效的話,字節代碼也可以編譯成本地代碼運行。
歷史
Erlang得名于丹麥數學家及統計學家AgnerKrarupErlang,同時Erlang還可以表示EricssonLanguage。
Erlang并非一門新語言,它出現于1987年,只是當時對并發、分布式需求還沒有這么普遍,當時可謂英雄無用武之地。Erlang語言創始人JoeArmstrong當年在愛立信做電話網絡方面的開發,他使用smalltalk,可惜那個時候Smalltalk太慢,不能滿足電話網絡的高性能要求。但Joe實在喜歡Smalltalk,于是定購了一臺TektronixSmalltalk機器。但機器要兩個月時間才到,Joe在等待中百無聊賴,就開始使用Prolog,結果等Tektronix到來的時候,他已經對Prolog更感興趣,Joe當然不滿足于精通Prolog,經過一段時間的試驗,Joe給Prolog加上了并發處理和錯誤恢復,于是Erlang就誕生了。這也是為什么Erlang的語法和Prolog有不少相似之處,比如它們的List表達都是[Head|Tail]。
1987年Erlang測試版推出,并在用戶實際應用中不斷完善,于1991年向用戶推出第一個版本,帶有了編譯器和圖形接口等更多功能。1992年,Erlang迎來更多用戶,如RACE項目等。同期Erlang被移植到VxWorks、PC和麥金塔等多種平臺,兩個使用Erlang的產品項目也開始啟動。1993愛立信內部獨立的組織開始維護和支持Erlang實現和Erlang工具。
特點
區別于傳統的面向對象語言,它有著自己的優點:首先它是基于進程并發的,這些進程是輕量級的并且互相協作有條理的處理著事務,用戶不用擔心具體的PV操作,這些進程對于操作系統而言是透明的,對操作系統來說只有一個進程在運行。其次,每個進程擁有自己的獨立內存,在進程間通信中完全依賴于消息傳遞,每個進程都擁有自己獨立的郵箱并通過模式匹配的方式來查找要處理的消息,然后分別進行異步處理。這減輕了進程之間的耦合度,提高了獨立性。Erlang還具有可靠的容錯機制,由于進程之間相對獨立,于是Erlang里可以用一些進程去鏈接或監視另外一些進程,當這些被監視的進程因為錯誤而產生異常退出的時候,負責監視的程序就會收到這些進程退出的消息并對這些進程進行相應的處理。在OTP中Erlang可以利用監控樹執行一對一或者一對多的監控。最重要的是,對多核CPU的支持,在Erlang中對于多核的操作不需要開發人員來管理,對開發人員來說是完全透明的,我們只需要和往常一樣編寫程序就可以。最后Erlang是支持熱代碼升級的,在Erlang中可以實現不停機就進行代碼的升級,來實現軟件運行中的熱升級。Erlang的版本管理中,可以保留一個模塊的2種不同的版本,支持對版本的回滾。
Erlang語言專注于某方面的需求,并不是完全適合所有情況,在它有很多誘人的特性的同時也有一些缺點:它的語言的抽象能力不強,Erlang是一種弱類型語言,在匹配的時候可以較為方便的調整消息的內容或者模式的要求,但發生錯誤的時候,這些錯誤的隱蔽性較強。另外,當項目規模比較大的時候會發現由于語言的特性各部分出現扁平化的特征,程序中有非常多的元組和記錄程序結構混亂。其次,函數式編程與傳統語言有差別,目前主流的編程語言都是c語言系和面向對象,目前函數式編程缺乏成熟的編程理論,相關方面的人才和資料也較少這增加了學習的難度,另外面向對象的思想已經深入人心,這使得在學習函數式編程的時候思維難以轉變。最重要的是,Erlang是屬于IO密集型的語言,適合分布式特征明顯的項目,對于計算密集型的要求,會比較吃力,但是仍然有優化提升的空間。
分布式
代碼示例如下:
% create process and call the 函數 web:start_server(Port,MaxConnections)
ServerProcess=spawn(web,start_server,[Port,MaxConnections]),
% create a remote process and call the function web:start_server(Port,MaxConnections) on machine
RemoteNodeRemoteProcess=spawn(RemoteNode,web,start_server,[Port,MaxConnections]),
% send the{pause,10}message(a tuple with an atom"pause"and a number"10")to ServerProcess(asynchronously)
ServerProcess!{pause,10},
% receive messages sent to this process
receive
a_message->do_something;
{數據,DataContent}->handle(DataContent);
{hello,Text}->io:format("Got hello message:~s",[Text]);
{goodbye,Text}->io:format("Got goodbye message:~s",[Text])
end.
函數式
Erlang函數大致寫法如下,以一個求整數階乘的模塊為例:
-module(FACT).
-export([fac/1]).
fac(1)->1;
fac(N)whenN>1->N*fac(N-1).
注:該文件要保存成"fact.erl",文件名必須和模塊名一致才能編譯通過。
下面是快速排序算法的一個Erlang實現:
%% quicksort:qsort(List)
%% Sort a list of items
-module(quicksort).
-export([qsort/1]).
qsort([])->[];
qsort([Pivot|Rest])->
qsort([X||X<-Rest,X=
注:該文件要保存成“quicksort.erl”文件名必須和模塊名一致才能編譯通過。
開發工具
文本編輯器
Linux下有全套的IDE環境插件可用完善的如SublimErl,windows下只能自己簡單的集成一部分基礎功能。對比于eclispse的erlide的優勢是大項目時操作響應速度快,體驗流暢錯誤少。
Emacs
可以使用任何你喜歡的編輯器編寫Erlang程序,但如果你使用Emacs編輯可以支持很多功能,比如:代碼縮進、語法高亮、驗證模塊名稱、支持段落的注釋、模塊骨架、標簽和更多的支持。
有關詳細信息請參閱Erlang Tools
文檔。
Erlide
這是一個基于Eclipse的Erlang圖形界面插件(ErlIDE),ErlIDE正在積極開發新特性,同時它也是開源的。
流量單位
指測量電話呼叫流量的單位。一個厄朗等于一個小時的中繼負荷,或3600秒中繼負荷。如果將CCS(百秒呼叫)轉換成厄朗值,則需先乘以100,然后再除以3600(或直接除以36)。因此,呼叫中心可使用厄朗值來反映中繼線路負荷,即一個小時滿負荷的平均中繼線路有多少數量。例如,在一個小時中,呼叫中心呼叫流量為12.35厄朗時,就意味著在該時段中,平均有12條線多一些都處于全負荷狀態。據此可以大致推算出需要多少座席人員。
指一種數學計算方法,這種方法是基于已知的信息,如平均通話時長,來預測無規則的工作負荷,如電話呼叫量。它是呼叫中心人員和中繼線路數量的決策參考方法。
厄朗公式有兩類,厄朗B用于呼叫量隨機狀態,同時沒有排隊的情況;厄朗C用于呼叫量隨機狀態,同時有排隊的情況,它假設所有來電者將無限期地進入隊列等待被接通。因此,呼叫量不可能比可用的中繼線路數量還大,如果那樣的話,將造成排隊無限期地延遲。
愛爾蘭分布是另一個常用的車頭時距分布,分布的密度函數為:
(15)
式中:k和為參數對于對于給定參數k,(15)式對應著一種分布,而隨著k取不同的值,可以得到不同的分布函數。因此,愛爾蘭分布適用范圍較廣。特別地,當k=1時,(15)對應著車頭時距為負指數分布的情形,當k=時,(15)對應著車頭時距為均勻分布的情形。研究表明,隨著k值的增大,說明交通越擁擠,駕駛員行為的隨機性越小。
對于單條車道上行駛的車輛,車頭時距不能小于最小車頭時距,因此,需要對模型(15)修改,引入帶移位的愛爾蘭分布,分布密度為:
(16)
對于(15)式,有:
(17)
(18)
式中,-樣本均值;S-樣本方差。因此,由(17),(18)兩式可得到參數k和的估計:
(19)
(20)
對于式(16)而言,參數k和仍可分別由(19)和(20)估計,對于參數i由(10)估計。
功能
使用Erlang編寫出的應用運行時通常由成千上萬個輕量級進程組成,并通過消息傳遞相互通訊。進程間上下文切換對于Erlang來說僅僅只是一兩個環節,比起C程序的線程切換要高效得多得多了。
使用Erlang來編寫分布式應用要簡單的多,因為它的分布式機制是透明的:對于程序來說并不知道自己是在分布式運行。
Erlang運行時環境是一個虛擬機,有點像Java虛擬機,這樣代碼一經編譯,同樣可以隨處運行。它的運行時系統甚至允許代碼在不被中斷的情況下更新。另外如果你需要更高效的話,字節代碼也可以編譯成本地代碼運行。
發展前景
Erlang近些年在國內的發展十分迅速,主要用于游戲服務器系統開發。Erlang上手容易,容錯率高,快速迭代等優點非常適用于頁游和手游的開發。尤其以廣州市,深圳等一些中,小型的游戲公司幾乎都是用Erlang。以C++為基礎語言的游戲服務器系統需要長時間的技術積累,并且c++的開發效率不如Erlang,高額的招人成本對新興公司也是巨大的挑戰。但中小型公司注重產品大于技術,這對Erlang在于國內的發展是不利的,大部分公司都用著同一套已經成型的Erlang框架,著重于處理具體的業務邏輯忽視了底層優化。這對于Erlang的發展是極其不利的。
Erlang在國外發展的時間較長作為一種成熟的語言已經得到了證實,目前應用于包括愛立信的寬帶,GPRS和ATM交換解決方案系統等幾百個重大的開發項目,有著豐富的項目經驗,編程框架(OTP)為Erlang系統的提供了一套實現健壯性和容錯性的工具和類庫和完整的結構化框架。但相較于國內用于游戲開發,國外主要用于web服務,計算機電話,消息系統和商業銀行等領域。在本世紀初Erlang.org網站總共有36000個網頁左右,十年之后,這一數字上升到了280萬,這說明Erlang社區地地的在擴大,包括商業,研究與開源項目,病毒營銷,書籍和博客的組合,當然這些都源自于Erlang最初的設計用于解決特定領域難題的需求和推動。
參考資料 >