程序語言的新星:走近Erlang的世界

  提起Erlang語言,相信許多人都會撓頭,因爲它實在是太陌生了。在2007年6月由TIOBE Programming Community提供的程序語言排名中,Erlang佔有率僅爲0.08%,排名第49位。與之形成鮮明對比的是,Java以20.025%的佔有率高居榜首,緊隨其後的是C(15.967%)、C++(11.118%)、VB (9.332%)、PHP(8.871%)、Perl(6.177%)、C#(3.483%)、Python(3.161%)、JavaScript (2.616%)和Ruby(2.132%)。相對於傳統老牌“大佬”語言相比,Erlang語言絕對算得上是一種“小衆”語言,但其未來的發展前景卻是無法估量的,因爲它可以解決傳統語言很難解決在並行計算中的難題,甚至有專家預言可能成爲下一個Java,在正在迅猛發展的並行計算時代,Erlang將會迅速的崛起。

  認識Erlang

  Erlang並非一門新語言,它出現於1987年,只是當時對併發、分佈式需求還沒有今天這麼普遍,當時可謂英雄無用武之地。Erlang語言創始人Joe Armstrong當年在愛立信做電話網絡方面的開發,他使用Smalltalk,可惜那個時候Smalltalk太慢,不能滿足電話網絡的高性能要求。但Joe實在喜歡Smalltalk,於是定購了一臺Tektronix Smalltak機器。但機器要兩個月時間纔到,Joe在等待中百無聊賴,就開始使用Prolog,結果等Tektronix到來的時候,他已經對 Prolog更感興趣,Joe當然不滿足於精通Prolog,經過一段時間的試驗,Joe給Prolog加上了併發處理和錯誤恢復,於是Erlang就誕生了。這也是爲什麼Erlang的語法和Prolog有不少相似之處,比如它們的List表達都是[Head | Tail]。

  1987年Erlang測試版推出,並在用戶實際應用中不斷完善,於1991年向用戶推出第一個版本,帶有了編譯器和圖形接口等更多功能。1992年,Erlang迎來更多用戶,如RACE項目等。同期Erlang被移植到 VxWorks、PC和 Macintosh等多種平臺,兩個使用Erlang的產品項目也開始啓動。1993愛立信公司內部獨立的組織開始維護和支持Erlang實現和 Erlang工具。

  目前,隨着網絡應用的興起,對高併發、分佈部署、持續服務的需求增多,Erlang的特性剛好滿足這些需求,於是Erlang開始得到更多人的關注。

  Erlang特性

  Erlang是一種函數式語言,使用Erlang編寫出的應用運行時通常由成千上萬個輕量級進程組成,並通過消息傳遞相互通訊。使用Erlang來編寫分佈式應用比其它語言簡單許多,因爲它的分佈式機制是透明的,即對於程序而言並不知道自己是在分佈式運行。Erlang運行環境是一個虛擬機,有點類似於Java虛擬機,代碼一經編譯,同樣可以隨處運行。它的運行時系統甚至允許代碼在不被中斷的情況下更新。另外如果需要更高效的話,字節代碼也可以編譯成本地代碼運行。

