2011年4月28日 星期四

11. Scala 與 JavaScript

上篇提到,其實個人最希望它支援的標的是 JavaScript,好像有點混淆是不是?

請參考一下這篇說明(http://ejohn.org/blog/running-java-in-javascript/),有人提到把 JVM 搬到 JavaScript 上,就是說 Java bytecode 可以直接在 browser 中的 JavaScript 環境執行,這表示你的 Java 程式可以在 browser 中執行,那是多麼令人高興的事。

撰寫這篇文章的老兄叫 John Resig,他是 jQuery 的原始作者,我想這樣說大家就知道他的份量(阿?不知 jQuery,那你一定沒有使用 Ajax 寫過程式)。
直接使用 JavaScript 製作出來的 JVM 來執行Java bytecode 效能一定不會好,因為每個 JVM instruction 變成一個 JavaScript method 執行,效果不差才怪。

為甚麼一定要將 Java 程式碼,或把 Scala 搬到 JavaScript上面執行呢?原因很簡單,因為可以跨平台!

自從 Html 5 問世以來,JavaScript 逐漸在各個重量型 browser 統一,其中有一個很重要的東西叫canvas,canvas就是可以讓 programmer 在 browser 中建立一塊畫布,然後在這塊畫布中亂畫一通,也就是可以 canvas 可以完整執行你的 UI 程式。各個 browser 包含IE9、Firefox、Chrome、Safari、Opera都宣稱(或已支援)canvas。

微軟為何在這次 Html 5 的規格中,不像以前一樣,仗著市佔率加以抵制甚至另開新規格來搗蛋,而是很快在新版的IE9就支援?
筆者個人認為其實不是不搗蛋,而是不敢搗蛋。

「不敢搗蛋?會嗎?雄霸 PC 的微軟會低頭?」

不是 PC 的問題,是手持裝置的問題,現在市場中大家關注的是 iPhone、iPad、HTC,沒見到微軟的 Windows Phone。
滿坑滿谷手持裝置都是 Apple iOS 與 Google 的 Android,不巧的是這些手持裝置的 browser 就是 Safari 與 Chrome,這兩個 browser 早勾結在一起想要扳倒微軟的 IE。

機會來了,這兩個公司仗著手持用戶的勢力,硬是推出新的 Html 5 與 Canvas 標準,你說微軟買不買帳?

想一下以下的情境:你有些應用程式在手持裝置上執行好好的,可是回到 PC 的 IE 就狀況百出,你這時會如何?

是不再用手持裝置嗎?還是在 PC 灌上可以執行該應用程式的 browser?在 PC 加灌 Safari 或是 Chrome 可是件輕而易舉的事!
為保IE的地位,你覺得微軟會搗蛋嗎?
這是不是風水輪流轉,今朝你打我頭,明晚我踢你腳!

「能夠使用 canvas 有那麼重要嗎?」
為甚麼使用 JavaScript 來寫程式很重要呢?原因是現在各個 OS 的 Native Application 作法並不一致,很令人頭痛。
若你想寫一個跨平台的應用程式,在各平台都 porting 一次,是必須付出的代價,很煩。

這些平台上有一個共同的東西,叫 browser,如果我們可以在這共同的東西開發程式,不就畢全功於一役?!
只要寫一次程式就好,而且程式還不用安裝,直接由網路直接執行,真是美好。

想想看,如果有一個很像微軟 Office 操作方式的軟體,直接使用 bowser 就可執行,對用戶是多麼方便?!

以前的 browser 彼此支援程度都不同(可能是競爭問題,故意支援程度不同),所以幾年前你可以看到有一些書討論如何寫好跨 browser 的 JavaScript,這是多悲慘的事, programmer 成為大廠競爭下的犧牲品。還好,這種狀況現在比較少見。

隨著 Html 5、Canvas 的出現,以及各大 browser 的充分支援,想要撰寫「跨  browser、且讓使用者操控簡單」的應用程式,變得很有機會,所以筆者認為,JavaScript 與 Html 5 未來在程式開發將扮演重要的角色。

Html 5 與 Canvas 推出之時,Google曾經 demo 在 browser 開發 Doom 遊戲。很炫吧!

「以前難道沒有這種跨 browser 的東西嗎?」

以前的 browser 彼此支援程度不同,所以這個跨 browser 的重責大任就變成第三方單位的事。

第一個挑戰跨 browser 寫應用程式的就是 Java Applet。
藉著當時 Netscape Browser 的威力,讓 Java Applet 紅極一時,並且迫使 IE 不得不支援 Applet(微軟可是心不甘情不願,奈何那時 browser 正紅,而霸主叫 Netscape)。
只是 browser 給了機會,Java 卻不爭氣,硬生生將市場讓了出來,現今 Applet 雖然仍然存在,但已式微。筆者那時寫的 Applet 程式,全如流水,嘆!

第二個挑戰者就是 Flash。
很有名,那個動來動去的動畫是它傑作(很久以前,你曾看過幹譙龍?),那個看影片的東西也是它(YouTube 你總知道了吧!),還有還有,它可以拿來撰寫 browser上的 GUI 的程式(你看過在 browser 執行很像 Outlook 的 Email 程式嗎?)。

仗著在各瀏覽器超高的安裝率,Flash 幾乎成為 browser 中寫 GUI 程式的標準,然而功虧一簣,它的後台老闆終究叫 Adobe,不叫微軟、Apple 或 Google,力有未逮。

其實 Adobe 還有一項氣人的,在 Flash 中它弄了個很像 JavaScript 可是就不是 JavaScript 的 ActionScript,搞得大家暈頭轉向。Programmer 工作已繁忙,但光在 browser 端,除了 JavaScript 還要重學一套 Adobe 的怪東西,難怪很多人不爽,雖然 Adobe 宣稱 ActionScript 與 JavaScript 多像。真是奇怪,既然像,就用相同的就好啊。ActionScript 雖然會的人不少但不會的人更多,所以自然不成氣候。

對於 Flash ,基於保護 programmer 的立場(你信嗎?),Apple首先跳出來發難,仗著手持市場霸主的地位,趁著 Html 5與JavaScript Canvas 的推出,iPad 支援 Html 5 與 Canvas,硬生生宣佈不支援 Flash,理由當然冠冕堂皇,但真實原因應該就是不爽 Adobe,請離開我的地盤。

Flash 除了那個動來動去的東西以外,影片被 WebM 取代,GUI 的程式部份被 Canvas 取代,不知 Flash 好日子還有多久。

Browser 是各個平台的標準配備,許多大廠(比如Google、Apple)也鼓勵大家使用 browser 開發網路應用程式,因此 Html 5 與 JavaScript Canvas 很有機會變成重要的撰寫程式工具。

既然 JavaScript 這摩重要,我們應該好好使用 JavaScript。壞就壞在 JavaScript 實在太自由,要寫出個嚴謹的程式並不容易,連它的 Object Oriented 觀念都與主流不一樣,使用 prototype-based,與大多數的 class-based 不同。就是一句話,難進得了大廳堂。

因為 JavaScript 這麼的重要,但又這麼的不勘重用,所以有人提出 JavaScript 為 Platform 的想法,也就是將 JavaScript 變成被編譯出來的目標碼。

這可不是筆者亂說的,Oracle 的 Java 也有使用 JavaScript 製作 JVM 或是將 Java 程式碼 compile 成 JavaScript 的打算。Oracle VP: “We have a strategy to run Java inside a Javascript environment”(參考http://www.taranfx.com/java-javascript-runtime-environmenthttp://cemerick.com/2010/12/12/oracle-vp-we-have-a-strategy-to-run-java-inside-a-javascript-environment/)大家可以看看。

對於 Oracle 這項偉大的計畫,筆者舉雙手贊成,如果成型,我們這些 Java 的愛用者,就可以大大方方將 Java 程式轉移到 browser 執行,想到就高興。但可不要弄個「使用 JavaScript 來製作JVM」這個老梗(這種事也不需 Oracle 這種大廠來做,早有人完成了),更希望這不只是喊喊口號。

既然有人提出將 JavaScript 當成平台的觀念,筆者衷心希望 Scala 團隊有將 Scala 的原始碼編譯成 JavaScript 目的碼的計劃。若是達成願望,以後寫 browser 的程式,可就輕鬆多了。咦?這不也是 Scala 的目標之一嗎? Martin 舉例中,不是希望大家以後不需再撰寫 JavaScript 嗎?Martin,可見得你的 Scala 還缺了 Web Client 這段還沒解決,這是 Scala 欠大家的。

3 則留言:

  1. orto.accelart.jp 這個link已經不能連過去了,不知道這個專案計劃還在有在維持,雖然日文的那篇PDF還是可以看到,但是資料沒有很詳細。

    最近在研究Scala的語言,看到作者您寫的文章很精彩,謝謝您努力的貢獻。

    回覆刪除
  2. 應該早廢了,但這個概念持續延燒中。

    回覆刪除
  3. http://www.scala-js.org/
    Web-Client的scala

    回覆刪除