Scala的優(yōu)點與缺陷:深沉而有趣的繼承者
譯文【51CTO精選譯文】一段時間以來,Java 是唯一運行在 JVM 上的語言。而 Scala 最近因用于擴展 Twitter 后臺(詳情可參考51CTO之前發(fā)布的《一位Twitter工程師的Scala探秘之旅》)而吸引了眾多目光。與許多運行在 JVM 上的語言不同,如 Groovy、Jruby 和 Jython,Scala 它是靜態(tài)類型的。這表示,與 Java 和 C# 類似,類型必須在編譯時是已知的。通常,人們介紹 Scala 時會說它即是面向?qū)ο蟮模∣O)又是函數(shù)式的(functional)。雖然這種說法是正確的(并且令人畏懼,很多人對于這些詞匯很不爽),但并沒有抓住 Scala 的重點。
以下 Scala 的各種特性能夠為你帶來最直接的好處:
兼容 Java。這點很明顯(其他 200 多種 JVM 上的語言也兼容 Java),但它是如此重要的一個功能,因此不可小視。它意味著 Scala 可以使用所有 Java 庫和框架愛。這也是對那些投資該技術(shù)的人員和公司的表達(dá)敬意。
聯(lián)合編譯(Joint Compilation)。這表示與 Groovy 類似,Scala 類被編譯為 Java 類,因此可以在 Java 項目中使用(甚至在他們被定義的同一項目中的 java 類 使用)。即使你的團(tuán)隊覺得完全轉(zhuǎn)向 Scala,對于通過 JSR 223 整合動態(tài)語言,這依然很有用。
類型推斷(Type Inference)。如果編譯器能猜到類型(通常它可以做到),你就不必告訴它。這使得 Scala 代碼具有動態(tài)語言的簡潔性,而同時保持類型安全。
隱式轉(zhuǎn)換(Implicit conversion),使 Scala 具有類型安全性,正如擴展方法(extension method)之于 C#,開放類(open class)之于 ruby。即:向你未曾定義的類型添加方法(如字符串、列表、整數(shù))。這是使得 Scala 符合 DSL(特定領(lǐng)域語言)模型的特性之一。
鼓勵使用對象不變性,并且容易實現(xiàn)。Scala 甚至提供了內(nèi)置的不變對象垃圾收集器。對于Scala有這樣一種說法:“每當(dāng)提到不變性時,有人就會開始擔(dān)心性能的問題,對于某些情況,這種擔(dān)憂并非毫無來由,但對于 Scala,最終結(jié)果卻與這一擔(dān)憂相反。不可變的數(shù)據(jù)結(jié)構(gòu)相對于可變的數(shù)據(jù)結(jié)構(gòu),更有助于獲得較高的效率。其原因之一在于強大的垃圾收集器(garbage collector),與 JVM 中的垃圾收集器類似?!?/P>
自動生成 Getter 和 Setter,如果你不需要(比如你只需 Setter),你必須顯示地將他們私有化(private)。這不是問題,因為通常情況都需要。
Scala 具有第一等級(first-order)函數(shù)并通過 iterable trait 實現(xiàn)了枚舉協(xié)議(enumeration protocol),這有助于讓代碼更加干凈、更加簡潔,并能夠帶來其他一些好處。
Actor 編程模式讓高度并行應(yīng)用程序的開發(fā)更加簡單。
不必顯示抓取或拋出(try-catch)異常??梢哉J(rèn)為使用已檢查異常(checked exception)的害處多于好處。
有關(guān)Scala更多的好處,可以參考51CTO之前發(fā)布的Ruby高手點評Scala編程語言十大絕招一文。不過,單單這些特性就已足夠——足夠令 Scala 成為一個非常有趣的語言,足夠讓 JRuby 創(chuàng)建者之一 Charles Nutter 宣稱它就是 Java 王位的合法繼承人,甚至足夠讓 Groovy 的創(chuàng)建人 James Stracha 以及 Java 的創(chuàng)建人 James Gosling 為其背書。盡管如此,Scala 是一個具有深度的語言,還有幾項高級特性,可以讓開發(fā)者更具生產(chǎn)力。但在掌握基本知識之前就學(xué)習(xí)這些功能會讓人感覺非常困難,如果沒有很好的支持文檔(比如 IBM、 Aritma、Jonas Bonér、Daniel Spiewak、Sven Efftinge 以及官方和其他網(wǎng)站提供的資料)會更加困難。不過,這不僅僅是令人興奮,在你需要時,它確實可以用來進(jìn)一步挖掘更具深度的一些概念。
51CTO編輯推薦:Scala編程語言專題
即使 Scala 具有學(xué)術(shù)性的根源(正如在它的論文網(wǎng)頁上顯示的那樣,以及它涉及的某些高深概念),它已成功應(yīng)用在企業(yè)項目上,除 Twitter 之外,還有西門子、法國電力集團(tuán)(électricité de France)和 WattzOn 網(wǎng)站。
在所有這些優(yōu)點之外,Scala 的確還存在一些粗糙的地方。雖然很多正在努力解決這些弱點,但近期內(nèi)它們還是有影響的:
◆剛剛起步的 IDE 支持。正如 Lift 的作者所言,Scala 的 IDE 支持,雖然進(jìn)行了很多開發(fā),還沒有做到 Java 那種地步。重構(gòu)支持、代碼完整以及單元測試整合都很差。更不必說大多數(shù)框架支持工具不能很好地與 Scala 兼容。由于 IDE 能夠幫助人們學(xué)習(xí)這種語言,這可能嚇退那些新手。另一方面,Martin Folwer 認(rèn)為這種 IDE 狀況是相對的,一種讓你更具生產(chǎn)力的語言足以彌補缺乏高級工具的弱點。
◆大多數(shù) IDE 不支持聯(lián)合編譯。同樣,當(dāng) Scala 更加普及之后,這一點會有所改變。
◆類的不變性并非真的不變性,因為引用對象自身可能不是不變的。并且目前沒有方法可以確保整個對象圖譜是不變的。
◆讓 JSR 223 完美地兼容 Scala 非常困難。但另一方面,取得足夠好的兼容還是相當(dāng)容易的。
◆Scala 不支持元編程(metaprogramming)。通過將其與動態(tài)語言結(jié)合,如 Ruby,可以繞過這個問題,但如果你是元編程的重度使用者,使用一個完全不同的語言是一種較好的解決辦法(Fan 是另一個運行在 JVM 上的靜態(tài)類型語言,與 Scala 類似,但支持元編程)。
◆使用 Java 資源的框架,如客戶端 GWT,不能很好地兼容 Scala(雖然有人已經(jīng)在服務(wù)器端讓 Scala 與 GWT 兼容)。不過,有一個項目正在進(jìn)行,將能夠使 Scala 轉(zhuǎn)化為 Java 資源。
◆語法和某些概念與 Java 有點不同,比如:顛倒的類型聲明順序、使用下劃線而不是通配符、星號和缺省值,太多種類的空概念(nothing)、沒有靜態(tài)方法(你需要使用單例對象 singleton object 作為替代)。文檔對這些問題有很好的解釋,但是,請留意,這不是 Java 代碼到 Scala 代碼的自動轉(zhuǎn)換。
正如 Joe Amstrong 所說,隨著 CPU 變得更加廉價,具有越來越多的內(nèi)核,開發(fā)者能夠更加簡便地使用多核 CPU 的語言需求,將會不斷增加。Scala 恰好滿足了這種需求,而同時 Java 的開發(fā)停滯不前,糾纏于廣泛部署所帶來的問題,以及未來有多開放的不確定性和某些主要貢獻(xiàn)者的政治問題。根據(jù)這種情況來看,Scala 非常適合 Java 王位繼承者這一角色。
【編輯推薦】