本頁使用了標題或全文手工轉換

Scala

維基百科,自由的百科全書
前往: 導覽搜尋
Scala
編程範型 多範式函數式物件導向命令式
設計者 Martin Odersky英語Martin Odersky
實作者 洛桑聯邦理工學院編程方法實驗室
面市時間 2004年1月20日,​13年前​(2004-01-20
最近釋出日期 2.12.0(2016年11月3日,​14個月前​(2016-11-03[1]
型態系統 靜態型別推斷, 結構化英語Structural type system
實作語言 Scala
系統平台 JVM, JavaScript,[2] LLVM[3] (實驗)
許可證 BSD 3-clause[4]
常用副檔名 .scala, .sc
網站 www.scala-lang.org

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

平台和許可證[編輯]

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之前工作於Generic 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是一種純物件導向的語言,每個值都是物件。物件的資料型別以及行為由類別特質描述。類抽象機制的擴充功能有兩種途徑。一種途徑是子類別繼承,另一種途徑是靈活的混入英語Mixin機制。這兩種途徑能避免多重繼承的種種問題。

函數語言程式設計[編輯]

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

更進一步,程式設計師可以利用Scala的模式符合,編寫類似正規表示式的代碼處理XML資料。在這些情形中,列表推導式英語List comprehension功能對編寫公式化查詢非常有用。

由於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可以復用執行緒,因此可以在程式中可以使用數百萬個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版中移除。

參考文獻[編輯]

  1. ^ Scala 2.12.0 is now available!. 2016-11-03 [2016-11-19]. 
  2. ^ Scala.js. [2015-07-27]. 
  3. ^ Scala Native. [2015-07-27]. 
  4. ^ Scala 2.11.1 is now available!. 
  5. ^ Fogus, Michael. MartinOdersky take(5) toList. Send More Paramedics. 6 August 2010 [2012-02-09]. 
  6. ^ 6.0 6.1 6.2 6.3 Odersky, Martin. The Scala Experiment - Can We Provide Better Language Support for Component Systems? (PDF). 11 January 2006 [2016-06-22]. 
  7. ^ Scala Macros. 
  8. ^ 8.0 8.1 8.2 8.3 Martin Odersky et al., An Overview of the Scala Programming Language, 2nd Edition
  9. ^ Scala on .NET. 洛桑聯邦理工學院編程方法實驗室. 2008-01-07 [2008-01-15]. (原始內容存檔於2007-10-09). Scala is primarily developed for the JVM and embodies some of its features. Nevertheless, its .NET support is designed to make it as portable across the two platforms as possible. 
  10. ^ http://www.artima.com/weblogs/viewpost.jsp?thread=163733
  11. ^ http://www.scala-lang.org/node/146
  12. ^ 12.0 12.1 12.2 Martin Odersky, "A Brief History of Scala", Artima.com weblogs, June 9, 2006
  13. ^ Martin Odersky, "The Scala Language Specification Version 2.7"
  14. ^ Scala 2.8 Preview
  15. ^ Greene, Kate. The Secret Behind Twitter's Growth, How a new Web programming language is helping the company handle its increasing popularity.. Technology Review. MIT. April 1, 2009 [April 6, 2009]. 
  16. ^ Cloud, Jeremy. Scala + WattzOn, sitting in a tree.... March 10, 2009. 
  17. ^ http://drdobbs.com/article/print?articleId=231001802&siteSectionName=
  18. ^ https://tech.coursera.org/blog/2014/02/18/why-we-love-scala-at-coursera/
  19. ^ Tail calls, @tailrec and trampolines
  20. ^ http://zh.scala-tour.com/#/using-actor

圖書[編輯]

外部連結[編輯]