Scala(發音為/ˈskɑːlə, ˈskeɪlə/)是一門多範式的程式語言,設計初衷是要整合物件導向程式設計和函數式程式設計的各種特性。[8]
編程範型 | 多範式:函數式,物件導向,指令式 |
---|---|
設計者 | Martin Odersky |
實作者 | 洛桑聯邦理工學院編程方法實驗室 |
面市時間 | 2004年1月20日 |
目前版本 |
|
型態系統 | 靜態,強,型別推斷, 結構化 |
實作語言 | Scala |
系統平台 | JVM、JavaScript[2]、LLVM(實驗性)[3] |
授權條款 | 3句版BSD授權條款[4] |
副檔名 | .scala, .sc |
網站 | www |
啟發語言 | |
Eiffel, Erlang, Haskell,[5] Java,[6] Lisp,[7] Pizza,[8] Standard ML,[6] OCaml,[6] Scheme,[6] Smalltalk, Oz | |
影響語言 | |
Ceylon, Fantom, F#, Kotlin, Lasso, Red, Swift[來源請求] | |
平台和授權條款
Scala執行於Java平台(Java虛擬機器),併兼容現有的Java程式。它也能執行於CLDC組態的Java ME中。曾經有過另一.NET平台的實現[9],不過該版本已被放棄。[10]
Scala的編譯模型(獨立編譯,動態類載入)與Java和C#一樣,所以Scala代碼可以呼叫Java類別庫(對於.NET實現則可呼叫.NET類別館)。
歷史
洛桑聯邦理工學院的Martin Odersky於2001年基於Funnel的工作開始設計Scala。Funnel是把函數式程式設計思想和佩特里網相結合的一種程式語言。[12] Odersky之前工作於Java泛型和javac。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的軟體
特性
Scala是一種純物件導向的語言,每個值都是對象。對象的資料類型以及行為由類別和特質描述。類抽象機制的擴充有兩種途徑。一種途徑是子類繼承,另一種途徑是靈活的混入機制。這兩種途徑能避免多重繼承的種種問題。
Scala也是一種函數式語言,其函式也能當成值來使用。Scala提供了輕量級的語法用以定義匿名函式,支援高階函式,允許巢狀多層函式,並支援柯里化。Scala的case class及其內建的模式匹配相當於函數式程式設計語言中常用的代數型別。
更進一步,程式設計師可以利用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具備型別系統,通過編譯時檢查,保證代碼的安全性和一致性。型別系統具體支援以下特性:
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代碼的一些方式:
- ScalaTest(頁面存檔備份,存於網際網路檔案館)
- ScalaCheck(頁面存檔備份,存於網際網路檔案館),類似於Haskell的QuickCheck(頁面存檔備份,存於網際網路檔案館)的庫
- specs(頁面存檔備份,存於網際網路檔案館),用於Scala的行為驅動的開發工具庫
- JUnit
內建的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.