1. 程式人生 > >Scala 簡介 優點 及 用途

Scala 簡介 優點 及 用途

介紹:



Scala 是一種有趣的語言。它一方面吸收繼承了多種語言中的優秀特性,一方面又沒有拋棄 Java 這個強大的平臺,它執行在 Java 虛擬機器 (Java Virtual Machine) 之上,輕鬆實現和豐富的 Java 類庫互聯互通。它既支援面向物件的程式設計方式,又支援函數語言程式設計。它寫出的程式像動態語言一樣簡潔,但事實上它確是嚴格意義上的靜態語言。Scala 就像一位武林中的集大成者,將過去幾十年計算機語言發展歷史中的精萃集於一身,化繁為簡,為程式設計師們提供了一種新的選擇。

優勢:


個人覺得比較執行速度其實沒啥意義, 因為兩種語言都是生成 JVM 的位元組碼, 依賴 JVM 這個虛擬平臺來跑程式碼. 除非 Scalac (scala的編譯器) 有重大 bug, 生成的位元組碼執行讓人無法接受, 否則基本上不會相差太多. 再說, scala 都到大版本2了, 這種概率實在是不大.

相比較與 Java, 在下覺得 Scala 最主要的有以下兩點優勢:

  • FP 泛型支援
    如果用多了 Spring 中大量的 template 介面, 你就會覺得 FP 其實還是蠻好用的.
    而這僅僅是 FP 好處的冰山一角.
    函式其實就是一個 input -> output (scala 也是這麼表示一個函式的), 沒有任何副作用, 與狀態無關, 由於這種特性, 所以函式式的程式設計正規化在分散式領域有很多好處
    對於函數語言程式設計,我的知識實在是皮毛, 但可以這麼說, FP 相對與 OO 有哪些優勢, Scala 對於 Java 差不多就有哪些優勢.
    正因為 FP 有如此多的優勢, 所以 Java8 才引入了 FP. 從某種程度上來說, Java 認可了 Scala 的做法.

  • 型別系統支援
    如果說 Java 是一種型別安全的語言, 那麼毫無疑問, Scala 的型別更加安全, 從某種程度上說, Scala 的型別是圖靈完備的, 而 Java 不是. 我的一位好朋友在這方面研究的比較深( http://hongjiang.info/scala/ ), 而我對與 Scala 的型別系統的理解, 也還是皮毛.

正是以上這兩點大優勢, 造成了 Scala 比 Java 更加安全, 同時又具備靈活性, 想象力.

  • 其他語言層面上的優勢
    在 Java 中, 你是否有時很想繼承多個 AbstractClass 呢? 對不起, Java 只支援單繼承
    在 Scala 中, 你可以進行 mixin (Java 8 也開始引入 default method 了呢)

    在 Java 中, 想要一個 singleton ? 要麼在 static block 中做, 要麼利用 Enum 的單例特性完成, 或者其他更糾結的方法.
    在 Scala 中, 只要宣告為 object, 即為單例.

    在 Java 中, 想要延遲載入一個單例? double check
    在 Scala 中, 只要在 object 中將變數修飾為 lazy 即可

    在 Java 中, 想要對集合進行一些操作? 使用一層一層的 for 迴圈吧
    在 Scala 中, 使用 collection 的一些集合操作, 即可獲得如寫SQL般的享受.

    在 Java 中, 在併發中想對Future進行回撥? 對不起, Future 不是 Listenable (無法支援回撥), 除非你使用額外的工具(如 guava, spring)
    在 Scala 中, 本來就主張非同步程式設計, future 和 promise 的配合讓人非常愉快.

    在 Java 中, 要透明擴充套件一個第三方庫的類怎麼辦? 包裝, 再加一層.
    在 Scala 中, 有強大的 implicit 機制讓你更優雅的做到這一點, 同時還能保證型別安全(比起 Ruby 的 monkey patch, 要安全得多)

  • Scala 的表達力很強, 相同功能的程式碼, 用 Java 和 Scala 的行數不可同日而語.

這些單單是語言層面上的優勢, 除此之外, Scala 還能無縫結合 Java

儘管羅列了如此多的好處, 但 Scala 有如下劣勢:

  • 語法複雜, 學習曲線非常高
  • 國內 Scala 程式設計師很難找 (目前 Scala 的影響力也在緩慢擴大, 比如 Scala 社群中的明星 Spark 的流行也在慢慢拉動 Scala 的流行, 如同 rails 之於 ruby)
  • 社群, 生態還比較小, Scala 風格的庫還非常少(但可以和 Java 很容易的斜街很多時候彌補了這一點)

與java 差別

相對於Java而言,Scala的程式碼更為精簡(減低犯錯),而且功能更為廣泛(Scala其實是Scalable Language 的簡稱,意為可擴充套件的語言),許多Scala的特性和語法都是針對Java的不足和弱點來設計的。

Scala的特點是有很多函式程式語言的特性(例如ML,Miranda, Scheme,Haskell),譬如惰性求值,list comprehension, type inference, anonymous function, pattern matching 等等,同時也包含 Object-Oriented 的特性(OO 能與 FP 混合使用是 Scala 的亮點)。此外,許多相似於高階程式語言的語法也滲入其中(例如 Python),不僅提高了 Scala 程式碼的可讀性,維護、修改起來也較為省時省力。

Scala 與 Java 語法上的明顯差異有:

  1. 不需要分號結尾
  2. 型別定義開頭需大寫(與 Haskell 相同)
  3. 函式定義需 def 開頭(與 Python、Ruby 相同)
  4. return 可以省略

在此值得提醒的是,統計顯示,Scala 的程式碼執行速率僅為 Java 的 8 成。

用途

spark 是用scala 開發的,可以做大資料,web等,其他功能 和java差不多