你們聽說了嗎?SCala要幹掉Java

編程語言 Scala Java Java虛擬機 蒼茫漂漂 2017-04-19

Scala的簡介

你們聽說了嗎?SCala要幹掉Java

Scala到底是什麼?在目前眾多的JVM語言當中,Scala無疑是最引人注意的語言之一。Scala是一個靜態語言,更適合大型工程項目,Scala直接編譯成Java字節碼,性能接近Java。Scala是一個多範式的語言,你可以混合使用函數式和麵向對象編程,混合使用可變類和不變類,混合使用Actor和傳統的Java併發庫。

短短一個月的時間,Scala於本月衝進了TIOBE的前五十名。一個 Twitter 的開發人員說過,Scala 將會成為現代 Web2.0 的發起語言。LinkedIn 也用這種語言。同樣許多其他大的公司如 Sony Picture, EDF, SAP 也開始使用這種語言。為什麼Scala發展這麼迅猛,可以獲得如此熱烈的社區支持。

曾冠東還表示,Scala不是Java的殺手,它無法取代Java的地位,也突破不了JVM的限制、Java實現不了的功能它也實現不了。我們可以將Scala形象的理解成大量語法糖的Java。

Scala 開發團隊發佈了最新的2.9.2穩定版本,Scala 語言的特性有許多,例如高階函數和對象、抽象類型綁定,actor 使得函數在 Scala 中能是一個子類成為可能,Scala 中的設計模式使得面向對象和函數編程無縫結合。Akka 是一個用 Scala 編寫的庫,用於簡化編寫容錯的、高可伸縮性的 Java 和 Scala 的 Actor 模型應用。它已經成功運用在電信行業。Spark 是一種可擴展的數據分析平臺,它整合了內存計算的基元,因此,相對於 Hadoop 的集群存儲方法,它在性能方面更具優勢。Spark 是在 Scala 語言中實現的,並且利用了該語言,為數據處理提供了獨一無二的環境。Scala 編譯器可以生成字節碼,直接運行在使用JVM上。該語言(它實際上代表了可擴展語言)被定義為可直接集成到語言中的簡單擴展。

Scala作為一門靜態語言,它的主要特性有哪些?

· Scala是面向對象的

Scala是一個純面嚮對象語言,在某種意義上來講所有數值都是對象。對象的類型和行為是由class和trait來描述的。Class的抽象可由子類化和一種靈活的基於mixin的組合機制(它可作為多重繼承的簡單替代方案)來擴展。

· Scala是函數式的

Scala還是一個函數式語言,在某種意義上來講所有函數都是數值。Scala為定義匿名函數提供了一種輕量級的語法,它支持高階(higher-order)函數、允許函數嵌套、支持局部套用(currying)。Scala的case類及其內置支持的模式匹配模型代數類型在許多函數式編程語言中都被使用。

· Scala是靜態類型的

Scala配備了一套富有表現力的類型系統,該抽象概念以一種安全的和一致的方式被使用。

· Scala是可擴展的

Scala的設計承認了實踐事實,領域特定應用開發通常需要領域特定語言擴展。Scala提供了一個獨特的語言組合機制,這可以更加容易地以類庫的形式增加新的語言結構:

任何方式可以被用作中綴(infix)或後綴(postfix)操作符閉包按照所期望的類型(目標類型)自動地被構造

兩者結合使用可方便地定義新語句,無需擴展語法,也無需使用類似宏的元編程工具。

· Scala可與Java和.NET進行互操作

Scala設計時就考慮了與流行編程環境良好交互,如Java 2運行時環境(JRE)和 .NET框架(CLR)。特別是與主流面嚮對象語言,如Java和C#儘量無縫交互。Scala有像Java和C#一樣的編譯模型(獨立編譯,動態裝載類),允許訪問成千上萬的高質量類庫。

在併發性方面,與 Scala 在 .NET 領域中的姐妹語言 F# 相似,Scala 是針對 “併發性問題” 的解決方案之一,讓開發人員能夠更加輕鬆地專注於問題的實質,而不用考慮併發編程的低級細節。Actor 編程模式讓高度並行應用程序的開發更加簡單。Scala把Erlang風格的基於actor的併發帶進了JVM。我們可以利用Scala的actor模型在JVM上設計具伸縮性的併發應用程序,以自動獲得多核心處理器帶來的優勢,而不必依照複雜的Java線程模型來編寫程序。Scala 為併發性提供了兩種級別的支持,這與其他與 Java 相關的主題極為類似:

首先,對底層庫的完全訪問(比如說 java.util.concurrent)以及對 “傳統” Java 併發性語義的支持(比如說監控程序和wait()/notifyAll())。其次,這些基本機制上面有一個抽象層

