Scala將成為現代Web 2.0的發起語言
一個 Twitter 的開發人員說過,Scala 將會成為現代 Web2.0 的發起語言。LinkedIn 也用這種語言。同樣許多其他大的公司如 Sony Picture, EDF, SAP 也開始使用這種語言。
51CTO編輯推薦:Scala編程語言專題
Scala 名字的含義
Scala 意為可擴展的(scalable)語言,意味著開始時很小但是可以長久發展。對于新接觸 Scala 的人來說,它看起來也許像腳本語言。但是 Scala 并不是真正的腳本語言,這也不是 Scala 主要的特性。實際上,它能夠做到 Java 能做到的一切事情并且能提供超出 Java 能力范圍之外對于大系統的支持。Scala 設計的標準之一就是希望創造一種能夠適于任何從小程序發展到大系統卻不需要變更架構的語言。
Scala 的發展
90 年代 Martin Odersky 加入到開發 Java 語言和他的編譯器。他和 Philip Wadler 研究員一起開發了最終成為泛型 Java( GJ ) 的 Pizza, 后來又加入到 Java 5 的開發中。Martin Odersky 一直從事編寫 javac 編譯器。GJ 的編譯器也就是他們做的擴展,先于 SUN 公司接納 GJ 到標準的 Java 中很長時間 —— 因為 SUN 公司先接納了編譯器。
1999 年 Martin Odersky 到瑞士從事一些更基礎的課題工作。他開始嘗試將面向對象和函數很好的結合起來。他們已經在 95/96 年在 Pizza 上做過嘗試,但是只成功了一半,因為那時候他們將 Java 作為基礎語言將要處理很多不精細的地方。Java 的擴展性并不理想。所以在 2000 初, Martin Odersky 和他的小組在 EPFL 開發了一門新語言能夠和 Java 互操作但是能夠有效地將面向對象和函數編程技術結合起來。
他所嘗試的這些語言中,第一次被叫做 Funnel, 第二次的叫做 Scala. 第二次試驗的結果非常漂亮,所以他們將其打包作為實驗版發布,這樣 Scala 就成為一個真實的語言產品供人們試用。他們將一些粗糙的邊緣進行拋光,做了一些小的語法變化,重寫了 Scala 的工具以確保 Scala 語言和它的工具能夠維持大量的運用。他們在 2006 年發布了 Scala 第二版,然后它迅速地獲得了人氣。
結合面向對象和函數編程的優勢
函數編程讓你能夠通過運用簡單的部件構建你感興趣的內容,因為它能夠提供強有力的粘合力。函數以一種有趣的方式運用你程序的元素并且將他們和其他的元素進行粘合。函數編程的一個好處就是你能夠想運用一個數據那樣運用函數。一種幾乎在所有編程語言中都能有典型的數據類型就是 ”int”: 你可以在任何地方申明一個 int 值,包括在一個函數中,你可以將它傳遞給一個函數,將它從一個函數中返回或者將它存儲在一個字段中。這些特性提供給你一個構建自己結構的強有力的方式,定義真正高層級的庫,或者去定義新的領域特殊語言(DSL)。
從另一個方面來說,面向對象編程提供了構建系統組件和變更復雜系統的優秀解決方式。繼承和多態提供了靈活的方式去構建和組織命名空間。并且已經擁有比較好的編程工具,比如在 IDE(集成開發環境)中當打下一個點時彈出的用作提示有何種方法可用的上下文提示。
Scala 開發中的困難和解決方式
將面向對象和函數式編程結合存在的挑戰是,如何將這兩邊有效的組織起來讓他們看上去是一種語言而不是兩種。因此如何將這兩種編程方式中特性去除一部分成為重頭戲。
如果將兩種編程方式完整地結合,最終只可能得到的是交互很少的兩種子語言。挑戰在于,如何從兩種構造中定義構造。舉個例子來說,在函數編程語言中一個函數值對應于面向對象中的一個對象。你可以說,這是一個擁有 “apply” 方法的對象,因此我們能將一個函數值說成是一個對象。另外一個例子,函數編程中的基本代數類型可以對應成面向對象中的多重繼承,Java 中靜態字段和方法也存在同樣的問題。因此,Scala用將其替換成單例對象的成員的方式消除這種沖突。像這樣的例子還有很多,Scala 的開發團隊正在致力于消除語言中類似的沖突并且統一構建成別的東西。
Scala 開發過程中遇到的最大的困難
開發編譯器的技術是最大的挑戰。有趣的是,這些困難更多的來自于面向對象這邊。因為面向對象中高級的靜態類型系統十分罕見,并且他們中沒有一個是主流。Scala 比 Java 或者和 Java 類似的語言在類型系統上擁有更強的表現力,所以需要通過開發出一些新穎的類型和為組件構建更多抽象類來開辟新的領域.。這帶來了一些開發 Scala工作的困難也帶來了一些研究成果。
另一個困難的部分和交互有關。為了取得非常好的交互效果必須將 Java 中的一切都映射到 Scala 中。在想要將 Java 庫完全映射到Scala 中和避免 Java 中的多重構造之間總是存在緊張的狀況。這是一個永久的有挑戰里的工程問題,雖然經過了不少的工作但是最終的結果還是令人滿意。
Scala 設計的目的
為了將編程變成一種享受,Martin Odersky 和他的同事做了不少工作。Scala 盡可能多的移除了傳統高級協議編程語言中類似于咒語的語法,Scala 擁有強大的表現力因此開發者可以以自己喜歡的方式來描述事情。Martin Odersky 在開發 javac 的時候就領悟到 Java 程序員需要做的多少無用功,很多樣本是不需要的。
Scala 語言的靈活性是一件強有力的工具但是這也有兩面性。它賦予了程序員書寫自由的同時也賦予了避免錯誤的責任。從哲學的意義上來說,這是 Scala 和 Java 最大的不同之處。Java 擁有非常強的概念規范,因此任何一個 Java 程序都和周圍其他任何一個 Java 程序非常相似,并且這樣能夠方便的進行程序員交替。但是 Scala 并沒有這樣的統一性,因為這是一門很有表現力的語言。
你可以用很多種方式書寫 Scala 程序,如果你是一個剛剛開始 Scala 的 Java 程序員,你也可以寫成 Java 程序那樣。這讓編程小組非常容易的遷移到 Scala, 并且將項目風險降低。程序員可以先在非關鍵的部分試用然后在他們覺得合適的時候再迅速的擴展到其他的部分。
同樣你也可以把 Scala 程序寫成完全的函數式風格,和 Java 程序一點也不像。通常這樣的話, 程序看起來會更簡潔。這種方式帶來的好處就是,你可以在 Scala 中構建類似于高層次的庫的或者領域特殊語言(DSL)成你自己的俗語。通常你需要混合幾種不同的語言或者配置標注來達到相同大的目的。所以最終,Scala的單語言做法會帶來簡單的解決方案。
Twitter 使用 Scala
Twitter 使用 Scala 作為后臺編寫語言最終運行良好。Twitter 已經持續增長,并且穩定性日益成為其增長的瓶頸,它使用 Scala 也是 Scala 語言的一次良好測試。當一個引人注目的網站比如 Twitter, 用了一個新語言,對于這個語言來說是一次酸性測試 —— 主要的問題會被迅速發現并且被強化出來。
還有一些其他的知名公司使用 Scala. Sony Picture Imagework 用 Scala 寫它的中間層軟件,歐洲最大的能源公司 EDF 在它的貿易部門用 Scala 構建合同模式。SAP 和 西門子在他們的開源 ESME 工具上用 Scala。這僅僅只是許多例子中的三個而已。
Scala 將成為現代 Web2.0 發起者
Twitter 并不是惟一一家使用 Scala 的公司,LinkedIn 也用 Scala.
Scala 提供了在穩定的高性能平臺(Java 虛擬機)上生成的能力同時也是一門敏捷性語言。這一類型的語言也有其他的選擇,例如 Jython, JRuby, Groovy 和 Clojure, 但是這些都是運行在 JVM 上的動態類型語言。
問題是對靜態類型的設定是否習慣,這樣問是因為這將在早些時候帶來更多的問題,它給了你一個安全的重構網絡,或者它幫助提高了性能。或者你需要一個完全動態的語言因為想用元程序做一個喜歡的東西。如果你偏向使用靜態類型的語言,Scala 絕對是一個最適合的選擇。
Scala 語言的特性
Scala 語言的特性有許多,例如高階函數和對象、抽象類型綁定,actor 使得函數在 Scala 中能是一個子類成為可能,Scala 中的設計模式使得面向對象和函數編程無縫結合。
Scala 的發展方向
Scala 的下一個版本 Scala 2.8 將致力于高性能的數組操作,重新界定集合和快速永久的數據結構等。Scala 2.8 將在今年的下一個季度發布。
長久來看,Scala 對并發和并行有興趣,因此正在支持多核處理器和其他并行系統上尋找新的道路。Scala 已經有一個受歡迎的 actor 系統,它能夠高水平的表現并發,這已經在 Twitter 的消息傳遞上已經得到證實。有趣的事情是,actor 并不是 Scala的語言特性,它完全是 Scala 的一個庫。這是 Scala 靈活性的良好的見證者:只要用對了原語和庫中的抽象,你可以在程序中編寫像語言特性的東西。
Scala 將在數據并發和流編程上提供和 actor 一樣良好的表現。在未來我們極有可能需要一些并發抽象來利用多核因為不同的并行和并發情況需要不同的工具。Scala 庫的基礎的做法正是與此相關,因為它讓我們將混合和匹配的概念實現成為類和對象,這樣能夠快速前進而不是將所有的這些都放入一個語言和一個編譯器。在未來的 5 年內,Scala 都將致力于此。
【編輯推薦】