11 June 2006

這個怪獸是啥?Scala這幾天才發現這個神奇的東西。

Scala 是一個 static typed (!),並且融合 Object-Oriented 和 Functional Programming 兩大領域,在 JVM 上執行,可直接呼叫 Java API 的新語言。由 Martin Odersky (開發過 java generic 與 javac) 領導,在 2001 年時開始開發,於 2003 年時發表第一版。

它是一個純物件導向的語言 -- "Every value is Object"。支援 class 和 traits (應該是翻成 "特徵" 吧),traits 類似 java 的 interface,不過可以有部份的實作。因此,traits 可以做到 Mixin,即結合多個部份實作達到多重繼承的效果。(有用過 Ruby 的人應該知道 Mixin 有多好用了。)

它也是一個函數型 [1]的語言 -- "Every function is a value"。支援 Higher-order function [2]、nested function 以及 currying [3]。還有 pattern match (這個有點像是在解多項式.. ?),以及應用 pattern match 的 XML processing:

object XMLTest1 extends Application {
  val page = 
  <html>
    <head>
      <title>Hello XHTML world</title>
    </head>
    <body>
      <h1>Hello world</h1>
    </body>
  </html>;
  Console.println(page.toString())
}
或甚至在 xml 裡夾程式碼:
import scala.xml._
object XMLTest2 extends Application {
  val df = java.text.DateFormat.getDateInstance()
  val dateString = df.format(new java.util.Date())
  def theDate(name: String) = 
      <dateMsg addressedTo={ name }>
          Hello, { name }! Today is { dateString }
      </dateMsg>;
  Console.println(theDate("John Doe").toString())
}

這些不就是 dolphin 吵著要加入的功能嗎?現在 Scala 就有啦~ (上面的例子也看的出來 ,Scala 就是這樣子直接呼叫 Java 程式... 還真是狠)

再來,它是 static typed 的語言 (哈,這點很重要),在現在 dynamic typed 語言猖獗的時代裡,真是一股清流啊!內建支援 generic,而且比 Java "正常"多了。

最後,Scala 語言本身是可以擴充的,看這個範例:

object TargetTest1 extends Application {
  def whileLoop(cond: => Boolean)(body: => Unit): Unit =
    if (cond) {
      body ; //body 會被 function 取代
      whileLoop(cond)(body)
    }
  var i = 10
  whileLoop (i > 0) { //這段大括號內程式碼會被放到 body 裡
    Console.println(i)
    i = i - 1
  } //大括號結束
}

這是一個應用 currying 的例子,whileLoop()() 的第二層 argument body 所傳入的 function,直接取代body的位置。就這樣隨便寫寫就多了個 whileLoop 的新語法,真恐怖~~。有了這個要寫 Domain Specific Language 不成問題啦!

雖然它現在已經有不錯 eclipse plug-in 可以使用,又是直接在 JVM 上跑,要馬上上陣不成問題,語言功能也強的不像話,但... 基本上這算是個比較學術性的語言,用的人很少... 不能說這個語言能有什麼作為啦,但隱隱然有下一代語言的雛型。從它身上也許能夠窺見 Java 下一個 10 年的方向吧。

[1] 函數型語言 - Functional Programming

[2] 高階函數 - 即 function 可以拿 function 做為 argument 或是回傳值。

[3] currying - 目前我只知道是 function 可以有兩層以上 argument,然後一次給一部份,還在研究中...


回響

可以用 Tag <I>、<B>,程式碼請用 <PRE>