Erlang是一種功能編程語言,也具有運行時環(huán)境。它的構建方式使其對并發(fā),分發(fā)和容錯功能具有集成支持。Erlang最初是為在愛立信的多個大型電信系統(tǒng)中使用而開發(fā)的。
Erlang的第一個版本是由Joe Armstrong,Robert Virding和Mike Williams于1986年開發(fā)的。它最初是愛立信內部的專有語言。它隨后于1998年作為一種開放源語言發(fā)布。Erlang以及OTP(Erlang中的中間件和庫的集合)現(xiàn)在由愛立信的OTP產(chǎn)品部門提供支持和維護,并被廣泛稱為Erlang/OTP。
如果您具有以下要求,則應使用Erlang開發(fā)應用程序-
該應用程序需要處理大量并發(fā)活動。
它應該可以很容易地在計算機網(wǎng)絡上分發(fā)。
應該有一種使應用程序對軟件和硬件錯誤都容錯的工具。
該應用程序應該是可伸縮的。這意味著它應該能夠跨越多個服務器,而幾乎沒有變化。
它應該易于升級和重新配置,而不必停止和重新啟動應用程序本身。
該應用程序應在一定嚴格的時間范圍內對用戶做出響應。
Erlang的官方網(wǎng)站為https://www.erlang.org/。
Erlang是一種通用的面向并發(fā)的編程語言,它由瑞典電信設備制造商愛立信所轄的CS-Lab開發(fā),目的是創(chuàng)造一種可以應對大規(guī)模并發(fā)活動的編程語言和運行環(huán)境。Erlang問世于1987年,經(jīng)過十年的發(fā)展,于1998年發(fā)布開源版本。Erlang是運行于虛擬機的解釋性語言,但是現(xiàn)在也包含有烏普薩拉大學高性能Erlang計劃(HiPE)開發(fā)的本地代碼編譯器,自R11B-4版本開始,Erlang也開始支持腳本式解釋器。在編程范型上,Erlang屬于多重范型編程語言,涵蓋函數(shù)式、并發(fā)式及分布式。順序執(zhí)行的Erlang是一個及早求值,單次賦值和動態(tài)類型的函數(shù)式編程語言。
Erlang是一個結構化,動態(tài)類型編程語言,內建并行計算支持。最初是由愛立信專門為通信應用設計的,比如控制交換機或者變換協(xié)議等,因此非常適 合于構建分布式,實時軟并行計算系統(tǒng)。使用Erlang編寫出的應用運行時通常由成千上萬個輕量級進程組成,并通過消息傳遞相互通訊。進程間上下文切換對于Erlang來說僅僅 只是一兩個環(huán)節(jié),比起C程序的線程切換要高效得多得多了。
使用Erlang來編寫分布式應用要簡單的多,因為它的分布式機制是透明的:對于程序來說并不知道自己是在分布式運行。Erlang運行時環(huán)境是一個虛擬機,有點像Java虛擬機,這樣代碼一經(jīng)編譯,同樣可以隨處運行。它的運行時系統(tǒng)甚至允許代碼在不被中斷 的情況下更新。另外如果需要更高效的話,字節(jié)代碼也可以編譯成本地代碼運行。
Erlang得名于丹麥數(shù)學家及統(tǒng)計學家Agner Krarup Erlang,同時Erlang還可以表示Ericsson Language。
Erlang并非一門新語言,它出現(xiàn)于1987年,只是當時對并發(fā)、分布式需求還沒有今天這么普遍,當時可謂英雄無用武之地。Erlang語言創(chuàng)始人Joe Armstrong當年在愛立信做電話網(wǎng)絡方面的開發(fā),他使用Smalltalk,可惜那個時候Smalltalk太慢,不能滿足電話網(wǎng)絡的高性能要求。但Joe實在喜歡Smalltalk,于是定購了一臺Tektronix Smalltalk機器。但機器要兩個月時間才到,Joe在等待中百無聊賴,就開始使用Prolog,結果等Tektronix到來的時候,他已經(jīng)對Prolog更感興趣,Joe當然不滿足于精通Prolog,經(jīng)過一段時間的試驗,Joe給Prolog加上了并發(fā)處理和錯誤恢復,于是Erlang就誕生了。這也是為什么Erlang的語法和Prolog有不少相似之處,比如它們的List表達都是[Head | Tail]。
1987年Erlang測試版推出,并在用戶實際應用中不斷完善,于1991年向用戶推出第一個版本,帶有了編譯器和圖形接口等更多功能。1992年,Erlang迎來更多用戶,如RACE項目等。同期Erlang被移植到VxWorks、PC和 Macintosh等多種平臺,兩個使用Erlang的產(chǎn)品項目也開始啟動。1993愛立信公司內部獨立的組織開始維護和支持Erlang實現(xiàn)和Erlang工具。
區(qū)別于傳統(tǒng)的面向對象語言,它有著自己的優(yōu)點:首先它是基于進程并發(fā)的,這些進程是輕量級的并且互相協(xié)作有條理的處理著事務,用戶不用擔心具體的PV操作,這些進程對于操作系統(tǒng)而言是透明的,對操作系統(tǒng)來說只有一個進程在運行。其次,每個進程擁有自己的獨立內存,在進程間通信中完全依賴于消息傳遞,每個進程都擁有自己獨立的郵箱并通過模式匹配的方式來查找要處理的消息,然后分別進行異步處理。這減輕了進程之間的耦合度,提高了獨立性。Erlang還具有可靠的容錯機制,由于進程之間相對獨立,于是Erlang里可以用一些進程去鏈接或監(jiān)視另外一些進程,當這些被監(jiān)視的進程因為錯誤而產(chǎn)生異常退出的時候,負責監(jiān)視的程序就會收到這些進程退出的消息并對這些進程進行相應的處理。在OTP中Erlang可以利用監(jiān)控樹執(zhí)行一對一或者一對多的監(jiān)控。最重要的是,對多核CPU的支持,在Erlang中對于多核的操作不需要開發(fā)人員來管理,對開發(fā)人員來說是完全透明的,我們只需要和往常一樣編寫程序就可以。最后Erlang是支持熱代碼升級的,在Erlang中可以實現(xiàn)不停機就進行代碼的升級,來實現(xiàn)軟件運行中的熱升級。Erlang的版本管理中,可以保留一個模塊的2種不同的版本,支持對版本的回滾。
Erlang語言專注于某方面的需求,并不是完全適合所有情況,在它有很多誘人的特性的同時也有一些缺點:它的語言的抽象能力不強,Erlang是一種弱類型語言,在匹配的時候可以較為方便的調整消息的內容或者模式的要求,但發(fā)生錯誤的時候,這些錯誤的隱蔽性較強。另外,當項目規(guī)模比較大的時候會發(fā)現(xiàn)由于語言的特性各部分出現(xiàn)扁平化的特征,程序中有非常多的元組和記錄程序結構混亂。其次,函數(shù)式編程與傳統(tǒng)語言有差別,目前主流的編程語言都是C語言系和面向對象,目前函數(shù)式編程缺乏成熟的編程理論,相關方面的人才和資料也較少這增加了學習的難度,另外面向對象的思想已經(jīng)深入人心,這使得在學習函數(shù)式編程的時候思維難以轉變。最重要的是,Erlang是屬于IO密集型的語言,適合分布式特征明顯的項目,對于計算密集型的要求,會比較吃力,但是仍然有優(yōu)化提升的空間。
Erlang近些年在國內的發(fā)展十分迅速,主要用于游戲服務器系統(tǒng)開發(fā)。Erlang上手容易,容錯率高,快速迭代等優(yōu)點非常適用于頁游和手游的開發(fā)。尤其以廣州,深圳等一些中,小型的游戲公司幾乎都是用Erlang。以c++為基礎語言的游戲服務器系統(tǒng)需要長時間的技術積累,并且c++的開發(fā)效率不如Erlang,高額的招人成本對新興公司也是巨大的挑戰(zhàn)。但中小型公司注重產(chǎn)品大于技術,這對Erlang在于國內的發(fā)展是不利的,大部分公司都用著同一套已經(jīng)成型的Erlang框架,著重于處理具體的業(yè)務邏輯忽視了底層優(yōu)化。這對于Erlang的發(fā)展是極其不利的。
Erlang在國外發(fā)展的時間較長作為一種成熟的語言已經(jīng)得到了證實,目前應用于包括愛立信的寬帶,GPRS和ATM交換解決方案系統(tǒng)等幾百個重大的開發(fā)項目,有著豐富的項目經(jīng)驗,編程框架(OTP)為Erlang系統(tǒng)的提供了一套實現(xiàn)健壯性和容錯性的工具和類庫和完整的結構化框架。但相較于國內用于游戲開發(fā),國外主要用于web服務,計算機電話,消息系統(tǒng)和商業(yè)銀行等領域。在本世紀初Erlang.org網(wǎng)站總共有36000個網(wǎng)頁左右,十年之后,這一數(shù)字上升到了280萬,這說明Erlang社區(qū)不斷的在擴大,包括商業(yè),研究與開源項目,病毒營銷,書籍和博客的組合,當然這些都源自于Erlang最初的設計-用于解決特定領域難題的需求和推動。