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

Scala
編程範型多範式函數式面向對象指令式
設計者Martin Odersky英語Martin Odersky
實作者洛桑聯邦理工學院編程方法實驗室
面市時間2004年1月20日,​20年前​(2004-01-20
當前版本
  • 3.4.0 (2024年2月29日;穩定版本)[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[來源請求]

平台和許可證 編輯

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版中移除。

參考文獻 編輯

  1. ^ 1.0 1.1 Scala 3.4.0. 
  2. ^ Scala.js. [2015-07-27]. (原始內容存檔於2015-08-10). 
  3. ^ Scala Native. [2015-07-27]. (原始內容存檔於2016-04-22). 
  4. ^ Scala 2.11.1 is now available!. [2016-08-29]. (原始內容存檔於2016-08-27). 
  5. ^ Fogus, Michael. MartinOdersky take(5) toList. Send More Paramedics. 6 August 2010 [2012-02-09]. (原始內容存檔於2012-02-14). 
  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]. (原始內容存檔 (PDF)於2016-06-23). 
  7. ^ Scala Macros. [2020-09-26]. (原始內容存檔於2020-02-05). 
  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. ^ 存档副本. [2019-08-10]. (原始內容存檔於2017-07-29). 
  11. ^ 存档副本. [2009-07-22]. (原始內容存檔於2009-08-21). 
  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. [2009-07-22]. (原始內容存檔於2009-04-26). 
  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]. (原始內容存檔於2012-04-17). 
  16. ^ Cloud, Jeremy. Scala + WattzOn, sitting in a tree.... March 10, 2009 [2009-07-22]. (原始內容存檔於2009-04-09). 
  17. ^ 存档副本. [2012-01-14]. (原始內容存檔於2011-07-19). 
  18. ^ 存档副本. [2014-04-15]. (原始內容存檔於2014-04-01). 
  19. ^ Tail calls, @tailrec and trampolines. [2009-07-22]. (原始內容存檔於2011-08-12). 
  20. ^ 存档副本. [2013-05-08]. (原始內容存檔於2013-06-07). 

圖書 編輯

外部連結 編輯