C01.簡介(Introduction)

FOSDEM 2009 Scala - A Scalable Language

Introduction

Scalable Language 是 Scala 命名的由來, 實際上,Scala 能夠做到 Java 能做到的一切事情,並且更有能力提供超出 Java 能力範圍之外,向更大的應用系統提供支持。Scala 設計的標準之一,就是希望創造一種能夠適於任何從小程序 Script 發展到大系統 Enterprise 卻不需要變更架構的程序語言。- WisdomFish.ORG

盡可能由編譯器(Complier)來減少和完成更多開發者繁鎖的細節, 一直都是 Scala 探索的目標.

Scala 致力於發展複雜成熟的類型系統,這種系統可以在編譯期時盡可能的找到所有錯誤。它也集中研究物件導向的混合函數式風格。

Scala 是一門現代的多範式程序語言,志在以簡練、優雅及類型安全的方式來表達常用程序開發模式。它平滑地整合了物件導向和函數語言的特性。Scala 的名稱表明,它還是一種 高度可伸縮 的程序語言。Scala 意為可擴展的(scalable)語言,意味著開始時很小但是可以長久發展。對於新接觸 Scala 的人來說,它看起來也許像腳本(Scripting)語言。但是 Scala 並不是真正的腳本語言,這也不是 Scala 主要的特性。
  • 新一代混編型語言: 兼俱 OO 與 FP.
    • 物件導向的函數程序語言(Functional Programming for the object oriented)
  • 強類型程序語言



簡要史


Odersky (Scala 創始者)稱 Scala 這個名字意味著它是一個可擴展的、靈活性很強的語言,可以從一個很小的起點出發,逐步擴充。對新手來說,它有幾分像腳本語言,就如 JavaOne ScriptBowl,但它卻能做 Java 所能實現的任何東西。

Odersky 曾經參與開發 Java 語言及其編譯器,後在 10 年前移居到瑞士後開始做一些基礎研究工作。他研究了是否能讓物件導向編程和函數式編程結合起來。第一個試驗成果便是 Pizza,但由於他們的開發是基於 Java,而 Java 並不具有延展性,所以 Pizza 還很原始。

大約在2000年左右,Odersky 與瑞士洛桑理工學院的團隊一起開發新的語言,能延續與 Java 的互操作,同時又能有效整合物件導向編程和函數編程。最初它被稱為 Funnel,後來才改名為 Scala。2006年他們發佈了 Scala 2,此後它越來越受歡迎。Twitter在今年初宣佈從Ruby轉向完全使用Scala
http://developers.solidot.org/article.pl?sid=09/08/24/1030237&from=rss


Wikipedia - Scala




運行平台 / BSD 授權


Scala 軟體包中包含了自已的編譯器(Comiler)和核心的 API 庫,並以 BSD 許可證發布。

Scala 可被執行(Running)運行於,
Scala 的編譯模型(獨立編譯,動態類載入)與 Java 和 C# 一樣,所以Scala 可以調用 Java API庫(對於.NET實作則可調用.NET API庫) 。



編譯成 Java Bytecode


Scala語言的名稱來自於「可伸展的語言」,Scala 是一種融合了物件導向編程和函數式編程的靜態類型語言。它可以運行在Java 平台上,Scala 程序會被編譯為 JVM 的字節碼。它們的執行期性能通常與Java程序一致。這意味著它在 JVM 上運行。除了允許繼續利用豐富的 Java 開源生態系統之外,Scala 還可以整合到現有的 IT 環境中,無需進行遷移。



編譯成 .NET CLR


這意味著它在 .NET上運行。除了允許繼續利用豐富的 Java 開源生態系統之外,Scala 還可以集成到現有的 IT 環境中,無需進行遷移。
(上個版本可, 但當前版本不可, 但目標仍在計畫目標上)



100% - OO(Object-Oriented)物件導向


Scala 相較於 Java 來說, 完全不使用靜態(Static)空間, 當然也就不存有 static 關鍵字, Scala 對所有的實例(Instance)都必需要求是個物件, 進而不存在靜態對 Java OO 帶來的垢病, 取而代之 Scala 以 單例(Singleton)模式 來解決這方面帶來的缺陷.

一切都是物件實例

  1. 所有在 Java 中的原生型別, 在 Scala 中全以物件實例存在.
    1. 123.toString
    2. true.toString
    3. "1".toInt
  2. Scala FP 處理後的結果同樣也是物件實例.


