0102.Scala => Web 2.0

Scala => Web 2.0

一個 Twitter 的開發人員說過,Scala 將會成為現代 Web2.0 的發起語言。LinkedIn 也用這種語言。同樣許多其他大的公司如 Sony Picture, EDF, SAP 也開始使用這種語言。


新一代 Scala 混編語言俱有的特性
  1. 兼俱雙重特性發展至今的優點
    1. 物件導向(OOP, Object-Oriented Programming)
    2. 函數編程(FP, Functional Programming)
  2. 可兼跨二大主流系統的執行環境(Runtime)
    1. Java JVM/JRE
    2. Microsoft CLR(Common Language Runtime)
  3. 以更佳的思維開發高效的多核 Concurrecny 運算程序開發能力





最大價值:兼俱OO與FP的技術組合


Scala 是一種函數對象混合的語言,具有一些強大的優點:

  1. Scala 是一種針對將函數(FP)和OO技術組合在一起的編程語言。Scala 最創新的地方是OO與FP在類型系統層次上的融合。還沒有什麼別的語言能做到這麼深度的融合(例如 Fan 的作者就寧可不做這麼徹底)。
  2. Scala 引進 FP,促使 OO 和函數式編程做合適的融合,新引進fp的語法,和 mixin 的與 Java 不同的繼承初始化順序可能較難以學習理解。
  3. 其次,Scala 基於 Haskell 和 ML 的函數原則,大量借鑑了 Java 程序員鍾愛的物件導向概念。因此,它可以將兩個領域的優勢混合在一起,從而提供了顯著的優點,而且不會失去我們一直依賴的熟悉的技術。


降低 Java, C#, ... 開發者學習曲線


  • 在講究 scalability、concurrency、fault tolerance 的場合,Scala 及 Erlang 都比 Ruby 還要 proven 呀。對於 Java,或者 JVM 愛好者而言,Scala 又是比 Erlang 更容易親近的選擇。
  • 很多人覺得scala對於java,類似c++對於c, scala對java語法的繼承不像c++對c繼承的那麼徹底,可能在很多人眼裡已經接近是完全不同了,從這點來說,scala並沒有背負什麼歷史包袱,這點還是要比c++要好的多。


Scala 並不完美,但優點多過缺點


  • Scala 最初是洛桑瑞士聯邦理工學院(EPFL)教授 Martin Odersky 於2003年開發的,結合了面向對象編程和函數編程的特性。運行在Java平台,兼容Java程序,靈活易用。Payne承認Scala並不完美,但優點多過缺點。
  • 另外想說的一點是,有些語言特性看上去複雜,可能也不好理解,但是不是我們一定要在代碼中用到呢?Scala比Java明顯做得更好的地方在於複雜度隔離,或者說,複雜度的內聚性更高,該複雜的地方複雜(為了正確),該簡單的地方簡單(為了方便)。



JVM / CLR 的相容性


  • 被設計成無縫地與Java實施互操作。 Scala程序會被編譯為JVM的字節碼。它們的執行期性能通常與Java程序一致。Scala代碼可以調用Java方法,訪問Java字段,繼承自 Java類和實現Java接口。這些都不需要特別的語法,顯式接口描述,或粘接代碼。實際上,幾乎所有Scala代碼都極度依賴於Java庫,而經常無須 在程序員意識到這點。
  • Scala 並不完全為了相同於 Java 而設計, 相對的希望能讓開發者更易遊走於 JVM 與 CLR 之間.
  • Odersky在設計Scala的時候已經是儘量少跟Java不同了……
  • 首先,Scala 可編譯為 Java 字節碼,這意味著它在 JVM 上運行。除了允許繼續利用豐富的 Java 開源生態系統之外,Scala 還可以集成到現有的 IT 環境中,無需進行遷移。



語法簡短


另外想說的一點是,有些語言特性看上去複雜,可能也不好理解,但是不是我們一定要在代碼中用到呢?Scala比Java明顯做得更好的地方在於複雜度隔離,或者說,複雜度的內聚性更高,該複雜的地方複雜(為了正確),該簡單的地方簡單(為了方便)。



高層級抽象


程序員總是在和複雜性死磕。為了高產出的編程,你必須明白你工作的代碼。過度複雜的代碼成了很多軟體工程崩潰的原因。不幸的是,重要的軟體往往有複雜的需求。這種複雜性不可避免;必須(由不受控)轉為受控。

val nameHasUpperCase = name.exists(_.isUpperCase) 
Java代碼把字串看作循環中逐字符步進的低層級實體。Scala代碼把同樣的字串當作能用論斷:predicate查詢的字符高層級序列。明顯 Scala代碼更短並且——對訓練有素的眼睛來說——比Java代碼更容易懂。因此Scala代碼在通盤複雜度預算上能極度地變輕。它也更少給你機會犯錯。

論斷,_.isUpperCase,是一個Scala裡面函數式文本的例子。 它描述了帶一個字符參量(用下劃線字符代表)的函數,並測試其是否為大寫字母。



高階的靜態類型



可檢驗屬性。靜態類型系統可以保證消除某些運行時的錯誤。例如,可以保證這樣的屬性:布爾型不會與整數型相加;私有變量不會從類的外部被訪問;函數帶了正確個數的參數;只有字串可以被加到字串集之中。

不過當前的靜態類型系統還不能查到其他類型的錯誤。比方說,通常查不到無法終結的函數,數組越界,或除零錯誤。同樣也查不到你的程序不符合式樣書(假設有 這麼一份式樣書)。靜態類型系統因此被認為不很有用而被忽視。輿論認為既然這種類型系統只能發現簡單錯誤,而單元測試能提供更廣泛的覆蓋,又為何自尋煩惱 呢?我們認為這種論調不對頭。儘管靜態類型系統確實不能替代單元測試,但是卻能減少用來照顧那些確需測試的屬性的單元測試的數量。同樣,單元測試也不能替 代靜態類型。總而言之,如Edsger Dijkstra所說,測試只能證明存在錯誤,而非不存在。 因此,靜態類型能給的保證或許很簡單,但它們是無論多少測試都不能給的真正的保證。


Comments