1. 程式人生 > >Scala簡介

Scala簡介

Scala簡介

1. Scala概述

 

官方網址:http://www.scala-lang.org/

1. Scala是一門多正規化的程式語言,一種類似java的程式語言,設計初衷是實現可伸縮的語言、並整合面向物件程式設計函數語言程式設計的各種特性。Scala 發音為(/ˈskɑːlə, ˈskeɪlə/)

Scala程式語言很多開發者所喜愛。如果你粗略瀏覽Scala的網站,你發現Scala是一種純粹的面向物件程式語言,而又無縫地結合了指令式程式設計和函數語言程式設計風格。

2. Scala有幾項關鍵特性表明了它的面向物件的本質。例如,Scala中的每個值都是一個物件,包括基本資料型別(即布林值、數字等)在內,連函式也是物件。另外,類可以被子類化,而且

Scala還提供了基於mixin的組合(mixin-based composition)。

3. 與只支援單繼承的語言相比,Scala具有更廣泛意義上的類重用。Scala允許定義新類的時候重用一個類中新增的成員定義(即相較於其父類的差異之處)Scala稱之為mixin類組合。

4. Scala還包含了若干函式式語言的關鍵概念,包括高階函式(Higher-Order Function)、區域性套用(Currying)、巢狀函式Nested Function)、序列解讀(Sequence Comprehensions)等等。

5. Scala是靜態型別的,這就允許它提供泛型類內部類、甚至

多型方法(Polymorphic Method)。另外值得一提的是,Scala被特意設計成能夠與Java.NET互操作。Scala當前版本還不能在.NET上執行(雖然上一版可以-_-b),但按照計劃將來可以在.NET上執行。

6. Scala可以與Java互操作。它用scalac這個編譯器原始檔編譯成Javaclass檔案(即在JVM上執行的位元組碼)。你可以從Scala中呼叫所有的Java類庫,也同樣可以從Java應用程式中呼叫Scala的程式碼。它可以訪問現存的數之不盡的Java類庫,這讓大多數Java開發者遷移到Scala更加容易。

7. Scala可以使用為Java1.45.0

或者6.0編寫的巨量的Java類庫和框架,Scala會經常性地針對這幾個版本的Java進行測試。Scala可能也可以在更早版本的Java上執行,但沒有經過正式的測試。ScalaBSD許可釋出,並且數年前就已經被認為相當穩定了。

2.平臺和許可證

1. Scala運行於Java平臺(Java虛擬機器),併兼容現有的Java程式。它也能運行於Java ME, CLDCJava Platform, Micro Edition Connected Limited Device Configuration)上。還有另一.NET平臺的實現,不過該版本更新有些滯後。

2. Scala的編譯模型(獨立編譯,動態類載入)與JavaC#一樣,所以Scala程式碼可以呼叫Java類庫(對於.NET實現則可呼叫.NET類庫) 。

3. Scala包中包含了編譯器和類庫,以BSD許可證釋出。

3.發展歷史

1. 聯邦理工學院洛桑(EPFL)的Martin Odersky2001年基於Funnel的工作開始設計ScalaFunnel是把函數語言程式設計思想和Petri網相結合的一種程式語言。Odersky先前的工作是Generic JavajavacSun Java編譯器)。Java平臺的Scala2003年底/2004年初發布。.NET平臺的Scala釋出於20046月。該語言第二個版本,v2.0,釋出於20063月。

2. 截至20099月,最新版本是版本2.7.6Scala 2.8預計的特性包括重寫的Scala類庫(Scala collections library)、方法的命名引數和預設引數、包物件(package object),以及Continuation.

3. 20094月,Twitter宣佈他們已經把大部分後端程式從Ruby遷移到Scala,其餘部分也打算要遷移。此外,Wattzon已經公開宣稱,其整個平臺都已經是基於Scala基礎設施編寫的。

4.Scala社群的發展