函數編程(FP) + 物件導向編程


Function Programming + OOP

Scala 基於 Haskell 和 ML 的函數原則,大量借鑑了 Java 開發者鍾愛的 OO 概念。因此,它可以將兩個領域的優勢混合在一起,從而提供了顯著的優點,而且不會失去我們一直依賴且熟悉的技術。

函數語言名稱源於這樣一種概念:程序行為應該像數學函數一樣;
換句話說,給定一組輸入,函數應始終返回相同的輸出。這不僅意味著每個函數必須返回一個 值,還意味著從一個調用到下一個調用,函數本質上不得具有內蘊狀態(intrinsic state)。這種無狀態的內蘊概念(在函數/對象領域中,預設情況下指的是永遠不變的物件),是函數語言被認為是 C07.共時同作(Concurrency) 領域偉大的 「救世主」 的主要原因。



靜態型別(Static Type)語言


Scala 是靜態類型的,它可以被編譯成與Java同樣快速的字節碼(Bytecode),所以它的速度與Java不分上下(有時快一點,有時慢一點)。你可以看看 Scala 在與 groovy 或 jruby 一起進行測試 時表現有多好。注意:速度並不是我們追求的唯一目標——有時候我們可能寧肯讓代碼慢上十倍,也要寫得簡潔一點;但是如果要取代 javac,速度當然還是很重要的。

Erlang 是動態類型的,而 Scala 是靜態類型的, 並且相比 Java 有著更強的類型系統。然而,與Java相比最大的一個區別是Scala可以類型推斷。這意味著你可以省掉大部分的類型註解,使得代碼更加乾淨而編譯器照樣會做所有的檢查。


隱式轉換(implicit conversion)特性


Scala 不僅重用了Java的類型,還把它們「打扮」得更漂亮。例如,Scala的字串支持類似於toInt和toFloat的方法,可以把字串轉換成 整數或者浮點數。因此你可以寫str.toInt替代Integer.parseInt(str)。如何在不打破互操作性的基礎上做到這點呢?Java的 String類當然不會有toInt方法。實際上,Scala有一個解決這種高級庫設計和互操作性不相和諧的通用方案。

Scala可以讓你定義隱式轉換:implicit conversion,這常常用在類型失配,或者選用不存在的方法時。在上面的例子裡,當在字串中尋找toInt方法時,Scala編譯器會發現 String類裡沒有這種方法,但它會發現一個把Java的String轉換為Scala的RichString類的一個實例的隱式轉換,裡面定義了這麼 個方法。於是在執行toInt操作之前,轉換被隱式應用。



型別推論(Type Inference)


程式碼越簡約, 可能犯錯的機率會下降, 但可讀性也可能跟著下滑.

Scala 已有類型推理(type inference)功能,因此它和Ruby/Groovy一樣簡潔,但是它完全是靜態類型的。這是很有好處的,它使得理解代碼、閱讀代碼以及編寫文檔都 簡單多了。在任何片段(token)/方法/符號上點擊,你都可以跳轉到相應的代碼或文檔中去瀏覽。不需要打那些怪異的補丁,也不用操心誰什麼時候新增了 一個方法——這對於那些需要一個團隊一起長期開發的大項目是很有好處的。Scala似乎已經實現了動態語言(dynamic language)的那種簡潔,而實際上它是完全靜態類型的。所以,我根本不需要去記哪些魔術方法可用——或是在shell裡運行腳本來查看這些對象—— IDE/編譯器在你編輯代碼時就已經知道這些了。

Scala 大量利用了類型推斷(type inferencing),這意味著,編譯器深入分析代碼以確定特定值的類型,無需編程人員干預。類型推斷需要較少的冗餘類型代碼。重複的類型信息可以被忽略,因此程序變得更有條理和易讀。


Java Code
  1. class MyClass {  
  2.     private int index;  
  3.     private String name;  
  4.     public MyClass(int index, String name) {  
  5.         this.index = index;  
  6.         this.name = name;  
  7.     }  
  8. }

Scala Code

  1. class MyClass(index: Int, name: String)
Scala編譯器將製造有兩個私有成員變量的類,一個名為index的Int類型和一個叫做name的String類型,還有一個用這些變量作為參數獲得初始值的構造函數。這個構造函數還將用作為參數傳入的值初始化這兩個成員變量。


支持内嵌的領域特化


embedded domain-specific