最近在總結一些Erlang編程語言的基礎知識,擬系統的介紹Erlang編程語言,從基礎到進階,然後再做Erlang編程語言有意思的庫的分析。
其實,還是希望越來越多的人關注Erlang,使用Erlang,壯大Erlang編程語言的社區。
說實話,我也沒這麼高尚,就是看到很多人對Erlang編程語言的誤解,Erlang編程語言社區的凋零,招個Erlang開發難之又難,才萌生此念。
這次主要介紹Erlang編程語言。包括Erlang的簡要歷史以及應用場景,Erlang並發編程,Erlang編程語言的特點,環境安裝就一筆帶過一下好了,最後,打算演示一個Wordcount的示例,一起來瞧瞧Erlang並發進程、分布式究竟長啥樣。
Erlang是咋來的?語法詭異,函數式,樣子“丑”到很多人不喜歡用,但是為什麼很多人又“吹噓”Erlang(我就屬於“吹噓”那一票人)?
Erlang出現在20世紀80年代中期,由瑞典電信設備制造商愛立信所管轄的實驗室開發的。當時那一票大神級人物為了尋找適合下一代電信產品的編程語言,愛立信實驗室花費了兩年多的時間使用原型法測試了所有可能的編程語言,最終這些人發現,雖然當時現有的編程語言也有一些有趣和相關的特性,但是並沒有一門獨立的語言能包容電信行業所需要的所有特性。這一點讓他們非常不爽。
那好吧,他們就決定開發一種全新的編程語言。
到了1996年,Erlang編程框架OTP誕生了,OTP給Erlang編程語言系統帶來了結構化的框架和一套實現健壯性和容錯性的工具和類庫。然後時間到了1998年12月,愛立信決定將Erlang作為開源代碼發布。1991年1月份的時候,Erlang編程語言官方網站總共大約只有36k個網頁,10年後,達到了2800k。看起來,Erlang社區是在不斷壯大(但是這發展速度,哎... 還是太憂桑)。
雖然很多編程語言在開發之前並沒有找到自己的定位,但是Erlang編程語言的定位非常明確,就是用來構建分布式、容錯、大規模並發的軟實時系統。所以Erlang不僅被使用在電信行業,在多種領域內也取得了巨大的發展和使用。
如IM/推送領域,廣告數據領域,基礎設施,金融支付,還有游戲。
被Facebook花了190億刀收購的whatsapp主要用的就是Erlang,ejabberd、rabbitmq在Erlang圈也是非常出名的框架級別應用。
國內做IM/推送的公司就有點多了,北京圈,weibo私信、環信、國美,深圳的雲巴,據不完全統計,我知道的就有10家左右。廣告數據領域,國外有OpenX,AOL Ad,國內有ptengine(我東家,嗯,來做個廣告,ptengine.com),adsage。Erlang的分布式特性使構建大規模的分布式系統變成非常方便。在基礎設施中,Riak作為非常出名的NOSQL,主要就是用Erlang來開發的,國內的Erlang大神余鋒也是用Erlang來開發RDS。在國內的金融支付領域,融易通和上海電銀,幾乎是Erlang在國內發展的倡導者,為國內培養了一大票Erlang程序員。
瞧瞧,瞧瞧,Erlang憑借其出色的並發性、分布式、容錯性、軟實時等特點,得到了很多應用領域的青睐和大規模使用。
先大致說一下並發和並行的基本概念和簡要區別。
現在很多人言必稱“並發”,反正,在整理這篇blog之前我對並發和並行的區別是有點模糊的。
在日常生活中,並發和並行幾乎表示的是同一個意思,但是在編程語言中,就精確區分一下吧。
並發的概念是什麼?
在計算機操作系統中,並發指的是在一個時間間隔內有幾個程序都處於已經啟動運行到結束運行之間,且這幾個程序都是在同一個處理機上被運行的,但是任意一個時刻點上只有一個程序在處理機上被運行。並發有三個特征:
並行是什麼?
在漢語的理解中,並行是指並排行走或者是同時實行或實施,在操作系統中,並行指的是一組程序按照獨立異步的方式執行,不等於時間上的重疊。當操作系統有兩個或兩個以上的CPU時,其中一個CPU執行一個線程(或進程)操作,另一個CPU可以執行另一個線程(或進程)操作,兩個線程(或進程)互不搶占CPU資源,可以同時進行,這種方式就被稱為並行。並行常見於高性能計算,像龍芯什麼的超算、流體力學高性能計算什麼的。
區別?
並發和並行,即是相似但又有區別的兩個概念,並行指的是兩個或多個事件在同一個時刻點發生;而並發指的是兩個或多個事件在同一個時間間隔內發生。如果只有一台單核計算機,是無法在計算機上執行並行程序的,因為計算機只有一個CPU,而每次只能做一件事。然而,可以在單核計算機上執行並發程序,計算機可以在不同的任務之間分享計算機CPU事件。
並發的好處?
並發能夠給我們帶來很多好處,可以提升我們系統的性能,創建可擴展和容錯的系統。
首先帶來的好處是提升系統的性能,設想有兩個任務,任務A需要10秒的執行時間,任務B需要15秒得執行時間,如果只是在單個CPU上執行任務A和任務B,需要的時間就有25秒。但是如果是在有兩個CPU的計算機上,任務A和任務B的需要得執行時間就只有15秒。如果要實現這樣的性能提升,就需要並發程序。現在已經是多核計算機的時代,平時用的個人電腦都是多核,而8核CPU已經成為服務器的基本標配,32核心、64核心的計算機也已經不是什麼稀罕的配置。而並發程序能夠更好的利用多核CPU,最大限度的提升系統的性能。
第二是可擴展性,並發程序一般由多個小型獨立的進程組成,所以,增加進程數量和添加更多的計算機CPU就能夠輕松的擴展系統。
第三,能夠使系統更加清晰。在現實世界,很多事物都是並發的,但是大多數編程語言中的事物都是順序發生的。現實世界得並行和編程語言中的順序性之間的不同,就帶來了諸多麻煩。在Erlang編程語言中,可以直觀地將現實世界的並行性映射到Erlang的並發性上,也就能夠讓程序代碼甚至是架構變得清晰並且易於理解。
在Erlang編程語言中,Erlang進程是並發並且獨立執行的。首先在Erlang編程語言中,Erlang進程是有別於操作系統進程的。Erlang的進程是非常輕量的,它有自己的堆棧空間。並且Erlang進程之間是相互獨立的,也就是說,每一個Erlang進程都有單獨屬於自己得堆棧空間,並且完全是私有的,兩個Erlang進程之間的堆棧空間不會被共享。如果兩個Erlang進程需要進行通信,那麼就只能使用發送消息的方式。所以,在Erlang進程的堆空間上就需要有一塊區域作為Erlang進程通信的消息郵箱。
上圖是Erlang進程堆棧結構的示意圖,從圖中,我們可以看出,Erlang系統中的每一個進程,都有自己單獨的PCB結構,棧空間,已經堆空間。因為Erlang進程輕量的特性,在系統中,就可以維護非常多的Erlang進程,這也是和操作系統進程最大的一個區別。數量眾多的Erlang進程,在Erlang虛擬機的調度下,能夠盡可能的利用多核計算機,進而為系統提供並發性。
最後一點需要注意是,Erlang編程語言的並發性,是由Erlang虛擬機提供的,不是操作系統,同樣也不是外部庫。Erlang編程語言是運行在虛擬機上的,所以它的並發性在所有得操作系統上都有相同的工作方式。
Erlang在國內外使用非常廣泛,國內很多團隊都屬於自己用著爽,國外相對比較“激進”。
參考:
1、Characterizing the scalability of Erlang VM
2、Erlang的幾本書
下一篇會重點解釋Erlang編程語言的特點,並發進程、分布式,別激動,很快。然後就會發現,為啥Erlang這麼屌了。
在CentOS上編譯安裝Erlang R15B http://www.linuxidc.com/Linux/2012-03/57663.htm
Ubuntu 11.10 搭建Erlang環境 http://www.linuxidc.com/Linux/2012-04/58208.htm
在 CentOS 5.7 上通過 YUM 安裝 Erlang 過程 http://www.linuxidc.com/Linux/2012-12/75622.htm
Erlang---啟動參數學習/研究 http://www.linuxidc.com/Linux/2011-07/39157.htm
CentOS 5.5 下源代碼編譯安裝 Erlang http://www.linuxidc.com/Linux/2011-07/39156.htm
Ubuntu 10.10下源碼安裝Erlang 5.8.3版本 http://www.linuxidc.com/Linux/2011-04/34863.htm
在 CentOS 6.4上安裝Erlang http://www.linuxidc.com/Linux/2013-06/85964.htm
Ubuntu 下 Erlang R16B 的安裝 http://www.linuxidc.com/Linux/2013-05/84235.htm
Erlang 的詳細介紹:請點這裡
Erlang 的下載地址:請點這裡