Scala
編程範型 | 多範式:函數式,面向對象,指令式 |
---|---|
設計者 | 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(發音為/ˈskɑːlə, ˈskeɪlə/)是一門多範式的編程語言,設計初衷是要整合面向對象編程和函數式編程的各種特性。[8]
平台和許可證
[編輯]Scala運行於Java平台(Java虛擬機),併兼容現有的Java程序。它也能運行於CLDC配置的Java ME中。曾經有過另一.NET平台的實現[9],不過該版本已被放棄。[10]
Scala的編譯模型(獨立編譯,動態類加載)與Java和C#一樣,所以Scala代碼可以調用Java類庫(對於.NET實現則可調用.NET類庫)。
Scala套件包括編譯器和類庫,以BSD許可證發布。[11]
歷史
[編輯]洛桑聯邦理工學院的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的軟件
[編輯]- 2009年4月,Twitter宣布他們已經把大部分後端程式從Ruby遷移到Scala,其餘部分也打算要遷移。[15]
- Wattzon已經公開宣稱,其整個平台都已經是基於Scala基礎設施編寫的。[16]
- 瑞銀集團把Scala用於一般產品中。[17]
- Coursera把Scala作為服務器語言使用。[18]
- 多鄰國,一個線上的免費語言學習平台,使用 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版中移除。
參考文獻
[編輯]- ^ 1.0 1.1 https://www.scala-lang.org/download/3.5.0.html.
- ^ Scala.js. [2015-07-27]. (原始內容存檔於2015-08-10).
- ^ Scala Native. [2015-07-27]. (原始內容存檔於2016-04-22).
- ^ Scala 2.11.1 is now available!. [2016-08-29]. (原始內容存檔於2016-08-27).
- ^ Fogus, Michael. MartinOdersky take(5) toList. Send More Paramedics. 6 August 2010 [2012-02-09]. (原始內容存檔於2012-02-14).
- ^ 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).
- ^ Scala Macros. [2020-09-26]. (原始內容存檔於2020-02-05).
- ^ 8.0 8.1 8.2 8.3 Martin Odersky et al., An Overview of the Scala Programming Language, 2nd Edition
- ^ 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.
- ^ 存档副本. [2019-08-10]. (原始內容存檔於2017-07-29).
- ^ 存档副本. [2009-07-22]. (原始內容存檔於2009-08-21).
- ^ 12.0 12.1 12.2 Martin Odersky, "A Brief History of Scala" (頁面存檔備份,存於網際網路檔案館), Artima.com weblogs, June 9, 2006
- ^ Martin Odersky, "The Scala Language Specification Version 2.7"
- ^ Scala 2.8 Preview. [2009-07-22]. (原始內容存檔於2009-04-26).
- ^ 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).
- ^ Cloud, Jeremy. Scala + WattzOn, sitting in a tree.... March 10, 2009 [2009-07-22]. (原始內容存檔於2009-04-09).
- ^ 存档副本. [2012-01-14]. (原始內容存檔於2011-07-19).
- ^ 存档副本. [2014-04-15]. (原始內容存檔於2014-04-01).
- ^ Tail calls, @tailrec and trampolines. [2009-07-22]. (原始內容存檔於2011-08-12).
- ^ 存档副本. [2013-05-08]. (原始內容存檔於2013-06-07).
圖書
[編輯]- Programming in Scala(頁面存檔備份,存於網際網路檔案館)(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)(頁面存檔備份,存於網際網路檔案館)
外部連結
[編輯]- Scala website(頁面存檔備份,存於網際網路檔案館)
- Scalachina(頁面存檔備份,存於網際網路檔案館)
- Scala Tour,開源Scala指南
- Scala教學(頁面存檔備份,存於網際網路檔案館)