Scala

Scala

Scala即可伸縮的語言(Scalable Language),是一種多範式的程式語言,類似於JAVA[JAVA開發]的編程,設計初衷是要集成面向對象編程和函式式編程的各種特性。Scala的編譯模型(獨立編譯,動態類載入)與Java和C#一樣,所以Scala代碼可以調用Java類庫(對於.NET實現則可調用.NET類庫) 。Scala和Groovy之間的核心區別在於前者是靜態類型的。ScalaTest ScalaCheck,類似於Haskell的QuickCheck的一個庫specs,一個用於Scala的行為驅動的開發工具庫JUnit內置的Scala庫SUnit已經不贊成使用,將會在2.8.0版中移除,見SUnit文檔。

基本信息

簡介

ScalaScala
Scala程式語言抓住了很多開發者的眼球。如果你粗略瀏覽Scala的網站,你會覺得Scala是一種純粹的面向對象程式語言,而又無縫地結合了命令式和函式式的編程風格。Christopher Diggins認為:

不太久之前程式語言還可以毫無疑義地歸類成“命令式”或者“函式式”。Scala代表了一個新的語言品種,它抹平了這些人為劃分的界限。

根據David Rupp在部落格中的說法,Scala可能是下下一代Java。這么高的評價讓人不禁想看看它到底是什麼東西。

Scala有幾項關鍵特性表明了它的面向對象的本質。例如,Scala中的每個值都是一個對象,包括基本數據類型(即布爾值、數字等)在內,連函式也是對象。另外,類可以被子類化,而且Scala還提供了基於mixin的組合(mixin-based composition)。

與只支持單繼承的語言相比,Scala具有更廣泛意義上的類重用。Scala允許定義新類的時候重用“一個類中新增的成員定義(即相較於其父類的差異之處)”。Scala稱之為mixin類組合。

Scala還包含了若干函式式語言的關鍵概念,包括高階函式(Higher-Order Function)、局部套用(Currying)、嵌套函式(Nested Function)、序列解讀(Sequence Comprehensions)等等。

Scala是靜態類型的,這就允許它提供泛型類內部類、甚至多態方法(Polymorphic Method)。另外值得一提的是,Scala被特意設計成能夠與Java和.NET互操作。Scala當前版本還不能在.NET上運行(雖然上一版可以-_-b),但按照計畫將來可以在.NET上運行。

Scala可以與Java互操作。它用scalac這個編譯器源檔案編譯成Java的class檔案(即在JVM上運行的位元組碼)。你可以從Scala中調用所有的Java類庫,也同樣可以從Java應用程式中調用Scala的代碼。用David Rupp的話來說,

它也可以訪問現存的數之不盡的Java類庫,這讓(潛在地)遷移到Scala更加容易。

這讓Scala得以使用為Java1.4、5.0或者6.0編寫的巨量的Java類庫和框架,Scala會經常性地針對這幾個版本的Java進行測試。Scala可能也可以在更早版本的Java上運行,但沒有經過正式的測試。Scala以BSD許可發布,並且數年前就已經被認為相當穩定了。

說了這么多,我們還沒有回答一個問題:“為什麼我要使用Scala?”Scala的設計始終貫穿著一個理念:

創造一種更好地支持組件的語言。(《The Scala Programming Language》,Donna Malayeri)

也就是說軟體應該由可重用的部件構造而成。Scala旨在提供一種程式語言,能夠統一和一般化分別來自面向對象和函式式兩種不同風格的關鍵概念。

借著這個目標與設計,Scala得以提供一些出眾的特性,包括:

* 面向對象風格

* 函式式風格

* 更高層的並發模型

ScalaScala
Scala把Erlang風格的基於actor的並髮帶進了JVM。開發者可以利用Scala的actor模型在JVM上設計具伸縮性的並發應用程式,它會自動獲得多核心處理器帶來的優勢,而不必依照複雜的Java執行緒模型來編寫程式。

* 輕量級的函式語法

o 高階

o 嵌套

o 局部套用(Currying)

o 匿名

* 與XML集成

o 可在Scala程式中直接書寫XML

o 可將XML轉換成Scala類

* 與Java無縫地互操作

Scala的風格和特性已經吸引了大量的開發者,比如Debasish Ghosh就覺得:

我已經把玩了Scala好一陣子,可以說我絕對享受這個語言的創新之處。

總而言之,Scala是一種函式式面向對象語言,它融匯了許多前所未有的特性,而同時又運行於JVM之上。隨著開發者對Scala的興趣日增,以及越來越多的工具支持,無疑Scala語言將成為你手上一件必不可少的工具。

Scala與Groovy的對比

一篇名為“Scala,Groovy的殺手? ”的部落格對Scala和Groovy進行了對比:

