目標
Erlang是一種面向並發運行環境的通用程式語言。該語言由愛立信公司在1986年開始開發。設計之初,Erlang的開發者著眼於找到一種適用於開發大型電信交換設備的程式語言,即達到以下目標:
大規模並發處理與分散式計算能力
同時處理大量的並發業務(例如同時處理上百萬個電話呼叫);必須及時並在特定短的時問內完成業務處理;適用於大規模的分散式處理系統,並不斷與硬體進行互動;
用於開發高可靠性、高質量的電信產品
連續數年的不間斷運行;對軟體系統所進行的維護操作(如配置修改、升級等)不會中比軟體本身的運行;在硬體故障和軟體錯誤發生時具有容錯能力,嚴格地限制故障和錯誤所波及的範圍;
適用於複雜的項目
用於超大規模的軟體開發項目(例如數百萬行代碼);所實現的軟體能完成複雜的功能,各特性之問存在大量互動。
該語言隨後在愛立信內部的若干電信設備開發項目中得到套用,並逐步完善;1988年底Erlang成為開源語言(開源對愛立信的直接好處是:Erlang語言本身的維護與發展、相關的教育培訓等投入不再由愛立信獨自承擔;在開源社區的看護下可以使Erlang更好地發展,同時愛立信也可以繼續享受該語言的成果),但並不廣為人知;近年來隨著基於網際網路的電子商務、即時通訊、雲計算、大型網路遊戲等套用的發展,以及多核處理器的逐漸興起,Erlang在大規模並發處理能力和高可靠性方面的優勢被越來越多的人所重視,其套用範圍有逐漸擴大之勢。
開發運行環境
Erlang語言可基於目前各主流作業系統開發與運行,包括Windows、Unix、Linux、Mac OS、VxWorks等等。
Erlang程式可以編譯為虛擬機指令,由虛擬機解釋執行(這一點類似於Java)。 Erlang語言所用的虛擬機被稱為BEAM。
Erlang也可以直接編譯為機器指令,直接在處理器運行(這一點類似於C/C++等)。
虛擬機方式和機器指令運行方式在套用效果上的主要區別是:虛擬機方式運行效率較低,但編譯後的程式指令占用記憶體空問較小;機器指令方式則反之。具體如何選擇根據軟體項目的實際需要而定。
作為一種開源的程式語言,相關的資源可在其社區網站(http: //www. erlang. org/)直接h載。可獲得的下載資源包括一個被稱為OTP (Open Telecom Platform)的一整套支撐平台,該平台包括大量的文檔、庫函式與組件、開發與調測工具,以及一個被稱為Mnesia的分散式實時關係資料庫(該資料庫由Erlang開發;其數據訪問語言是Erlang,而非通常關係資料庫所用的SQL)
特徵機制
分散式運行環境
一個用Erlang開發的系統,其程式運行在一組被稱為Erlang Node的物理節點上。可以用一個私有區域網路內的若干台主機構成這些物理節點,也可以用通過使用TCP/IP套接字將更大範圍中的物理節點連線起來組成一個系統。
基於程式語言本身的進程管理
Erlang語言本身支持進程概念。一個Erlang系統中通常運行大量的進程(在電信交換系統中同時存在數百萬進程並不讓人驚訝),每個進程運行在一個Erlang Node上並可以跨Node創建其它進程。通常建議每個進程只處理輕量級的任務;如果有較複雜的大型任務需要處理,則軟體設計人員應設法將大型任務儘可能分解成較小的任務,這樣做的目的是儘可能充分發揮大規模分散式系統中所有物理節點的處理能力。
基於異步訊息的進程問通信
用傳統語言編程通常都會用到複雜的共享記憶體管理機制,這也是用傳統語言編程的一個容易出錯的方;Erlang的各進程之間則完全不共享記憶體,進程之問的通信只通過異步訊息來完成。
每個Erlang進程都有一個專用的信箱用於接收訊息。當接收到一個期望收到的異步訊息則立刻處理之,否則將其緩衝並等到期望收到該訊息時再處理。
每個進程的所有行為都是由所接收到的異步訊息或時間定時器觸發,運行過程中也不存在因等待共享記憶體使用權而產生的阻塞。
不共享記憶體也就避免了隨之而來的出錯機會;但所有進程問通信(特別是一個物理節點內的進程問通信)都需要通過異步訊息進行,無疑也增加了通信所需的開銷(主要是訊息內容的拷貝),這是Erlang為提高可靠性而付出的代價。
基於進程機制的軟體出錯處理
Erlang提供了定義“相連”進程的機制,即在進程之問可定義“相連”關係,當一個進程因出錯而死亡時,向所有與其有“相連”關係的進程報告自身的死亡信息;收到死亡信息的進程如果是普通進程(區別於系統進程),則也立刻死亡(一旦出錯,所有相連進程全部死亡);系統進程則可進行出錯信息記錄等操作,然後繼續運行。
基於雙機備份的容錯機制
一個考慮了容錯設計的Erlang系統至少要包含2個節點,它們之間互相監視;當一個節點出錯岩機(無論是軟體原因還是硬體故障),其工作立即由另一個節點接替。
這種容錯機制背後的理念是:一旦一個節點失效,則不再信任其能進行任何後續的故障處理;為保證容錯,失效節點的職責必須立刻由其它節點接替。