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