英文原文:Dart is to JavaScript as C# is to C++
在谷歌工程師拉爾斯·巴克(Lars Bak)的 V8 JavaScript 直譯器顛覆了 Firefox 所宣稱的速度這一背景之下,我們有理由相信,谷歌新的網路開發語言很可能與 Smalltalk 類似。但是這可能會引領網路走向一個截然不同的方向。在今天丹麥舉行的網路開發者大會上,谷歌和 Chromium 開源開發團隊的成員揭開了谷歌寄予厚望的新的、更為結構化的網路程式設計方法——Dart 的神祕面紗。Dart 的正常執行需要一個新的虛擬機器,這就使得 Dart 處於與 Java、Adobe Flash 以及 Microsoft、Silverlight 競爭的地位。但是從結構上說,至少是現在,Dart 將會更依賴於瀏覽器。
谷歌計劃使 Dart 虛擬機器作為瀏覽器現在使用的 JavaScript 引擎的補充。也就是說,它可以把 Dart 程式碼轉變成 JavaScript 程式碼。谷歌儘量去迴避關於 Dart 被嵌入所有的瀏覽器的可能性,不過在今天早上發表的一篇博文裡,拉爾斯·巴克提及關於將 Dart 虛擬機器整合到谷歌瀏覽器的問題,並明確表示:“我們將計劃去探索這個專案。”
終於有了類
與 C# 和 java 等更加結構化、物件導向的語言相比,JavaScript 往往會有很多累贅;與 Python、Ruby 以及D等更加智慧化的動態語言相比,JavaScript 又顯得比較冗長,無法快速地切入主題。因此隨著時間的推移,JavaScript 在“開放式網路”的分散式應用程式功能上的統治地位似乎有所動搖。而 Dart 的存在似乎正是為了彌補 JavaScript 的這些不足。
隨著第一部 Dart 教程的問世,拉爾斯·巴克和他的開發團隊從 JavaScript 的基礎做起,加入了一些關鍵的 java 元素並提高了直譯器的潛在假設能力來使其變得更為簡潔。另外非常關鍵的補充就是使用了真正的類結構以及 java 開發人員所熟悉的類關鍵字。
JavaScript 中有一些使用關鍵字函式的方法來使其偏向於物件導向。例如,我們可以宣告一個恰好具有屬性的函式,並且它的功能是作為一種方法嵌入其中,但問題是方法本身並不會得到過載而是每次都要重新建立,所以就要把方法作為一種附加方式新增到函式原型。或者,我們可以宣告一個使用通用例項的物件,它可能要用常量來定義內部結構,然後我們可以選擇一個常量來為這個函式賦值,以使其具備變數的特徵。或者我們可以假定該函式是物件的唯一組成部分,然後宣告一個變數,把函式值賦給它。
但是這些方法並不夠完美。許多由最新一代的 JavaScript 引擎例如 V8 和 Mozilla 的 TraceMonkey 等執行的任務,事實上就是把壓縮了的繁瑣的“垃圾程式碼”轉變成相對簡潔精確的程式碼。
所以從理論上說,由瀏覽器執行 Dart 虛擬機器所導致的效能下降問題可以在程式碼方面得到補償,因為這些程式碼對於 JavaScript 直譯器來說更容易分析。但這僅僅是理論上。
Dart 以一種大多數 java 程式設計師所熟悉的方式再次引入了類。並且其中的一些調整使得定義更加簡潔;例如自反指示符 this 會被用在宣告使用者方法的內部(例如用 Ball.throw (this.distance);而不用 Ball.throw (distance); this.distance = distance;)。同時介面也支援建立使用者屬性和多個類的公用方法;還有如人們所期待的那樣一個類實現一個介面。
仍是未知:事件的觸發
有些 JavaScript 開發者反對的一個顯著的結構變化是關係到上下文。JavaScript 函式往往是貼上在整個頁面上的,儘管其中有些地方它應該是一個 main ()函式,但是大多數函式是由瀏覽器事件觸發的,包括 window.onload。在 Dart 中,每一個< script>元素都是一個自包含的上下文。類成員和變數被預設為是公有的(在 Dart 中沒有“public”這個關鍵字),儘管對於 Dart 來說“public” 僅僅是指令碼,而並非一個涵蓋整個頁面的作用域。
“在 JavaScript 中,跨多個指令碼標籤的宣告在同一個名稱空間裡被組合在一起,”Sigmund Cherem 和 Vijay Menon 在今天早上寫道,“在 Dart 中,在一個指令碼標籤中的程式碼無法直接訪問定義在另一箇中的程式碼。如果一個指令碼希望從另一個不同的 URL 載入程式碼,那麼它必須通過#import 來匯入。每個指令碼標籤必須定義自己的 main ()入口才能執行。
main ()函式是 DOMContentLoaded 事件的事件處理程式。否則,我們不會從早期文件編制中看到任何關於 Dart 程式碼如何以 JavaScript 程式碼的方式回應瀏覽器事件的跡象。如果 Dart 沒有做出任何改變的話,那麼我們可以預見,在 DOM 載入前什麼都不會執行,main ()函式也就可以寫為空的,而其它函式對事件做出響應——這和 JavaScript 所產生的情況一樣糟糕。
但是可以想象,這個方案將會使多執行緒處理變得異常簡單和直接:一個頁面可以有多個指令碼,而且虛擬機器可以並行執行它們……再次強調,這僅僅是根據早期文件編制,從理論上來講。目前瀏覽器尚未具備多執行緒直譯器,Dart 也並沒有強大到包括 JavaScript 虛擬機器,因此很難想像 Dart 將如何呼叫一個事實上並不存在的功能。
然而,從結構的角度來講,關於 Dart 還有很多是值得期待的,並且我們有理由相信它將會支援甚至包括 Internet Explorer 在內的諸多瀏覽器。因此 Dart 將會如何衝擊瀏覽器的 HTML5 應用程式(或者說是“本機應用程式”)仍有待觀察。我們這周將密切關注來自開發者大會及谷歌的訊息。