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