1. 一門語言不能孤立地存在,必須提供依附的平臺,以及圍繞它建立的生態圈。不如此,語言則不足以壯大。Ruby很優秀,但如果沒有Ruby On Rails的推動,也很難發展到今天這個地步。Scala同樣如此。反過來,當我們在使用一門語言時,也要選擇符合這門語言的技術棧,在整個生態圈中找到適合具體場景的框架或工具。

2. 當然,我們在使用Scala進行軟體開發時,亦可以尋求龐大的Java社群支援;可是,如果選擇呼叫Java開發的庫,就會犧牲掉Scala給我們帶來的福利。幸運的是,在如今,多數情況你已不必如此。伴隨著Scala語言逐漸形成的Scala社群,已經開始慢慢形成相對完整的Scala技術棧。無論是企業開發、自動化測試或者大資料領域,這些框架或工具已經非常完整地呈現了Scala開發的生態系統。

5.Scala程式語言特性:


快速實驗:  Scala有互動式命令列(REPL),可以在上面快速的試各種語法和程式碼。這對學習新特性,或者實驗新想法非常有用。

一致性:  儘管Scala融合了靜態型別系統、面向物件、函數語言程式設計等語言特性,但卻很少能看出融合的痕跡。Scala是我見到融合最多語言特性而又不顯得雜亂的程式語言之一。


型別安全Scala創始人是教授,他先帶領建立了Java 5編譯器,而後覺得Java有太多羈絆而發明了ScalaScala編譯器和型別系統非常強大,它的目標是儘量把軟體錯誤消滅在編寫過程中。Scala型別系統是圖靈完備的,甚至可以在編譯期間解決問題。


面向物件:  Scala是面向物件的程式語言,所有的變數和方法都封裝在物件中,可以把資訊封裝起來供外部使用。

函數語言程式設計: Scala同時又是函數語言程式設計語言,函式可以獨立存在,可以定義一個函式作為另一個函式的返回值,也可以接受函式作為函式的引數。這給組合函式帶來了很大的便利。如何把面向物件程式設計形容成搭積木的話,函數語言程式設計就像拼線條,更靈活和更有創意。

非同步程式設計:  由於函數語言程式設計提倡變數不可變,使非同步程式設計變得非常容易。同時Scala提供的Futureakka類庫,使得非同步程式設計變得非常容易。

基於JVM:Scala會被編譯成為jvm bytecode,所以Scala能無縫整合已有的Java類庫。你可以非常自然的使用已經存在的非常龐大且穩定的Java類庫,比如小巧好用的apache.common.*,或者Java上的各種工具類庫。

靜態型別:  Scala是具備型別系統,通過編譯時的檢查,保證程式碼的安全性和一致性。型別系統具體支援以下特性:泛型類,型變註釋(Variance Annotation),型別繼承結構的上限和下限,把類別和抽象型別作為物件成員,複合型別,引用自己時顯式指定型別,檢視,多型方法。

擴充套件性:Scala的設計承認一個事實,即在實踐中,某個領域特定的應用程式開發往往需要特定於該領域的語言擴充套件。Scala提供了許多獨特的語言機制,可以以庫的形式輕易無縫新增新的語言結構:任何方法可用作字首或字尾操作符,可以根據預期型別自動構造閉包。聯合使用以上兩個特性,使你可以定義新的語句而無須擴充套件語法也無須使用巨集之類的超程式設計特性。

其他特定:

更高層的併發模型Actor

輕量級的函式語法

高階

巢狀

區域性套用(Currying)

與XML整合,可在Scala程式中直接書寫XML,可將XML轉換成Scala類

與Java無縫地互操作因為如此眾多特性,用Scala可以優雅地編寫簡潔的程式碼,同時又能減少很多低階錯誤;能快速進行開發,又能保證系統性能、團隊協作和長期維護。Scala的風格和特性已經吸引了大量的開發者。總而言之,Scala是一種函式式面嚮物件語言,它融匯了許多前所未有的特性,而同時又運行於JVM之上。隨著開發者對Scala的興趣日增,以及越來越多的工具支援,無疑Scala語言將成為你手上一件必不可少的工具。