Scala和Groovy之間的核心區別在於前者是靜態類型的。有些人可能爭辯說這使得達到腳本化目標變得更加複雜了,而腳本化正是Groovy的動機。然而,Scala有完整的體系特徵,這使Groovy看上去更像個玩具。比如,Scala有“sequence comprehensions”。該要素導致對算法的表述非常緊湊和強大。

Scala還有更多被證明是非常有用的特性,如嵌套類,currying和代數類型模式匹配。它還支持類似於JDK1.5所增加的泛型和註解。這些還都只是冰山一角。

之後,Derek Young撰文“Scala對比Groovy:靜態類型是性能的關鍵”。在文中他舉了一個實際的例子,試圖說明針對同樣的算法,Scala的性能遠高於Groovy。

然而,Scala並不是盡善盡美的,它也有一些明顯的缺陷。Rick Hightower在發表的一篇部落格中,尖銳地批評了Scala的語法問題:

Scala並不是更好的選擇。在閱讀了Scala的文檔之後,我的想法是:雖然這種語言的特性聽起來挺好,但是語法卻讓我想放棄。為什麼事情非要為了不同而不同?Scala讓Groovy看起來比以前更加美味可口。

憎恨是個很強烈的詞。我恨Scala的語法。請不要再推進這種語法了。……Scala有好的思想嗎?有。借用過來就行了……

總而言之,Scala看起來像下一個被過度宣傳的語言。只需要把其精華引入到Groovy中,然後扔掉那些糟糕的語法。我最喜歡的Scala特性是推理類型和強類型。C#3.0也有這些。(我不用C#,不見得我不喜歡它的一些特性。)

Rick Hightower還建議Sun應該在Groovy上進行投資,而不是對JRuby作無謂的投資。

Groovy更像Java,更容易上手,語法也讓開發者不反感。為什麼Sun在JRuby上投那么多錢呢?

投資應該給Groovy。這樣了解Java的開發者可以更快地學習Groovy,而且如果有工具支持他們,那么就更可能這樣做。

為了說明Sun投資在Ruby上的不明智,Rick Hightower還引用了一幅統計圖表來說明企業採用Ruby的趨勢還是比較低的:

另外,無論是Ruby、Scala還是Groovy都有對應的Web框架,且對應的框架都是用各自對應的語言編寫的。這些框架分別是Rails、Lift和Grails。儘管Lift和Grails中的許多東西都從Rails借鑑來的,但是Grails對其他已有Java技術框架進行了很好的繼承,這無疑會保護用戶或廠商在這方面的已有投資。Grails框架參考文檔中這樣描述:

Grails構建在這些概念之上,並且顯著地減少了在Java平台上構建Web套用的複雜程度。不同的是,這些是建立在已確立的如Spring和Hibernate這樣的Java技術之上的。

Scala和Groovy兩種語言都在快速發展的過程中。就情況來看,Groovy的優勢在於易用性以及與Java無縫銜接,Scala的優勢在於性能和一些高級特性,如果在發展過程中兩者能互相借鑑對方的優點來充實自身,對開發者來講無疑是福音。正如第一篇所引用的部落格作者最後提到的那樣:

大家並不想看到一場殊死鬥爭,而是想看到更注重實效思想的Groovy團隊能與更具有學術思想的Scala團隊一起合作,製作出一門既強大又易用的語言。

你會將賭注押在誰身上呢?

Scala 發音為 /ˈskɑːlə, ˈskeɪlə/)是一種多範式的程式語言,設計意圖是要集成面向對象編程和函式式編程的各種特性。

技巧

1、不要陷入C++一樣的、不斷膨脹的問題里,留下太多的選擇,且沒有清晰的最佳實踐。這導致每個人都在選擇不同的子集。要提供適應的指導。

2、記住,反對不良的設計功能與增加新功能同等重要。這很殘酷。

3、考慮拆分語言為產生環境創建可行的標準。為學術世界節省成本是一個明智的選擇。迎合企業的需要,獲得更大的採用。

4、庫的編寫者應該看看Java API,確認是否應該有功能調用或結構化功能,為了更好的閱讀。不要為了流動性在跳躍太大來與Ruby競爭。

5、最後,當人們提出的建設性的批評時,不要感到失望。如果同樣的報怨不斷出現,那就說明應該重視一下。

平台和許可證

Scala運行於Java平台(Java虛擬機),併兼容現有的Java程式。它也能運行於Java ME, CLDC(Java Platform, Micro Edition Connected Limited Device Configuration)上。還有另一.NET平台的實現,不過該版本更新有些滯後。

Scala的編譯模型(獨立編譯,動態類載入)與Java和C#一樣,所以Scala代碼可以調用Java類庫(對於.NET實現則可調用.NET類庫) 。

Scala包中包含了編譯器和類庫,以BSD許可證發布。

