曾經(jīng)有人問(wèn)Java的創(chuàng)始人高斯林這樣一個(gè)問(wèn)題,“除了Java語(yǔ)言以外,您現(xiàn)在還使用JVM平臺(tái)上的哪種編程語(yǔ)言?”他毫不猶豫的說(shuō)是Scala。
Scala到底是什么?
在目前眾多的JVM語(yǔ)言當(dāng)中,Scala無(wú)疑是最引人注意的語(yǔ)言之一。Scala是一個(gè)靜態(tài)語(yǔ)言,更適合大型工程項(xiàng)目,
Scala直接編譯成Java字節(jié)碼,
性能接近Java。Scala是一個(gè)多范式的語(yǔ)言,你可以混合使用函數(shù)式和
面向?qū)ο?/a>
編程,混合使用可變類和不變類,混合使用Actor和傳統(tǒng)的Java并發(fā)庫(kù)。
短短一個(gè)月的時(shí)間,Scala于本月沖進(jìn)了TIOBE的前五十名。一個(gè) Twitter 的開(kāi)發(fā)人員說(shuō)過(guò),Scala 將會(huì)成為現(xiàn)代 Web2.0 的發(fā)起語(yǔ)言。LinkedIn 也用這種語(yǔ)言。同樣許多其他大的公司如 Sony Picture, EDF, SAP 也開(kāi)始使用這種語(yǔ)言。為什么Scala發(fā)展這么迅猛,可以獲得如此熱烈的社區(qū)支持。
曾冠東還表示,Scala不是Java的殺手,它無(wú)法取代Java的地位,也突破不了JVM的限制、Java實(shí)現(xiàn)不了的功能它也實(shí)現(xiàn)不了。我們可以將Scala形象的理解成大量語(yǔ)法糖的Java。 Scala 開(kāi)發(fā)團(tuán)隊(duì)發(fā)布了最新的2.9.2穩(wěn)定版本,Scala 語(yǔ)言的特性有許多,例如
高階函數(shù)
和對(duì)象、抽象類型綁定,actor 使得函數(shù)在 Scala 中能是一個(gè)子類成為可能,Scala 中的設(shè)計(jì)模式使得面向?qū)ο?/a>
和函數(shù)編程無(wú)縫結(jié)合。Akka 是一個(gè)用 Scala 編寫(xiě)的庫(kù),用于簡(jiǎn)化編寫(xiě)容錯(cuò)的、高可伸縮性的 Java 和 Scala 的 Actor 模型應(yīng)用。它已經(jīng)成功運(yùn)用在電信行業(yè)。Spark 是一種可擴(kuò)展的數(shù)據(jù)分析平臺(tái),它整合了內(nèi)存計(jì)算的基元,因此,相對(duì)于 Hadoop 的
集群存儲(chǔ)
方法,它在性能方面更具優(yōu)勢(shì)。Spark 是在 Scala 語(yǔ)言中實(shí)現(xiàn)的,并且利用了該語(yǔ)言,為數(shù)據(jù)處理提供了獨(dú)一無(wú)二的環(huán)境。Scala 編譯器可以生成字節(jié)碼,直接運(yùn)行在使用JVM上。該語(yǔ)言(它實(shí)際上代表了可擴(kuò)展語(yǔ)言)被定義為可直接集成到語(yǔ)言中的簡(jiǎn)單擴(kuò)展。
Scala作為一門(mén)靜態(tài)語(yǔ)言,它的主要特性有哪些? ·
Scala是面向?qū)ο?/a>
的 Scala是一個(gè)純面向?qū)ο笳Z(yǔ)言,在某種意義上來(lái)講所有數(shù)值都是對(duì)象。對(duì)象的類型和行為是由class和trait來(lái)描述的。Class的抽象可由子類化和一種靈活的基于mixin的組合機(jī)制(它可作為
多重繼承的簡(jiǎn)單替代方案)來(lái)擴(kuò)展。 · Scala是函數(shù)式的
Scala還是一個(gè)函數(shù)式語(yǔ)言,在某種意義上來(lái)講所有函數(shù)都是數(shù)值。Scala為定義匿名函數(shù)提供了一種輕量級(jí)的語(yǔ)法,它支持高階(higher-order)函數(shù)、允許函數(shù)嵌套、支持局部套用(currying)。Scala的case類及其內(nèi)置支持的模式匹配模型代數(shù)類型在許多函數(shù)式編程語(yǔ)言中都被使用。
Scala是靜態(tài)類型的
Scala配備了一套富有表現(xiàn)力的類型系統(tǒng),該抽象概念以一種安全的和一致的方式被使用。
Scala是可擴(kuò)展的
Scala的設(shè)計(jì)承認(rèn)了實(shí)踐事實(shí),領(lǐng)域特定應(yīng)用開(kāi)發(fā)通常需要領(lǐng)域特定語(yǔ)言擴(kuò)展。Scala提供了一個(gè)獨(dú)特的語(yǔ)言組合機(jī)制,這可以更加容易地以類庫(kù)的形式增加新的語(yǔ)言結(jié)構(gòu): 任何方式可以被用作中綴(infix)或后綴(postfix)操作符閉包按照所期望的類型(目標(biāo)類型)自動(dòng)地被構(gòu)造 兩者結(jié)合使用可方便地定義新語(yǔ)句,無(wú)需擴(kuò)展語(yǔ)法,也無(wú)需使用類似宏的元編程工具。 · Scala可與Java和.NET進(jìn)行互操作
Scala設(shè)計(jì)時(shí)就考慮了與流行編程環(huán)境良好交互,如Java 2運(yùn)行時(shí)環(huán)境(JRE)和 .NET框架(CLR)。特別是與主流面向?qū)ο笳Z(yǔ)言,如Java和C#盡量無(wú)縫交互。Scala有像Java和C#一樣的編譯模型(獨(dú)立編譯,動(dòng)態(tài)裝載類),允許訪問(wèn)成千上萬(wàn)的高質(zhì)量類庫(kù)。
在并發(fā)性方面,與 Scala 在 .NET 領(lǐng)域中的姐妹語(yǔ)言 F# 相似,Scala 是針對(duì) “并發(fā)性問(wèn)題” 的解決方案之一,讓開(kāi)發(fā)人員能夠更加輕松地專注于問(wèn)題的實(shí)質(zhì),而不用考慮并發(fā)編程的低級(jí)細(xì)節(jié)。
Actor 編程模式讓高度并行應(yīng)用程序的開(kāi)發(fā)更加簡(jiǎn)單。
Scala把Erlang風(fēng)格的基于actor的并發(fā)帶進(jìn)了JVM。
我們可以利用Scala的actor模型在JVM上設(shè)計(jì)具伸縮性的并發(fā)應(yīng)用程序,以自動(dòng)獲得多核心處理器帶來(lái)的優(yōu)勢(shì),而不必依照復(fù)雜的Java線程模型來(lái)編寫(xiě)程序。
Scala 為并發(fā)性提供了兩種級(jí)別的支持,這與其他與 Java 相關(guān)的主題極為類似:
首先,對(duì)底層庫(kù)的完全訪問(wèn)(比如說(shuō) java.util.concurrent)以及對(duì) “傳統(tǒng)” Java 并發(fā)性語(yǔ)義的支持(比如說(shuō)監(jiān)控程序和wait()/notifyAll())。其次,這些基本機(jī)制上面有一個(gè)抽象層
Scala 提供了在穩(wěn)定的高性能平臺(tái)(Java 虛擬機(jī))上生成的能力同時(shí)也是一門(mén)敏捷性語(yǔ)言。
這一類型的語(yǔ)言也有其他的選擇,例如 Jython, JRuby, Groovy 和 Clojure, 但是這些都是運(yùn)行在 JVM 上的動(dòng)態(tài)類型語(yǔ)言。
Open Class 的效果讓大家會(huì)覺(jué)得Scala是動(dòng)態(tài)語(yǔ)言,但它是選擇隱式轉(zhuǎn)換來(lái)實(shí)現(xiàn)的,這也正好證明了Scala是靜態(tài)語(yǔ)言。
隱式轉(zhuǎn)換(Implicit conversion)使 Scala 具有類型安全性,正如擴(kuò)展方法(extension method)之于 C#,開(kāi)放類(open class)之于 ruby。
即:向未曾定義的類型添加方法(如字符串、列表、整數(shù))。這是使得 Scala 符合 DSL(特定領(lǐng)域語(yǔ)言)模型的特性之一。
Scala結(jié)合了面向?qū)ο蠛秃瘮?shù)編程的優(yōu)勢(shì),函數(shù)編程的一個(gè)好處就是你能夠像運(yùn)用一個(gè)數(shù)據(jù)那樣運(yùn)用函數(shù),可以用來(lái)定義真正高層級(jí)的庫(kù),或者去定義新的領(lǐng)域特殊語(yǔ)言(DSL)。
在談及Java與Scala的對(duì)比時(shí),曾冠東表示,Scala能調(diào)用絕大部分的Java,而Java調(diào)用Scala獨(dú)有的東西會(huì)比較難。Java 擁有非常強(qiáng)的概念規(guī)范,因此任何一個(gè) Java 程序之間具有非常多的相似之處,并且這樣能夠方便的進(jìn)行程序員交替。但是 Scala 并沒(méi)有這樣的統(tǒng)一性,因?yàn)檫@是一門(mén)很有表現(xiàn)力的語(yǔ)言。現(xiàn)場(chǎng)曾冠東為我們演示了實(shí)際案例,如下圖所示:
正所謂,金無(wú)足赤,人無(wú)完人。Scala對(duì)二進(jìn)制不兼容,語(yǔ)法也越來(lái)越復(fù)雜,不能突破Bytecode的限制、編譯速度有所緩慢。當(dāng)它被廣泛用于單元測(cè)試、開(kāi)發(fā)工具、Socket開(kāi)發(fā)、以及面對(duì)多核挑戰(zhàn)的并發(fā)應(yīng)用。總而言之,Scala是一種函數(shù)式面向?qū)ο笳Z(yǔ)言,它融匯了許多前所未有的特性,而同時(shí)又運(yùn)行于JVM之上。正如JRuby 創(chuàng)建者之一Charles Nutter 所宣稱的那樣Scala就是 Java 王位的合法繼承人。隨著開(kāi)發(fā)者對(duì)Scala的興趣日增,以及越來(lái)越多的工具支持,無(wú)疑Scala語(yǔ)言將成為廣大軟件工程師手上一件必不可少的工具。