一位Twitter工程師的Scala探秘之旅
原創(chuàng)【51CTO精選譯文】本文的這個(gè)故事講述一個(gè)對(duì)編程語言有種近乎于宗教狂熱的Twitter工程師是如何投入Scala的懷抱的。一開始大量使用Ruby做為開發(fā)語言的Twitter曾遭遇過嚴(yán)重的性能問題,于是Twitter在尋找可擴(kuò)展性強(qiáng)的替代語言的時(shí)候,找到了Scala。
大家好,我是al3x,一位編程語言的癮君子,哦不,是狂熱份子。我在工作中使用過Java,JavaScript,C,PHP,Perl,Ruby以及Python。出于興趣和愛,接觸過x86 Assembly,Erlang,Lua,Objective-C,Lisp家族,Haskell,以及C++。
我為Twitter工作。Twitter一直以來都大量使用Ruby。Ruby很好,但不是都好。Ruby VM低下的性能,monkeypatching(51CTO編者注:猴子補(bǔ)丁,也稱鴨子擊,指對(duì)動(dòng)態(tài)語言運(yùn)行時(shí)進(jìn)行擴(kuò)展或修改,而無須更改源代碼的一個(gè)方法),以及文化上的問題,在大型項(xiàng)目中的使用還是充滿疑問。我們要建造新的服務(wù),感覺不想繼續(xù)用Ruby開發(fā)了。
對(duì)于Ruby的不滿,基本可以總結(jié)如下:
1)Ruby不太合適開發(fā)長(zhǎng)時(shí)間運(yùn)行(Long-Live)的服務(wù)器端程序,但JVM很合適,因?yàn)镴ava有10年的經(jīng)驗(yàn)教訓(xùn)和優(yōu)化,Scala是運(yùn)行在JVM上的,所以天生就有了這個(gè)優(yōu)點(diǎn);
2) Ruby沒有很好的線程(Thread)支持,Ruby多線程會(huì)限制在一個(gè)CPU上(新的Ruby應(yīng)該會(huì)改善這點(diǎn)吧)且Ruby VM的垃圾收集支持也沒有Java先進(jìn),就造成每個(gè)Ruby進(jìn)程長(zhǎng)時(shí)間運(yùn)行后使用的內(nèi)存月來越大;
3) 為什么不是JRuby? JRuby缺乏使用廣泛的Rem支持(很多優(yōu)秀的Ruby包都需要C擴(kuò)展,它們并沒有移植到Java),而且性能也不太理想,比MRI(C實(shí)現(xiàn)的Ruby VM)要慢
我心目中的系統(tǒng)語言白馬王子應(yīng)該是:
◆快速
◆函數(shù)式
◆表達(dá)能力
◆靜態(tài)類型
◆并發(fā)
◆優(yōu)美
◆輕量
我們列出的名單:C
C++
Python
Erlang
Java
JVM上的動(dòng)態(tài)語言
結(jié)果沒一個(gè)滿意的。它們都有自己的問題。我們最終想要一個(gè)不是Java的JVM語言。
后來,我們聽說了Scala。在JVM上幾乎沒有哪個(gè)語言的執(zhí)行速度趕得上它,而Scala lift-off看起來令人感到信心十足。
#p#
Scala的特性
不再糟糕的類型推斷。靜態(tài)類型一直是天使和惡魔的共存。在Scala中,在你真正使用它之前,你可以忽略對(duì)象的類型。
不變性:你可以在最開始用面向?qū)ο蟮姆椒ň幊?,然后?dāng)你需要它的好處時(shí),就可以遷移到用不變狀態(tài)(immutable state)。實(shí)現(xiàn)并發(fā)和異步就靠它了。這個(gè)功能需要在決策時(shí)更加深思熟慮,不過是值得的。
第一類函數(shù):我們是“類”的追隨者。這是個(gè)有了就無法失去的功能:你不僅可以定義函數(shù)和調(diào)用它們,還可以把函數(shù)寫成沒有名字的文本:literal并把它們像值:value那樣傳遞。一切都是表達(dá)式,一切都有值。
特征:是個(gè)奇特的東西,因?yàn)槔^承的未必是你想要的。一個(gè)類可以按照需要整合許多特征,這與接口相似,但它們還可包含行為,這又與類相似。同樣,與類和接口類似,特征可以引入新方法。
模式匹配與case類:其實(shí)每個(gè)程序員天天都在進(jìn)行模式匹配。Scala不過是令這個(gè)過程更簡(jiǎn)單了。
XML的處理大大的簡(jiǎn)化了。再怎么說XML技術(shù)還在廣泛的使用中,使用Scala來處理XML文件是相當(dāng)不錯(cuò)的選擇:有點(diǎn)那么些JavaScript+JSON的意思。
Actors:處理并發(fā)的一個(gè)好方法。Scala提供的這個(gè)叫做Actor的并行模型通過它的收件箱來發(fā)送和接收非同步信息,而不是共享數(shù)據(jù)。這種方式被稱為:shared nothing 模型。一旦你不再顧慮共享數(shù)據(jù)的問題,也就不必再為代碼同步和死鎖問題而頭痛。
還有上面這些其他的特性,這里就不細(xì)說了。51CTO的編輯在此推薦大家去Scala編程語言專題中進(jìn)行進(jìn)一步的學(xué)習(xí)。
范例
最后,給大家看看我們?cè)赥witter中用Scala編寫的代碼。
函數(shù)的使用:無論是array,類型系統(tǒng),值還是Singleton的語法,都和Ruby一樣簡(jiǎn)便。
Package,import,traits,currying,更多的類型系統(tǒng)。
當(dāng)然了,Scala也有不好的地方,比如社區(qū)太小,而且也偏復(fù)雜。不過總的來說,Scala絕對(duì)是一門值得學(xué)習(xí)的語言。
原文:Why Scala?
【相關(guān)閱讀】