發展歷史

聯邦理工學院洛桑(EPFL)的Martin Odersky於2001年基於Funnel的工作開始設計Scala。Funnel是把函式式編程思想和Petri網相結合的一種程式語言。Odersky先前的工作是Generic Java和javac(Sun Java編譯器)。Java平台的Scala於2003年底/2004年初發布。.NET平台的Scala發布於2004年6月。該語言第二個版本,v2.0,發布於2006年3月。

截至2009年9月,最新版本是版本2.7.6 。Scala 2.8預計的特性包括重寫的Scala類庫(Scala collections library)、方法的命名參數和默認參數、包對象(package object),以及Continuation.

2009年4月,Twitter宣布他們已經把大部分後端程式從Ruby遷移到Scala,其餘部分也打算要遷移。此外, Wattzon已經公開宣稱,其整個平台都已經是基於Scala基礎設施編寫的。

特性

面向對象特性

Scala是一種純面向對象的語言,每一個值都是對象。對象的數據類型以及行為由類和特徵(Trait)描述。類抽象機制的擴展有兩種途徑。一種途徑是子類繼承,另一種途徑是靈活的混入(Mixin)機制。這兩種途徑能避免多重繼承的種種問題。

函式式編程

Scala也是一種函式式語言,其函式也能當成值來使用。Scala提供了輕量級的語法用以定義匿名函式,支持高階函式,允許嵌套多層函式,並支持柯里化。Scala的Case Class及其內置的模式匹配相當於函式式程式語言中常用的代數類型(Algebraic Type)。

更進一步,程式設計師可以利用Scala的模式匹配,編寫類似正則表達式的代碼處理XML數據。在這些情形中,順序容器的推導式(comprehension)功能對編寫公式化查詢非常有用。

由於JVM不支持尾部遞歸,Scala也不能完全支持尾部遞歸最佳化。不過,在簡單的情況下,Scala編譯器可以把尾部遞歸最佳化成循環。

以下代碼以函式式風格實現了快速排序算法,可以與Erlang快速排序的例子做個比較:

def qsort(list: List[Int]): List[Int]=

list match{

case Nil => Nil

case pivot::tail =>

qsort(for(i <- tail if i < pivot)yield i)::: pivot :: qsort(for(i <- tail if i >= pivot)yield i)}

靜態類型

Scala是具備類型系統,通過編譯時的檢查,保證代碼的安全性和一致性。類型系統具體支持以下特性:

泛型類,型變注釋(Variance Annotation),類型繼承結構的上限和下限,把類別和抽象類型作為對象成員,複合類型,引用自己時顯式指定類型,視圖,多態方法。

擴展性

Scala的設計承認一個事實,即在實踐中,某個領域特定的應用程式開發往往需要特定於該領域的語言擴展。Scala提供了許多獨特的語言機制,可以以庫的形式輕易無縫添加新的語言結構:

任何方法可用作前綴或後綴操作符,可以根據預期類型自動構造閉包。聯合使用以上兩個特性,使你可以定義新的語句而無須擴展語法也無須使用宏之類的元編程特性。

使用Scala的框架

Lift是一個開源的Web套用框架,旨在提供類似Ruby on Rails的東西。因為Lift使用了Scala,所以Lift應用程式可以使用所有的Java庫和Web容器。

測試

以下是測試Scala代碼的一些方式:

ScalaTest ScalaCheck,類似於Haskell的QuickCheck的一個庫specs,一個用於Scala的行為驅動的開發工具庫JUnit內置的Scala庫SUnit已經不贊成使用,將會在2.8.0版中移除,見SUnit文檔。

範例

以下是用Scala編寫的典型的Hello Scala中文程式:

object HelloScalachina extends Application { println("Hello, Scala中文!")}

object HelloScalachina {def main(args: Array[String]){ println("Hello, Scala中文!")}}

請注意它與Java的Hello Scala中文應用程式有哪些相似之處。一個顯著區別在於,Scala版的Hello Scala中文程式沒有把任何東西標記為static,而是用object 關鍵字創建了一個單件。

假設該程式保存為HelloScalachina.scala檔案,接下來可以通過以下命令行進行編譯:

> scalac HelloScalachina.scala

若要運行:

> scala -classpath . HelloScalachina

這與編譯和運行Java的“Hello Scala中文”程式是不是很像呢?事實上,Scala的編譯和執行模型與Java是等效的,因而它也兼容於Java的構建工具,比如Ant.

直接使用Scala解釋器也可以運行該程式,使用選項-i (從檔案載入代碼)和選項-e (若要運行額外的代碼,就得實際執行HelloScalachina對象的方法)即可:

> scala -i HelloScalachina.scala -e 'HelloScalachina.main(null)'

相關詞條

相關搜尋

熱門詞條

聯絡我們