原文鏈接:http://www.csdn.net/article/2015-10-27/2826040-Elixir-Jos%C3%A9Valim
Elixir是一種運(yùn)行于Erlang VM上的函數(shù)式、具有元編程特性的動(dòng)態(tài)語言。它擁有靈活的語法和強(qiáng)大的宏系統(tǒng),還具備模式匹配、通過協(xié)議(類似Clojure的方式)支持多態(tài)等功能;繼承了Erlang的優(yōu)點(diǎn),尤其適合開發(fā)并行、分布式,以及高容錯(cuò)應(yīng)用。Erlang之父Joe Armstrong也對(duì)Elixir贊賞有加。日前,Elixir設(shè)計(jì)者José Valim接受了CSDN專訪,分享了他在設(shè)計(jì)這門語言時(shí)的感悟。

Elixir設(shè)計(jì)者,Rails核心團(tuán)隊(duì)成員,Plataformatec聯(lián)合創(chuàng)始人José Valim
語言成熟需待時(shí)間醞釀
CSDN:你設(shè)計(jì)Elixir的原因是什么,希望解決哪些問題?
José Valim:Erlang VM是種神奇的軟件,在過去十年中,許多公司使用它編寫出了高并發(fā)、分布式和高容錯(cuò)性軟件。Elixir的主要目標(biāo)是將Erlang VM通過另一種語法和另一套工具暴露給開發(fā)者。
最終,我希望Elixir和Erlang將能共享相同的字節(jié)碼和數(shù)據(jù)類型。這意味著開發(fā)者可以同時(shí)擁有Elixir的表達(dá)力,以及Erlang具備的高可靠性和高性能。
CSDN:Elixir的語法在很大程度上借鑒了Erlang和Ruby,為什么你沒有選擇一種更激進(jìn)的變化?
José Valim:在Elixir設(shè)計(jì)初期,我知道自己需要Elixir具備宏系統(tǒng),這是從Lisp中得到的啟發(fā)。對(duì)于宏系統(tǒng),只有在一種編程語言的語法能通過它自身的數(shù)據(jù)結(jié)構(gòu),以一種很直接的方式表達(dá)的情況下才合理。帶著這個(gè)目標(biāo),我設(shè)計(jì)了一種非常簡潔的語法,而后逐步增加層次,這部分靈感大多來自Ruby和Erlang中的慣用法。
由于Elixir的目的是增強(qiáng)Erlang,所以我在做設(shè)計(jì)決定時(shí)經(jīng)常向Erlang的語法和語義靠攏,這樣就可以幫助開發(fā)者更好地融入生態(tài)圈。
CSDN:我們知道一種語言的成熟可能需要經(jīng)歷漫長的過程。在設(shè)計(jì)的過程中,哪些部分你用心最多?
José Valim:設(shè)計(jì)一種編程語言,對(duì)耐心的考驗(yàn)比努力更多。首先你需要明確一系列目標(biāo),然后在你希望語言發(fā)展的方向上寬廣地推進(jìn),給你自己和語言都留出更多時(shí)間,然后觀察這些目標(biāo)之間如何演進(jìn)與調(diào)和。
倘若你試圖一蹴而就,或者不對(duì)未來做打算,不為演進(jìn)留出空間,就將得到一種不一致的語言——也許能實(shí)現(xiàn)所有目標(biāo),但這些目標(biāo)之間卻齟齬相抵。
CSDN:請(qǐng)給我們?cè)敿?xì)談?wù)凟lixir的設(shè)計(jì)目標(biāo)。
José Valim:Elixir的設(shè)計(jì)目標(biāo)可以概括為兼容性、高效率和擴(kuò)展性這幾部分。
之前已談到兼容Erlang VM是Elixir的目標(biāo)之一,當(dāng)我們談到Erlang這個(gè)詞,可以將它分解為下面三部分:
一種函數(shù)式編程語言Erlang;
一系列設(shè)計(jì)原則,稱為OTP;
Erlang虛擬機(jī),稱為EVM或BEAM。
Elixir與Erlang運(yùn)行在同一種虛擬機(jī)上,并兼容OTP。不僅如此,所有Erlang生態(tài)系統(tǒng)中使用的工具和庫,Elixir也能使用,因?yàn)樵贓rlang中調(diào)用Elixir沒有任何性能代價(jià),反過來也是如此。
所有Elixir代碼在輕量級(jí)進(jìn)程中運(yùn)行,包含自己的狀態(tài),用于彼此交換信息。Erlang VM將這些進(jìn)程分配到多個(gè)處理器核心中,使代碼可以輕松地并行執(zhí)行。
如果你編譯Elixir代碼,會(huì)發(fā)現(xiàn)CPU中的所有核心都在開動(dòng)。當(dāng)像Parallella這種技術(shù)變得更容易獲取且成本更低廉時(shí),你很難忽視Erlang VM所能提供的強(qiáng)大能力。未來Erlang VM將會(huì)被用來搭建能永久運(yùn)行、能自我修復(fù)和擴(kuò)展的系統(tǒng)。
效率很難測量,能高效開發(fā)桌面應(yīng)用的編程語言卻可能在數(shù)學(xué)運(yùn)算領(lǐng)域捉襟見肘,它與你期望從事的領(lǐng)域、生態(tài)圈中的可用工具,以及是否能方便地創(chuàng)造和擴(kuò)展這些工具有關(guān)。
基于這種原因,我們選擇了簡約的語言核心。在許多編程語言中,if、case、try這些關(guān)鍵詞都需要專門的語法分析器,而Elixir中只有宏。這樣做的好處之一是,開發(fā)者可以自己擴(kuò)展語言,以適應(yīng)他們自己的工作領(lǐng)域。宏還是Elixir元編程的構(gòu)建基礎(chǔ):具備通過代碼生成代碼的能力,令開發(fā)者能擺脫煩瑣的工作,創(chuàng)造出更強(qiáng)大的工具。
宏也對(duì)語法有巨大的影響,前面已經(jīng)提到。盡管許多關(guān)于語言的話題一開始就會(huì)討論語法,但在Elixir身上,從未將“簡單地提供另一種不同語法”作為它的目標(biāo)。
盡管基于簡潔的語言核心,開發(fā)者可以構(gòu)建和擴(kuò)展針對(duì)自己領(lǐng)域的語言。但Elixir還繼承了擅長并行和分布式應(yīng)用的特點(diǎn)。在這些領(lǐng)域,Elixir補(bǔ)充了下面一些標(biāo)準(zhǔn)庫:
Unicode字符串和相應(yīng)的操作;
強(qiáng)大的單元測試框架;
更多數(shù)據(jù)類型;
多態(tài)記錄;
嚴(yán)格和惰性枚舉API;
便于腳本操作的函數(shù),例如路徑和文件系統(tǒng);
一些用于編譯和測試Elixir代碼的項(xiàng)目管理工具。
此外,還有更多庫、模塊、協(xié)議等便于擴(kuò)展的特性。
以源碼為良師
CSDN:你都是通過哪些方式提高編程技能?
José Valim:我的閱讀量很大。既讀書,也閱讀其他開發(fā)者的代碼。我覺得每個(gè)人都不應(yīng)該畏懼自己所使用項(xiàng)目的源代碼。當(dāng)然,我也通過在現(xiàn)實(shí)問題中實(shí)踐來提高自己。
CSDN:Elixir的名字有典故嗎?
José Valim:我很希望有,不過很可惜,這個(gè)名字其實(shí)沒有特別的出處。
CSDN:Elixir已足夠成熟,可以用于生產(chǎn)環(huán)境嗎?
José Valim:Elixir確實(shí)已可以用于生產(chǎn)環(huán)境了,已有開發(fā)者和公司將它應(yīng)用到了產(chǎn)品中。不過,Elixir社區(qū)的發(fā)展速度很快,所以開發(fā)者還需要跟上語言發(fā)展的步伐。
CSDN:在設(shè)計(jì)和發(fā)展Elixir的過程中,你有哪些經(jīng)驗(yàn)可以與讀者分享?
José Valim:我最喜歡的一條建議是“Use the source, Luke!”(《星球大戰(zhàn)》中的一句話)。閱讀你所使用的工具和項(xiàng)目的源代碼會(huì)讓你變成更好的程序員,也會(huì)讓你更好地理解它們,還會(huì)讓你對(duì)在社區(qū)中貢獻(xiàn)更近一步。公開軟件的源代碼是一件美好的事情,它曾經(jīng)(也依然)是我最重要的老師。