Scala還有更多被證明是非常有用的特性,如巢狀類,currying和代數型別模式匹配。它還支援類似於JDK1.5所增加的泛型和註解。這些還都只是冰山一角。

6.Scala技術棧

若要了解Scala技術棧,並快速學習這些框架,一個好的方法是下載typesafe推出的Activator。它提供了相對富足的基於Scala以及Scala主流框架的開發模板,這其中實則還隱含了typesafeScala開發提供的最佳實踐與指導。

當下主要的基於Scala開發的框架與工具,涉及到的領域包括:

Database

Web Frameworks

i18n

Authentication

Testing

JSON Manipulation

Serialization

Science and Data Analysis

Big Data

Functional Reactive Programming

Modularization and Dependency Injection

Distributed Systems

Extensions

Android

HTTP

Semantic Web

Metrics and Monitoring

Sbt plugins

7.Scala學習技巧

1、不要陷入C++一樣的、不斷膨脹的問題裡,留下太多的選擇,且沒有清晰的最佳實踐。這導致每個人都在選擇不同的子集。要提供適應的指導。

2、記住,反對不良的設計功能與增加新功能同等重要。這很殘酷。

3、考慮拆分語言為產生環境建立可行的標準。為學術世界節省成本是一個明智的選擇。迎合企業的需要,獲得更大的採用。

4、庫的編寫者應該看看Java API,確認是否應該有功能呼叫或結構化功能,為了更好的閱讀。不要為了流動性在跳躍太大來與Ruby競爭。

5、最後,當人們提出的建設性的批評時,不要感到失望。如果同樣的報怨不斷出現,那就說明應該重視一下

8.總結:

你可以把scala當做在java語言上做的一層抽象。scala編譯器會將scala原始碼編譯成bytecode and run in jvm. scala語言保留了java語言的面向物件的特性,並增加了許多亮點,例如類引數,trait關鍵字等等。程式設計師可以用十分簡潔的程式碼表達許多複雜的邏輯和元件。除此之外,scala也是一門函式式語言,具有許多函式式的特性,例如function literal , high-level function lamda等等。函式式的表達讓使用者邏輯更加清晰,程式碼更加簡潔。 關於scala這門語言名字的由來,可以很容易聯想到scalable,可擴充套件的。為什麼這麼說呢?應為scala的設計理念是less build-in control abstract.開發人員將大量的操作都以高階函式和庫的形式來向用戶提供,scala的內建操作很少,甚至比c語言還少。使用者可以根據自己的需要來訂製操作。目前,scala在國外比較火,twrriter已經將自己全部的程式碼從ruby轉到了scala.除此之外,AMPLab的大部分核心產品都是由scala開發的,例如最近非常火的大資料分析機器spark

9.Scala學習建議的書籍:

Programming in Scala

Scala for the Impatient

Scala in Depth

《快學Scala

10.程式碼示例:

Hello World:

  1. object Test {
  2.    def main(args: Array[String]) {
  3.       print("Hello World ")
  4.    }
  5. }

函式:

  1. object Test {
  2.    def main(args: Array[String]) {
  3.         println( "Returned Value : " + addInt(5,7) );
  4.    }
  5.    def addInt( a:Int, b:Int ) : Int = {
  6.       var sum:Int = 0
  7.       sum = a + b
  8.       return sum
  9.    }
  10. }

類:

  1. class Test{
  2.    def sum(a: Int, b: Int):Int = {
  3.         return a+b
  4.    }
  5. }
  6. object TestDemo {
  7.    def main(args: Array[String]) {
  8.       val t = new Test()
  9.       println(t.sum(3,9))
  10.    }
  11. }

I/O流:

  1. import scala.io.Source
  2. object Test {
  3.    def main(args: Array[String]) {
  4.       println("test.txt ‘ s contents" )
  5.       Source.fromFile("test.txt" ).foreach{
  6.          print
  7.       }
  8.    }
  9. }