热门问题
时间线
聊天
视角
Scala
来自维基百科,自由的百科全书
Remove ads
Scala(發音為/ˈskɑːlə, ˈskeɪlə/)是一門多範式的編程語言,設計初衷是要整合面向對象編程和函數式編程的各種特性。[8]
Remove ads
平台和許可證
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)
}
Remove ads
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 - on
Seamless Wikipedia browsing. On steroids.
Remove ads