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之前工作於Generic Java和javac。Java平臺的Scala於2003年底/2004年初發布。.NET平臺的Scala發佈於2004年6月。該語言第二個版本，v2.0，發佈於2006年3月。
Scala 2.8的特性包括重寫的Scala容器庫、命名參數和默認參數、-{zh-hans:包對象; zh-hant:套件物件}-，以及Continuation.
2012年1月，發佈版本2.9.1。
2012年4月，發佈版本2.9.2。

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

**特性**

**支持的編程範式**

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

**函數式編程**
Scala也是一種函數式語言，其函數也能當成值來使用。Scala提供了輕量級的語法用以定義匿名函數，支持高階函數，允許嵌套多層函數，並支持柯里化。Scala的case class及其內置的模式匹配相當於函數式編程語言中常用的Algebraic type。
更進一步，程序員可以利用Scala的模式匹配，編寫類似正則表達式的代碼處理XML數據。在這些情形中，列表推導式功能對編寫公式化查詢非常有用。
由於JVM不支持尾調用，Scala也不能完全支持尾調用最佳化。不過，Scala編譯器可以把某些簡單的尾遞歸最佳化成循環。
以下代碼以函數式風格實現了快速排序算法，可以與Erlang快速排序的例子做個比較：
def qsort(list: ListInt): ListInt = list match {
case Nil => Nil
case pivot :: tail =>
val(smaller, rest) = tail.partition(_ 

**靜態類型**
Scala具備類型系統，通過編譯時檢查，保證代碼的安全性和一致性。類型系統具體支持以下特性：
*泛型類別，
*協變和逆變，
*Annotation，
*類型參數的上下限約束，
*把類別和抽象類型作為對象成員，
*複合類型，
*引用自己時顯式指定類型，
*視圖，
*多態方法。

**擴展性**
Scala的設計秉承一項事實，即在實踐中，某個領域特定的應用程序開發往往需要特定於該領域的語言擴展。Scala提供了許多獨特的語言機制，可以以庫的形式輕易無縫添加新的語言結構：
*任何方法可用作前綴或後綴操作符，
*可以根據預期類型自動構造閉包。
聯合使用以上兩個特性，使你可以定義新的語句而無須擴展語法也無須使用宏之類的元編程特性。

**併發性**
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代碼的一些方式：- ScalaTestdate=20090722083651 - ScalaCheckdate=20140201213917 ，類似於Haskell的 QuickCheckdate=20090830043351 的庫- specsdate=20090927151609 ，用於Scala的行為驅動的開發工具庫
*JUnit
內置的Scala庫SUnit已經不贊成使用，已在2.8.0版中移除。

**參考文獻**

**圖書**
  Programming in Scaladate=20090719003351 (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)date=20100310121405 

**外部鏈接**
  Scala websitedate=20100705234019 -  Scalachinadate=20131224111911 -  Scala Tour,開源Scala指南 - Scala教學date=20200630231143