Scala(發音為/ˈskɑːlə, ˈskeɪlə/)是一門多範式的程式語言,設計初衷是要整合物件導向程式設計和函數式程式設計的各種特性。[8]

Quick Facts 編程範型, 設計者 ...
Scala
Thumb
編程範型多範式函數式物件導向指令式
設計者Martin Odersky英語Martin Odersky
實作者洛桑聯邦理工學院編程方法實驗室
釋出時間2004年1月20日,​20年前​(2004-01-20
目前版本
  • 3.5.0 (2024年8月22日;穩定版本)[1]
編輯維基數據連結
型態系統靜態型別推斷, 結構化英語Structural type system
實作語言Scala
系統平台JVMJavaScript[2]LLVM(實驗性)[3]
特許條款3句版BSD特許條款[4]
副檔名.scala, .sc
網站www.scala-lang.org
啟發語言
Eiffel, Erlang, Haskell,[5] Java,[6] Lisp,[7] Pizza英語Pizza (programming language),[8] Standard ML,[6] OCaml,[6] Scheme,[6] Smalltalk, Oz
影響語言
Ceylon英語Ceylon (programming language), Fantom英語Fantom (programming language), F#, Kotlin, Lasso英語Lasso (programming language), Red英語Red (programming language), Swift[來源請求]
Close

平台和特許條款

Scala執行於Java平台Java虛擬機器),併兼容現有的Java程式。它也能執行於CLDC組態的Java ME中。曾經有過另一.NET平台的實現[9],不過該版本已被放棄。[10]

Scala的編譯模型(獨立編譯,動態類載入)與JavaC#一樣,所以Scala代碼可以呼叫Java類別庫(對於.NET實現則可呼叫.NET類別館)。

Scala套件包括編譯器和類別館,以BSD特許條款釋出。[11]

歷史

洛桑聯邦理工學院的Martin Odersky於2001年基於Funnel英語Funnel (concurrent computing)的工作開始設計Scala。Funnel是把函數式程式設計思想和佩特里網相結合的一種程式語言。[12] Odersky之前工作於Java泛型英語Generic Javajavac。Java平台的Scala於2003年底/2004年初釋出。[12].NET平台的Scala釋出於2004年6月。[8][12][13]該語言第二個版本,v2.0,釋出於2006年3月。[8]

Scala 2.8的特性包括重寫的Scala容器庫、命名參數和預設參數、套件物件,以及Continuation.[14]

2012年1月,釋出版本2.9.1。

2012年4月,釋出版本2.9.2。

使用Scala的軟件

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

特性

支援的編程範式

物件導向特性

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

函數式程式設計

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

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

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

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

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具備型別系統,通過編譯時檢查,保證代碼的安全性和一致性。型別系統具體支援以下特性:

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

擴充性

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

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

聯合使用以上兩個特性,使你可以定義新的陳述式而無須擴充語法也無須使用宏之類的元程式設計特性。

並行性

Scala使用演員模型作為其並行模型,Actor是類似線程的實體,通過郵箱發收訊息。Actor可以復用線程,因此可以在程式中可以使用數百萬個Actor,而線程只能建立數千個。在2.10之後的版本中,使用Akka作為其預設Actor實現。[20] 以下代碼是使用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: 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代碼的一些方式:

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

參考文獻

圖書

外部連結

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.