Scala

typing = 靜態，強，型別推斷，influenced_by = Eiffel, Erlang, Haskell, Java, Lisp, , Standard ML, OCaml, Scheme, Smalltalk, Oz

influenced = , , F#, Kotlin, , , Swift

platform = JVM、JavaScript、LLVM（實驗性）

license = 3 句版 BSD 授權條款

website =

wikibooks = Scala

file_ext = .scala, .sc

}}

Scala是一門多正規化的程式語言，設計初衷是要整合面向物件程式設計和函數語言程式設計的各種特性。

平臺和許可證

Scala 運行於 Java 平臺（Java 虛擬機器），併兼容現有的 Java 程式。它也能運行於 CLDC 配置的 Java ME 中。曾經有過另一.NET 平臺的實現，不過該版本已被放棄。

Scala 的編譯模型（獨立編譯，動態類載入）與 Java 和 C# 一樣，所以 Scala 程式碼可以呼叫 Java 類庫（對於.NET 實現則可呼叫.NET 類庫）。

Scala 套件包括編譯器和類庫，以 BSD 許可證釋出。

歷史

洛桑聯邦理工學院的 Martin Odersky 於 2001 年基於的工作開始設計 Scala。Funnel 是把函數語言程式設計思想和佩特里網相結合的一種程式語言。 Odersky 之前工作於和 javac。Java 平臺的 Scala 於 2003 年底 / 2004 年初發布。.NET 平臺的 Scala 釋出於 2004 年 6 月。該語言第二個版本，v2.0，釋出於 2006 年 3 月。

Scala 2.8 的特性包括重寫的 Scala 容器庫、命名引數和預設引數、包物件，以及 Continuation.

2012 年 1 月，釋出版本 2.9.1。

2012 年 4 月，釋出版本 2.9.2。

使用 Scala 的軟體

2009 年 4 月，Twitter 宣佈他們已經把大部分後端程式從 Ruby 遷移到 Scala，其餘部分也打算要遷移。
已經公開宣稱，其整個平臺都已經是基於 Scala 基礎設施編寫的。
瑞銀集團把 Scala 用於一般產品中。
Coursera 把 Scala 作為伺服器語言使用。
多鄰國，一個線上的免費語言學習平臺，使用 Scala 編寫。

特性

4.1 支援的程式設計正規化

4.1.1 面向物件特性

Scala 是一種純面向物件的語言，每個值都是物件。物件的資料型別以及行為由類和特質描述。類抽象機制的擴充套件有兩種途徑。一種途徑是子類繼承，另一種途徑是靈活的混入機制。這兩種途徑能避免多重繼承的種種問題。

4.1.2 函數語言程式設計

Scala 也是一種函式式語言，其函式也能當成值來使用。Scala 提供了輕量級的語法用以定義匿名函式，支援高階函式，允許巢狀多層函式，並支援柯里化。Scala 的 case class 及其內建的模式匹配相當於函數語言程式設計語言中常用的。

更進一步，程式設計師可以利用 Scala 的模式匹配，編寫類似正則表示式的程式碼處理 XML 資料。在這些情形中，列表推導式功能對編寫公式化查詢非常有用。

由於 JVM 不支援尾呼叫，Scala 也不能完全支援尾呼叫最佳化。不過，Scala 編譯器可以把某些簡單的尾遞迴最佳化成迴圈。

以下程式碼以函式式風格實現了快速排序演算法，可以與 Erlang 快速排序的例子做個比較：

def qsort (list: ListInt): ListInt = list match {case Nil => Nil

case pivot :: tail =>

val (smaller, rest) = tail.partition (_

4.2 靜態型別

Scala 具備型別系統，透過編譯時檢查，保證程式碼的安全性和一致性。型別系統具體支援以下特性：

泛型類別，
協變和逆變，
，
型別引數的上下限約束，
把類別和抽象型別作為物件成員，
複合型別，
引用自己時顯式指定型別，
檢視，
多型方法。

4.3 擴充套件性

Scala 的設計秉承一項事實，即在實踐中，某個領域特定的應用程式開發往往需要特定於該領域的語言擴充套件。Scala 提供了許多獨特的語言機制，可以以庫的形式輕易無縫新增新的語言結構：

任何方法可用作字首或字尾運算子，
可以根據預期型別自動構造閉包。

聯合使用以上兩個特性，使你可以定義新的語句而無須擴充套件語法也無須使用宏之類的超程式設計特性。

4.4 併發性

Scala 使用演員模型作為其併發模型，Actor 是類似執行緒的實體，透過郵箱發收訊息。Actor 可以複用執行緒，因此可以在程式中可以使用數百萬個 Actor, 而執行緒只能建立數千個。在 2.10 之後的版本中，使用 Akka 作為其預設 Actor 實現。

以下程式碼是使用 Actor 模式的 EchoServer 實現

val echoServer = actor (new Act {

become {case msg => println ("echo" + msg)

}

})

echoServer ! "hi"

Actor 模式可以簡化併發程式設計，好利用多核 CPU 的能力。

使用 Scala 的框架

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

Hello World 範例

以下是用 Scala 編寫的典型 Hello World 程式：

object HelloWorld extends App {println ("Hello, world!")

}

或

object HelloWorld {def main (args: ArrayString) {println ("Hello, world!")

}

}

請注意它與 Java 的 Hello World 應用程式有哪些相似之處。一處顯著區別在於，Scala 版的 Hello World 程式不透過 static 關鍵字把 main 方法標記為靜態方法，而是用 object 關鍵字建立了單件。

假設該程式儲存為 HelloWorld.scala 檔案，接下來可以透過以下命令列進行編譯：

> scalac HelloWorld.scala

若要執行：

> scala -classpath . HelloWorld

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

直接使用 Scala 直譯器也可以執行該程式，使用選項 - i（從檔案載入程式碼）和選項 - e（若要執行額外的程式碼，就得實際執行 HelloWorld 物件的方法）即可：

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

測試

以下是測試 Scala 程式碼的一些方式：

ScalaTest
ScalaCheck，類似於 Haskell 的 QuickCheck 的庫
specs，用於 Scala 的行為驅動的開發工具庫
JUnit

內建的 Scala 庫 SUnit 已經不贊成使用，已在 2.8.0 版中移除。

圖書

Programming in Scala (ISBN 978-0-9815316-0-1) - A comprehensive step-by-step guide by , Lex Spoon, and Bill Venners.

Beginning Scala (ISBN 978-1-4302-1989-7) - A down–to–earth approach to teaching Scala by David Pollak.

Programming Scala (ISBN 978-1-934356-31-9) - Creating highly scalable, highly concurrent applications on the Java platform by Venkat Subramaniam.

Programming Scala (ebook)