Erlang的結構圖

  相較於其它語言,Erlang有很多天生的適應現代網絡服務需求的特性:

  ◆併發性,Erlang具有超強的輕量級進程,這種進程對內存的需求是動態變化的,並且它沒有共享內存和通過異步消息傳送的通訊。Erlang支持超大量級的併發線程,並且不需要操作系統具有併發機制。

  ◆分佈式,Erlang被設計用於運行在分佈式環境下。一個Erlang虛擬機被成爲Erlang節點。一個分佈式Erlang系統是多個Erlang節點組成的網絡(通常每個處理器被作爲一個節點)。一個Erlang節點能夠創建運行在其它節點上的並行線程,而其它節點可以使用其餘的操作系統。線程依賴不同節點之間的通訊,這完全和它依賴於單一節點一樣。

  ◆ 軟實時性 Erlang支持可編程的“軟”實時系統,這種系統需要反應時間在毫秒級。而在這種系統中,長時間的垃圾收集(garbage collection)延遲是無法接受的,因此Erlang使用了遞增式垃圾收集技術。

  ◆ 熱代碼升級 一些系統不能由於軟件維護而停止運行。Erlang允許程序代碼在運行系統中被修改。舊代碼能被逐步淘汰而後被新代碼替換。在此過渡期間,新舊代碼是共存的。這也使得安裝Bug補丁、在運行系統上升級而不干擾系統操作成爲了可能。

  ◆ 遞增式代碼裝載 用戶能夠控制代碼如何被裝載的細節。在嵌入式系統中,所有代碼通常是在啓動時就被完全裝載。而在開發系統中,代碼是按需裝載的,甚至在系統運行時被裝載。如果測試到了未覆蓋的Bug,只需替換具有Bug的代碼即可。

  Erlang應用場合

  未來的計算是併發計算。現今甚至桌面CPU也是多核的,當用戶給服務器購買了越來越多的CPU時,他們更期望能最大限度地利用他們的新投資,但是今天的許多軟件系統並不能很好地做到這一點。

  整個軟件行業也在發生重大變革,由賣工具軟件轉向賣服務(軟件免費,這也是開源軟件興起的過程),由單純客戶端向B/S或C/S轉化,相應的存儲和計算向服務器端轉移,由原來的PC客戶端向客戶端多元化(如手機、PDA、電視機頂盒等)轉化。這些變革趨勢,使得用戶可以更方便地訪問到服務的同時,服務器也要承受越來越高的負荷,並行/分佈的需求逐漸增加。

  Erlang語言不是用來解決所有問題的語言,至少現在還不是。Erlang最初專門爲通信應用設計的,比如控制交換機或者變換協議等,非常適合於構建分佈式,實時軟並行計算系統。它是一門專注的語言,可以適應現代服務器要求高負荷、高可靠、持續服務的需求。它要解決的問題域包括:高併發、分佈式、持續服務、熱升級和高可靠等問題。

  Erlang應用實例

  典型的Erlang應用是由很多被分配不同任務的“節點(Node)”組成的“集羣 (Cluster)”。一個Erlang節點就是一個Erlang虛擬機的實例,用戶可以在一臺機器(服務器、臺式機或者筆記本)上運行多個節點。 Erlang節點自動跟蹤所有連接着的其他節點。要添加一個節點僅僅需要將其指向任何一個已建節點就可以了。只要這兩個節點建立了連接,所有其他節點馬上就會感應到新加入的節點。Erlang進程使用進程ID向其他進程傳遞報文,進程ID包含着運行此進程的節點信息。因此進程不需要理會正在與其交流的其他進程實際在何處運行。一組相互連接的Erlang節點可以看作是一個網格計算體或者一臺超級計算機。

erlang的odbc應用程序結構圖

  Yaws是一個Erlang寫的Web服務器。ErLang本身帶有一個HTTP Server,叫做inet。Yaws對於inet,就相當於Servlet對於Http Server。Yaws也可說是一個Web開發框架,Yaws的ehtml類似於jsp、 php、ruby template。Yaws併發能力是Apache的15倍,有人利用16臺集羣服務器所做的顯示,Yaws可以承受超八萬併發活動,Apache在四千就宕機了。

