Erlang
Erlang(Ericsson Language)是一種通用的面向并發(fā)的編程語言,它由瑞典電信設(shè)備制造商愛立信所轄的CS-Lab開發(fā),目的是創(chuàng)造一種可以應(yīng)對大規(guī)模并發(fā)活動的編程語言和運(yùn)行環(huán)境。Erlang問世于1987年剖笙,經(jīng)過十年的發(fā)展撒遣,于1998年發(fā)布開源版本。Erlang是運(yùn)行于BEAM(Bogdan/Bjo?rn’s Erlang Abstract Machine)虛擬機(jī)的解釋性語言肌似,但是現(xiàn)在也包含有烏普薩拉大學(xué)高性能Erlang計(jì)劃(HiPE)開發(fā)的本地代碼編譯器,自R11B-4版本開始诉瓦,Erlang也開始支持腳本式解釋器川队。在編程范型上,Erlang屬于多重范型編程語言睬澡,涵蓋函數(shù)式固额、并發(fā)式及分布式。順序執(zhí)行的Erlang是一個及早求值, 單次賦值和動態(tài)類型的函數(shù)式編程語言煞聪。
Erlang是一個結(jié)構(gòu)化斗躏,動態(tài)類型編程語言,內(nèi)建并行計(jì)算支持昔脯。最初是由愛立信專門為通信應(yīng)用設(shè)計(jì)的啄糙,比如控制交換機(jī)或者變換協(xié)議等,因此非常適 合于構(gòu)建分布式栅干,實(shí)時軟并行計(jì)算系統(tǒng)迈套。使用Erlang編寫出的應(yīng)用運(yùn)行時通常由成千上萬個輕量級進(jìn)程組成,并通過消息傳遞相互通訊碱鳞。進(jìn)程間上下文切換對于Erlang來說僅僅只是一兩個環(huán)節(jié)桑李,比起C程序的線程切換要高效得多得多了。
使用Erlang來編寫分布式應(yīng)用要簡單的多窿给,因?yàn)樗姆植际綑C(jī)制是透明的:對于程序來說并不知道自己是在分布式運(yùn)行贵白。Erlang運(yùn)行時環(huán)境是一個虛擬機(jī),有點(diǎn)像Java虛擬機(jī)崩泡,這樣代碼一經(jīng)編譯禁荒,同樣可以隨處運(yùn)行。它的運(yùn)行時系統(tǒng)甚至允許代碼在不被中斷的情況下更新角撞。另外如果需要更高效的話呛伴,字節(jié)代碼也可以編譯成本地代碼運(yùn)行勃痴。
Erlang主要特性:
- 并發(fā)性 - Erlang支持超大量級的并發(fā)進(jìn)程,并且不需要操作系統(tǒng)具有并發(fā)機(jī)制热康。
- 分布式 - 一個分布式Erlang系統(tǒng)是多個Erlang節(jié)點(diǎn)組成的網(wǎng)絡(luò)(通常每個處理器被作為一個節(jié)點(diǎn))
- 健壯性 - Erlang具有多種基本的錯誤檢測能力沛申,它們能夠用于構(gòu)建容錯系統(tǒng)。
- 軟實(shí)時性 - Erlang支持可編程的“軟”實(shí)時系統(tǒng)姐军,使用了遞增式垃圾收集技術(shù)铁材。
- 熱代碼升級 - Erlang允許程序代碼在運(yùn)行系統(tǒng)中被修改。舊代碼能被逐步淘汰而后被新代碼替換奕锌。在此過渡期間著觉,新舊代碼是共存的。
- 遞增式代碼裝載 - 用戶能夠控制代碼如何被裝載的細(xì)節(jié)惊暴。
- 外部接口 - Erlang進(jìn)程與外部世界之間的通訊使用和在Erlang進(jìn)程之間相同的消息傳送機(jī)制饼丘。
- Fail-fast(速錯機(jī)制),即盡可能快的暴露程序中的錯誤辽话。
- 面向并發(fā)的編程 COP (Concurrency-Oriented Programming)
- 函數(shù)式編程
- 動態(tài)類型
- 及早求值或嚴(yán)格求值
- 腳本語言
Elixir
Elixir 是一個基于 Erlang 虛擬機(jī)的函數(shù)式葬毫、面向并行的通用編程語言。Elixir 以 Erlang 為基礎(chǔ)屡穗,支持分布式、高容錯忽肛、實(shí)時應(yīng)用程序的開發(fā)村砂,同時亦對其進(jìn)行擴(kuò)展使之借助宏實(shí)現(xiàn)元編程,并通過協(xié)議支持多態(tài)屹逛。
José Valim 是 Elixir 語言的設(shè)計(jì)者础废。他創(chuàng)造該語言的目標(biāo)是在維持與現(xiàn)有 Erlang 工具鏈及生態(tài)環(huán)境兼容性的同時,讓人們可以在 Erlang 虛擬機(jī)上進(jìn)行擴(kuò)展性更好的罕模、高生產(chǎn)率的開發(fā)评腺。Elixir 是編寫高度并行處理,高可靠性應(yīng)用的極佳選擇淑掌。
Elixir主要特性
- 基于 Erlang 虛擬機(jī)(BEAM)之上蒿讥。
- 與 Erlang 語言的無縫銜接,與 Erlang 的互調(diào)幾乎無任何額外開銷抛腕。
- 基于宏的元編程能力芋绸,語言的抽象語法樹作為頭等公民。
- 基于協(xié)議的多態(tài)實(shí)現(xiàn)担敌。(啟發(fā)自Clojure)
- 通過消息傳遞(參與者模式)支持 Shared-nothing 并行事務(wù)摔敛。
- 強(qiáng)調(diào)利用遞歸和高階函數(shù)的函數(shù)式編程勝過基于副作用和循環(huán)的命令式編程。
- 一切均為表達(dá)式全封。
- 惰性求值马昙,擁有諸如 futures 和 promises 一類的異步流數(shù)據(jù)類型桃犬。
- 模式匹配。
- Unicode 支持行楞,UTF-8 字符串攒暇。
Actor并發(fā)
Elixir使用actor并發(fā)模型,actor是一個無依賴的進(jìn)程敢伸,它不與其他進(jìn)程共享任何東西扯饶。你可以spawn新進(jìn)程,向它發(fā)消息池颈,并且用receive接收消息尾序,僅此而已。這里談?wù)摰腅lixir進(jìn)程并不是操作系統(tǒng)的原生進(jìn)程躯砰。它們既慢又笨重每币。相反,Elixir使用Erlang的進(jìn)程琢歇。這些進(jìn)程將在所有的處理器中運(yùn)行(像原生進(jìn)程一樣)兰怠,但是它們的開銷非常小,在普通的機(jī)器里創(chuàng)建數(shù)十萬個Elixir進(jìn)程輕而易舉李茫。
OTP
OTP是Open Telecom Platform的縮寫揭保,是愛立信公司開發(fā)的開放電信應(yīng)用平臺,這是一個很強(qiáng)大并且很通用的框架魄宏,它能幫我們編寫大型的秸侣、容錯的,分布式的系統(tǒng)宠互。
OTP經(jīng)常被渲染成解決所有高可用分布式應(yīng)用困境的法寶味榛。其實(shí)未必,但是用它的確可以解決許多原本你需要自己解決的問題予跌,比如服務(wù)發(fā)現(xiàn)搏色、故障檢測與管理、熱代碼交換和服務(wù)器結(jié)構(gòu)安排等券册。OTP這個名字主要由于歷史原因沿用下來频轿,最初它被用來建立電話交換機(jī),這些設(shè)備具有的特性也正是我們希望所有大型在線應(yīng)用所具備的特性烁焙,所以O(shè)TP現(xiàn)在是一個通用工具略吨,用于開發(fā)和管理大型系統(tǒng)。
我們每學(xué)一樣?xùn)|西都要把握它的中心思想考阱,OTP的中心思想就是把程序的通用部分和業(yè)務(wù)部分切開翠忠,我?guī)湍惆淹ㄓ貌糠肿龊茫阕瞿愕臉I(yè)務(wù)邏輯就行了乞榨。如果你看過一些分布式系統(tǒng)秽之,最火的應(yīng)該是分布式存儲系統(tǒng)了当娱,像Amazon的Dynamo、Google的Bigtable考榨、LiveJournal的memcache等跨细,就知道保證分布式系統(tǒng)的容錯能力、數(shù)據(jù)一致性河质、請求高并發(fā)性是非常困難的冀惭。但是他們所用的算法都非常固定,當(dāng)你去實(shí)現(xiàn)另一個分布式系統(tǒng)時掀鹅,很可能就是參考他們的算法散休。然后一些技術(shù)功底不夠的程序員就想,要是能把這些基礎(chǔ)的設(shè)施都做好乐尊,并且提供插件擴(kuò)展戚丸,那多好啊,這樣當(dāng)我想寫個分布式數(shù)據(jù)庫的時候就能跟寫普通數(shù)據(jù)庫一樣簡單了扔嵌。沒錯限府,OTP就是幫你干那些又臟又累的活。
OTP實(shí)際上是一個包痢缎,其中包括了Erlang胁勺、分布式數(shù)據(jù)庫Mnesia和不計(jì)其數(shù)的庫文件,主要如下:
- 一個Erlang直譯器
- 一個Erlang編譯器
- 服務(wù)器之間的通信協(xié)定
- Corba Object Request Broker
- 一個統(tǒng)計(jì)分析工具独旷,名為Dialyzer
- 一個分布式數(shù)據(jù)庫服務(wù)器姻几,名為Mnesia
- 許多軟件庫
Elixir一直在使用OTP,包括mix势告、Elixir編譯器,甚至問題跟蹤系統(tǒng)都符合OTP約定抚恒。
了解更多
想要了解更多的Elixir可以讀讀下面兩篇文章咱台。
[1] elixir:靈丹妙藥?or 徒有其名俭驮?
[2] Elixir: 編程語言的未來