程序語言的新星:走近Erlang的世界
——
認(rèn)識Erlang
Erlang并非一門新語言,它出現(xiàn)于1987年,只是當(dāng)時(shí)對并發(fā)、分布式需求還沒有今天這么普遍,當(dāng)時(shí)可謂英雄無用武之地。Erlang語言創(chuàng)始人Joe Armstrong當(dāng)年在愛立信做電話網(wǎng)絡(luò)方面的開發(fā),他使用Smalltalk,可惜那個(gè)時(shí)候Smalltalk太慢,不能滿足電話網(wǎng)絡(luò)的高性能要求。但Joe實(shí)在喜歡Smalltalk,于是定購了一臺Tektronix Smalltak機(jī)器。但機(jī)器要兩個(gè)月時(shí)間才到,Joe在等待中百無聊賴,就開始使用Prolog,結(jié)果等Tektronix到來的時(shí)候,他已經(jīng)對 Prolog更感興趣,Joe當(dāng)然不滿足于精通Prolog,經(jīng)過一段時(shí)間的試驗(yàn),Joe給Prolog加上了并發(fā)處理和錯(cuò)誤恢復(fù),于是Erlang就誕生了。這也是為什么Erlang的語法和Prolog有不少相似之處,比如它們的List表達(dá)都是[Head | Tail]。
1987年Erlang測試版推出,并在用戶實(shí)際應(yīng)用中不斷完善,于1991年向用戶推出第一個(gè)版本,帶有了編譯器和圖形接口等更多功能。1992年,Erlang迎來更多用戶,如RACE項(xiàng)目等。同期Erlang被移植到 VxWorks、PC和 Macintosh等多種平臺,兩個(gè)使用Erlang的產(chǎn)品項(xiàng)目也開始啟動。1993愛立信公司內(nèi)部獨(dú)立的組織開始維護(hù)和支持Erlang實(shí)現(xiàn)和 Erlang工具。
目前,隨著網(wǎng)絡(luò)應(yīng)用的興起,對高并發(fā)、分布部署、持續(xù)服務(wù)的需求增多,Erlang的特性剛好滿足這些需求,于是Erlang開始得到更多人的關(guān)注。
Erlang特性
Erlang是一種函數(shù)式語言,使用Erlang編寫出的應(yīng)用運(yùn)行時(shí)通常由成千上萬個(gè)輕量級進(jìn)程組成,并通過消息傳遞相互通訊。使用Erlang來編寫分布式應(yīng)用比其它語言簡單許多,因?yàn)樗姆植际綑C(jī)制是透明的,即對于程序而言并不知道自己是在分布式運(yùn)行。Erlang運(yùn)行環(huán)境是一個(gè)虛擬機(jī),有點(diǎn)類似于Java虛擬機(jī),代碼一經(jīng)編譯,同樣可以隨處運(yùn)行。它的運(yùn)行時(shí)系統(tǒng)甚至允許代碼在不被中斷的情況下更新。另外如果需要更高效的話,字節(jié)代碼也可以編譯成本地代碼運(yùn)行。
Erlang的結(jié)構(gòu)圖
相較于其它語言,Erlang有很多天生的適應(yīng)現(xiàn)代網(wǎng)絡(luò)服務(wù)需求的特性:
◆并發(fā)性,Erlang具有超強(qiáng)的輕量級進(jìn)程,這種進(jìn)程對內(nèi)存的需求是動態(tài)變化的,并且它沒有共享內(nèi)存和通過異步消息傳送的通訊。Erlang支持超大量級的并發(fā)線程,并且不需要操作系統(tǒng)具有并發(fā)機(jī)制。
◆分布式,Erlang被設(shè)計(jì)用于運(yùn)行在分布式環(huán)境下。一個(gè)Erlang虛擬機(jī)被成為Erlang節(jié)點(diǎn)。一個(gè)分布式Erlang系統(tǒng)是多個(gè)Erlang節(jié)點(diǎn)組成的網(wǎng)絡(luò)(通常每個(gè)處理器被作為一個(gè)節(jié)點(diǎn))。一個(gè)Erlang節(jié)點(diǎn)能夠創(chuàng)建運(yùn)行在其它節(jié)點(diǎn)上的并行線程,而其它節(jié)點(diǎn)可以使用其余的操作系統(tǒng)。線程依賴不同節(jié)點(diǎn)之間的通訊,這完全和它依賴于單一節(jié)點(diǎn)一樣。
◆ 軟實(shí)時(shí)性 Erlang支持可編程的“軟”實(shí)時(shí)系統(tǒng),這種系統(tǒng)需要反應(yīng)時(shí)間在毫秒級。而在這種系統(tǒng)中,長時(shí)間的垃圾收集(garbage collection)延遲是無法接受的,因此Erlang使用了遞增式垃圾收集技術(shù)。
◆ 熱代碼升級 一些系統(tǒng)不能由于軟件維護(hù)而停止運(yùn)行。Erlang允許程序代碼在運(yùn)行系統(tǒng)中被修改。舊代碼能被逐步淘汰而后被新代碼替換。在此過渡期間,新舊代碼是共存的。這也使得安裝Bug補(bǔ)丁、在運(yùn)行系統(tǒng)上升級而不干擾系統(tǒng)操作成為了可能。
◆ 遞增式代碼裝載 用戶能夠控制代碼如何被裝載的細(xì)節(jié)。在嵌入式系統(tǒng)中,所有代碼通常是在啟動時(shí)就被完全裝載。而在開發(fā)系統(tǒng)中,代碼是按需裝載的,甚至在系統(tǒng)運(yùn)行時(shí)被裝載。如果測試到了未覆蓋的Bug,只需替換具有Bug的代碼即可。
Erlang應(yīng)用場合
未來的計(jì)算是并發(fā)計(jì)算。現(xiàn)今甚至桌面CPU也是多核的,當(dāng)用戶給服務(wù)器購買了越來越多的CPU時(shí),他們更期望能最大限度地利用他們的新投資,但是今天的許多軟件系統(tǒng)并不能很好地做到這一點(diǎn)。
整個(gè)軟件行業(yè)也在發(fā)生重大變革,由賣工具軟件轉(zhuǎn)向賣服務(wù)(軟件免費(fèi),這也是開源軟件興起的過程),由單純客戶端向B/S或C/S轉(zhuǎn)化,相應(yīng)的存儲和計(jì)算向服務(wù)器端轉(zhuǎn)移,由原來的PC客戶端向客戶端多元化(如手機(jī)、PDA、電視機(jī)頂盒等)轉(zhuǎn)化。這些變革趨勢,使得用戶可以更方便地訪問到服務(wù)的同時(shí),服務(wù)器也要承受越來越高的負(fù)荷,并行/分布的需求逐漸增加。
Erlang語言不是用來解決所有問題的語言,至少現(xiàn)在還不是。Erlang最初專門為通信應(yīng)用設(shè)計(jì)的,比如控制交換機(jī)或者變換協(xié)議等,非常適合于構(gòu)建分布式,實(shí)時(shí)軟并行計(jì)算系統(tǒng)。它是一門專注的語言,可以適應(yīng)現(xiàn)代服務(wù)器要求高負(fù)荷、高可靠、持續(xù)服務(wù)的需求。它要解決的問題域包括:高并發(fā)、分布式、持續(xù)服務(wù)、熱升級和高可靠等問題。
Erlang應(yīng)用實(shí)例
典型的Erlang應(yīng)用是由很多被分配不同任務(wù)的“節(jié)點(diǎn)(Node)”組成的“集群 (Cluster)”。一個(gè)Erlang節(jié)點(diǎn)就是一個(gè)Erlang虛擬機(jī)的實(shí)例,用戶可以在一臺機(jī)器(服務(wù)器、臺式機(jī)或者筆記本)上運(yùn)行多個(gè)節(jié)點(diǎn)。 Erlang節(jié)點(diǎn)自動跟蹤所有連接著的其他節(jié)點(diǎn)。要添加一個(gè)節(jié)點(diǎn)僅僅需要將其指向任何一個(gè)已建節(jié)點(diǎn)就可以了。只要這兩個(gè)節(jié)點(diǎn)建立了連接,所有其他節(jié)點(diǎn)馬上就會感應(yīng)到新加入的節(jié)點(diǎn)。Erlang進(jìn)程使用進(jìn)程ID向其他進(jìn)程傳遞報(bào)文,進(jìn)程ID包含著運(yùn)行此進(jìn)程的節(jié)點(diǎn)信息。因此進(jìn)程不需要理會正在與其交流的其他進(jìn)程實(shí)際在何處運(yùn)行。一組相互連接的Erlang節(jié)點(diǎn)可以看作是一個(gè)網(wǎng)格計(jì)算體或者一臺超級計(jì)算機(jī)。
erlang的odbc應(yīng)用程序結(jié)構(gòu)圖
Yaws是一個(gè)Erlang寫的Web服務(wù)器。ErLang本身帶有一個(gè)HTTP Server,叫做inet。Yaws對于inet,就相當(dāng)于Servlet對于Http Server。Yaws也可說是一個(gè)Web開發(fā)框架,Yaws的ehtml類似于jsp、 php、ruby template。Yaws并發(fā)能力是Apache的15倍,有人利用16臺集群服務(wù)器所做的顯示,Yaws可以承受超八萬并發(fā)活動,Apache在四千就宕機(jī)了。
erlang和ruby的簡單測試
Ejabberd也是Erlang很好的應(yīng)用實(shí)例,也是目前可擴(kuò)展性最好的一種 Jabber/XMPP服務(wù)器,支持分布多個(gè)服務(wù)器,并且具有容錯(cuò)處理,單臺服務(wù)器失效不影響整個(gè)集群運(yùn)作。Ejabberd基于ErLang+ Mnesia構(gòu)建,項(xiàng)目已成功發(fā)展5年,占據(jù)30%左右Jabber服務(wù)器市場。
Tsung則是多協(xié)議分布式壓力測試工具,可用于測試Http、Soap、Postgresql和Jabber/XMPP服務(wù)器。而Wings則是一個(gè)3D建模程序,軟件支持Windows、Mac OSX和Linux等操作系統(tǒng),這兩個(gè)項(xiàng)目都基于Erlang構(gòu)建。
下一個(gè)Java?
Erlang將會成為一個(gè)非常重要的語言。如果有了大公司的支持,它甚至可能成為下一個(gè)Java。因?yàn)樗莻€(gè)開源項(xiàng)目,非常適合多核處理、Web服務(wù)等領(lǐng)域。事實(shí)上,它也是編寫在多核機(jī)器上運(yùn)行的高可靠性系統(tǒng)的唯一成熟語言。
Erlang始于20年前,是一個(gè)并發(fā)性Prolog,Joe Armstrong創(chuàng)造了它。第一個(gè)大型Erlang項(xiàng)目是一個(gè)由幾百人創(chuàng)建的電信交換系統(tǒng),系統(tǒng)有數(shù)百萬行代碼。系統(tǒng)主要關(guān)注的就是可靠性,并且系統(tǒng)有難以置信的可靠性歷史。據(jù)Joe介紹,“它有99.9999999%的可靠性”。
這意味著每10億秒才有1秒宕機(jī)時(shí)間,或者說10億分鐘有1分鐘宕機(jī)時(shí)間。十億秒大概是30年,10億分鐘大概有2000年。99.999%的可靠性大概是每年宕機(jī)5分鐘,這已經(jīng)是很好的了。了解可靠性的人都知道,可靠性系統(tǒng)有 99.9999%的,甚至99.99999%的,但是估計(jì)沒聽過有99.9999999%可靠性的,可基于Erlang的系統(tǒng)實(shí)現(xiàn)了。
但這還不是令Erlang壯大的理由,因?yàn)椴皇鞘裁慈硕缄P(guān)注可靠性。也不是因?yàn)?nbsp;Erlang是一個(gè)函數(shù)式語言,更不是并行Erlang是個(gè)面向?qū)ο笳Z言。其發(fā)展迅速的主要原因是唯一一個(gè)有可靠實(shí)現(xiàn)和完善類庫的成熟的并行開發(fā)語言,在不久的將來所有的桌面系統(tǒng)、筆記本電腦都將是多核的,而要讓程序在多核上更快的運(yùn)行就要使程序能充分利用多核處理的能力。
Erlang帶有一組類庫。多數(shù)類庫是用于構(gòu)建各類Internet服務(wù)的。 Erlang有Web服務(wù)器和數(shù)據(jù)庫。Erlang社區(qū)認(rèn)為它是構(gòu)建可靠Web服務(wù)器和Web服務(wù)的首選語言。Erlang是一個(gè)構(gòu)建可靠系統(tǒng)的框架/平臺,它構(gòu)建的平臺可以持續(xù)運(yùn)行而無需關(guān)閉,可以每天更新軟件,甚至可以定期的更換硬件。這些特性是電信應(yīng)用所需要的,它還是在線銀行、在線商城等各類在線應(yīng)用所迫切需要的。
Joe Armstrong最近寫了本書《Programming.Erlang》,所有關(guān)注Erlang的人都值得一讀。Erlang符合所有面向?qū)ο笳Z言特性,雖然它是個(gè)函數(shù)式語言,而不是面向?qū)ο笳Z言。Erlang區(qū)分與面向?qū)ο笳Z言的一個(gè)方面就是它的錯(cuò)誤處理。在某消息出錯(cuò)時(shí),進(jìn)程不是拋出出錯(cuò)的部分,而是直接進(jìn)程糾錯(cuò)。系統(tǒng)結(jié)構(gòu)被設(shè)計(jì)為底部是工作進(jìn)程(它們可能會失?。?,上層是管理進(jìn)程,它們可以重新啟動失敗的進(jìn)程。
我不相信其它語言能迅速趕上Erlang。對其它語言而言,加入像Erlang這樣的語言特征是很容易的。但這將花費(fèi)他們大量的時(shí)間構(gòu)建一個(gè)高質(zhì)量的VM和成熟的并發(fā)性與可靠性類庫。因此Erlang很自然會成功。如果將來要在多核系統(tǒng)上進(jìn)行開發(fā),Erlang是非常理想的選擇。
Erlang在中國
目前,Erlang在全球都還是個(gè)小眾語言,其在中國影響力就更小了,好在有國內(nèi)的 Erlang愛好者已經(jīng)組織起來,在進(jìn)行相關(guān)的工作,成立了Erlang-china.org,發(fā)布了部分Erlang相關(guān)中文文檔,并且組織了兩次 Erlang愛好者聚會,Erlang-China.org將繼續(xù)為對Erlang感興趣的中文用戶提供便利,促進(jìn)用戶彼此之間的交流,推動對這一語言的深入研究,促成一些Erlang開源項(xiàng)目,幫助中文用戶為整個(gè)Erlang社區(qū)做出貢獻(xiàn)。
Erlang沒有類似Java、C++的語法,它不是面向?qū)ο笳Z言,它是函數(shù)編程語言(Functional programming Language)。大量程序員并不熟悉函數(shù)式編程,我們的計(jì)算機(jī)教育里也都是基于面向?qū)ο蠛兔嫦蜻^程語言的,這會是所有想嘗試Erlang的用戶遇到的首要問題,這會使得培訓(xùn)成本加大,決策人員也需要足夠勇氣來選擇一個(gè)新語言來構(gòu)建應(yīng)用。
另外,Erlang雖然內(nèi)建了并行、分布的支持,但是程序員還需要學(xué)習(xí)和掌握并行的思維模式,并行的思維模式也許是更加難以跨越的門檻。
要解決計(jì)算時(shí)代,可伸縮性、容錯(cuò)性以及運(yùn)行時(shí)可更新系統(tǒng)需求,就目前而言,只有 Erlang語言可以很好的解決。Erlang語言也正面臨這一場大的變革,從默默無聞走向更多人視野,會向更廣的網(wǎng)絡(luò)應(yīng)用領(lǐng)域滲透。也許,不久的將來,當(dāng)你聽到Erlang時(shí),就如同聽說Java一樣平常。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論