erlang和ruby的簡單測試

  Ejabberd也是Erlang很好的應用實例,也是目前可擴展性最好的一種 Jabber/XMPP服務器,支持分佈多個服務器,並且具有容錯處理,單臺服務器失效不影響整個集羣運作。Ejabberd基於ErLang+ Mnesia構建,項目已成功發展5年,佔據30%左右Jabber服務器市場。

  Tsung則是多協議分佈式壓力測試工具,可用於測試Http、Soap、Postgresql和Jabber/XMPP服務器。而Wings則是一個3D建模程序,軟件支持Windows、Mac OSX和Linux等操作系統,這兩個項目都基於Erlang構建。

  Erlang將會成爲一個非常重要的語言。如果有了大公司的支持,它甚至可能成爲下一個Java。因爲它是個開源項目,非常適合多核處理、Web服務等領域。事實上,它也是編寫在多核機器上運行的高可靠性系統的唯一成熟語言。

  Erlang始於20年前,是一個併發性Prolog,Joe Armstrong創造了它。第一個大型Erlang項目是一個由幾百人創建的電信交換系統,系統有數百萬行代碼。系統主要關注的就是可靠性,並且系統有難以置信的可靠性歷史。據Joe介紹,“它有99.9999999%的可靠性”。

  這意味着每10億秒纔有1秒宕機時間,或者說10億分鐘有1分鐘宕機時間。十億秒大概是30年,10億分鐘大概有2000年。99.999%的可靠性大概是每年宕機5分鐘,這已經是很好的了。瞭解可靠性的人都知道,可靠性系統有 99.9999%的,甚至99.99999%的,但是估計沒聽過有99.9999999%可靠性的,可基於Erlang的系統實現了。

  但這還不是令Erlang壯大的理由,因爲不是什麼人都關注可靠性。也不是因爲 Erlang是一個函數式語言,更不是並行Erlang是個面嚮對象語言。其發展迅速的主要原因是唯一一個有可靠實現和完善類庫的成熟的並行開發語言,在不久的將來所有的桌面系統、筆記本電腦都將是多核的,而要讓程序在多核上更快的運行就要使程序能充分利用多核處理的能力。

  Erlang帶有一組類庫。多數類庫是用於構建各類Internet服務的。 Erlang有Web服務器和數據庫。Erlang社區認爲它是構建可靠Web服務器和Web服務的首選語言。Erlang是一個構建可靠系統的框架/平臺,它構建的平臺可以持續運行而無需關閉,可以每天更新軟件,甚至可以定期的更換硬件。這些特性是電信應用所需要的,它還是在線銀行、在線商城等各類在線應用所迫切需要的。

  Joe Armstrong最近寫了本書《Programming.Erlang》,所有關注Erlang的人都值得一讀。Erlang符合所有面嚮對象語言特性,雖然它是個函數式語言,而不是面嚮對象語言。Erlang區分與面嚮對象語言的一個方面就是它的錯誤處理。在某消息出錯時,進程不是拋出出錯的部分,而是直接進程糾錯。系統結構被設計爲底部是工作進程(它們可能會失敗),上層是管理進程,它們可以重新啓動失敗的進程。

  我不相信其它語言能迅速趕上Erlang。對其它語言而言,加入像Erlang這樣的語言特徵是很容易的。但這將花費他們大量的時間構建一個高質量的VM和成熟的併發性與可靠性類庫。因此Erlang很自然會成功。如果將來要在多核系統上進行開發,Erlang是非常理想的選擇。

  Erlang在中國

  目前,Erlang在全球都還是個小衆語言,其在中國影響力就更小了,好在有國內的 Erlang愛好者已經組織起來,在進行相關的工作,成立了Erlang-china.org,發佈了部分Erlang相關中文文檔,並且組織了兩次 Erlang愛好者聚會,Erlang-China.org將繼續爲對Erlang感興趣的中文用戶提供便利,促進用戶彼此之間的交流,推動對這一語言的深入研究,促成一些Erlang開源項目,幫助中文用戶爲整個Erlang社區做出貢獻。

  Erlang沒有類似Java、C++的語法,它不是面嚮對象語言,它是函數編程語言(Functional programming Language)。大量程序員並不熟悉函數式編程,我們的計算機教育裏也都是基於面向對象和麪向過程語言的,這會是所有想嘗試Erlang的用戶遇到的首要問題,這會使得培訓成本加大,決策人員也需要足夠勇氣來選擇一個新語言來構建應用。

  另外,Erlang雖然內建了並行、分佈的支持,但是程序員還需要學習和掌握並行的思維模式,並行的思維模式也許是更加難以跨越的門檻。

  要解決計算時代,可伸縮性、容錯性以及運行時可更新系統需求,就目前而言,只有 Erlang語言可以很好的解決。Erlang語言也正面臨這一場大的變革,從默默無聞走向更多人視野,會向更廣的網絡應用領域滲透。也許,不久的將來,當你聽到Erlang時,就如同聽說Java一樣平常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章