Scala

Scala（ˈskɑːlə, ˈskeɪlə）是一門多範式的程式語言，設計初衷是要整合面向對象編程和函數式編程的各種特性。

## 平台和許可證

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

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

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

## 歷史

洛桑聯邦理工學院的Martin Odersky於2001年基於Funnel (並行計算)的工作開始設計Scala。Funnel是把函數式編程思想和佩特里網相結合的一種程式語言。Odersky之前工作於Java泛型和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，其餘部分也打算要遷移。
- Wattzon已經公開宣稱，其整個平台都已經是基於Scala基礎設施編寫的。
- 瑞銀集團把Scala用於一般產品中。
- Coursera把Scala作為伺服器語言使用。
- 多鄰國，一個線上的免費語言學習平台，使用 Scala編寫。

## 特性

### 支持的編程範式

#### 面向對象特性

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

#### 函數式編程

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

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

由於JVM不支持尾調用，Scala也不能完全支持尾調用最佳化。不過，Scala編譯器可以把某些簡單的尾遞歸最佳化成循環。

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

```scala
def qsort(list: List[Int]): List[Int] = list match {
  case Nil => Nil
  case pivot :: tail =>
    val(smaller, rest) = tail.partition(_ < pivot)
    qsort(smaller) ::: pivot :: qsort(rest)
}
```

### 靜態類型

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

- 泛型類別。
- 協變和逆變。
- 標註。
- 類型參數的上下限約束。
- 把類別和抽象類型作為對象成員。
- 複合類型。
- 引用自己時顯式指定類型。
- 視圖。
- 多態方法。

### 擴展性

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

- 任何方法可用作前綴或後綴操作符。
- 可以根據預期類型自動構造閉包。

聯合使用以上兩個特性，使你可以定義新的語句而無須擴展語法也無須使用宏之類的元編程特性。

### 並發性

Scala使用演員模型作為其並發模型，Actor是類似線程的實體，通過郵箱發收消息。Actor可以復用線程，因此可以在程序中可以使用數百萬個Actor,而線程只能創建數千個。在2.10之後的版本中，使用Akka作為其默認Actor實現。

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

```scala
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程式：

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

或

```scala
 object HelloWorld {
   def main(args: Array[String]) {
     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 Martin Odersky, 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)

## 基本資料

- 編程范型：多範式：函數式，面向對象，指令式
- 發行時間：2004年1月20日
- 設計者：Martin Odersky
- 開發者：洛桑聯邦理工學院編程方法實驗室
- 軟體版本週期：3.8.4
- 類型系統：靜態，強，類型推斷, 結構化類型系統
- 受影響於：Eiffel, Erlang, Haskell, Java, Lisp, Pizza (程式語言), Standard ML, OCaml, Scheme, Smalltalk, Oz
- 施影響於：Ceylon (程式語言), Fantom (程式語言), F#, Kotlin, Lasso (程式語言), Red (程式語言), Swift
- 平台：JVM、JavaScript、LLVM（實驗性）
- 許可證：3句版BSD授權條款
- 文件擴展名：.scala, .sc