Scala 提供了在穩定的高性能平臺(Java 虛擬機)上生成的能力同時也是一門敏捷性語言。這一類型的語言也有其他的選擇,例如 Jython, JRuby, Groovy 和 Clojure, 但是這些都是運行在 JVM 上的動態類型語言。Open Class 的效果讓大家會覺得Scala是動態語言,但它是選擇隱式轉換來實現的,這也正好證明了Scala是靜態語言。隱式轉換(Implicit conversion)使 Scala 具有類型安全性,正如擴展方法(extension method)之於 C#,開放類(open class)之於 ruby。即:向未曾定義的類型添加方法(如字符串、列表、整數)。這是使得 Scala 符合 DSL(特定領域語言)模型的特性之一。

Scala結合了面向對象和函數編程的優勢,函數編程的一個好處就是你能夠像運用一個數據那樣運用函數,可以用來定義真正高層級的庫,或者去定義新的領域特殊語言(DSL)。

在談及Java與Scala的對比時,曾冠東表示,Scala能調用絕大部分的Java,而Java調用Scala獨有的東西會比較難。Java 擁有非常強的概念規範,因此任何一個 Java 程序之間具有非常多的相似之處,並且這樣能夠方便的進行程序員交替。但是 Scala 並沒有這樣的統一性,因為這是一門很有表現力的語言。現場曾冠東為我們演示了實際案例,如下圖所示:

正所謂,金無足赤,人無完人。Scala對二進制不兼容,語法也越來越複雜,不能突破Bytecode的限制、編譯速度有所緩慢。當它被廣泛用於單元測試、開發工具、Socket開發、以及面對多核挑戰的併發應用。總而言之,Scala是一種函數式面嚮對象語言,它融匯了許多前所未有的特性,而同時又運行於JVM之上。正如JRuby 創建者之一Charles Nutter 所宣稱的那樣Scala就是 Java 王位的合法繼承人。隨著開發者對Scala的興趣日增,以及越來越多的工具支持,無疑Scala語言將成為廣大軟件工程師手上一件必不可少的工具。

那麼現在我們有了三種疑問:

1. Scala會不會替代Java?

2. Java會不會替代Scala

3. Java程序員是否有必要學習Scala?

對於這三個疑問,我的觀點是:

1. Java 自身也在演化發展,輕言Scala會替代Java恐怕為時過早。

2. Scala和Java 8現在處於戰略相持階段,雖然Scala優勢還比較明顯,但是肯定不如Java 8出現之前了。

3. 掌握了Java 8等函數編程特點,會幫助你更容易學習Scala。

首先我們要對Scala進行精確定位,從某種程度上講,Scala並不是一個純粹的面向函數的編程語言,有人認為 Scala是一個帶有閉包的靜態面嚮對象語言),更準確地說,Scala是面向函數與面向對象的混合,而Java 8以後的Java也可以算是一種面向對象+面向函數的混合了。

Scala主要特點是比Java更豐富的類型推斷,不需要像Java那樣死板地聲明類型,這主要歸結於Scala強大智能的編譯器。類型推斷的好處其實因人而異,太玄了可能會影響代碼的可理解性。所以,Scala有時會出現編譯時間比較長,因為機器自己理解代碼也需要一點時間啊。

當然,Scala還有很多Java沒有的功能:模式匹配 implicits、traits、macros 、currying等等,除了這些新特點不一定都是函數式編程核心功能以外,這些非常棒的語法對一般程序員可能還需要一個接受過程。

既然Scala設計的初衷是面向函數FP,而Java起家是面向對象OO,現在兩者都是OO和FP的混合語言,是否可以這麼認為:Scala = FP + OO,而Java = OO+ FP。

那麼,Scala 與Java的PK就變成了“OO為主FP為輔”與“FP為主OO為輔”的PK了。

由於面向對象OO和麵向函數FP兩種範式是類似橫座標和縱座標的兩者不同座標方向的思考方式,類似數據庫和對象之間的不匹配阻抗關係,兩者如果結合得不好恐怕就不會產生1+1>2的效果。

面向對象是最接近人類思維的方式,而面向函數是最接近計算機的思維方式。如果你想讓計算機為人的業務建模服務,那麼以OO為主;如果你希望讓計算機能自己通過算法從大數據中自動建模,那麼以FP為主。所以,Java可能還會在企業工程類軟件中佔主要市場,而Scala則會在科學計算大數據分析等領域搶佔Java市場,比如Scala的Spark大有替代Java的Hadoop之趨勢。

Scala另外還在Reactive Stream等異步流式編程中試圖有所突破,總體來說,Scala面臨Java 8及其後續版本的阻擊,其函數編程的優勢正在慢慢被蠶食,而Scala必須在一個新的領域能將Java一招致命,我個人比較看好以Scala的Akka框架為代表的方興未艾的Reactive編程。

你們聽說了嗎?SCala要幹掉Java

本人熱愛技術,喜歡交流學習,有什麼前瞻新技術大家一起加群(Q):131322610 溝通學習

相關推薦

推薦中...