Dart之于JavaScript正如C#之于C++
譯文【51CTO 10月12號外電頭條】Lars Bak——這位來自谷歌的工程師曾經憑借其V8 JavaScript解釋程序顛覆了火狐瀏覽器的速度神話。如今根據他的說法,谷歌推出的全新Web開發語言Dart很可能與Smalltalk存在著種種相似之處。不過它似乎同時也在將Web發展引向一條與此前截然不同的另類道路。在今天于丹麥舉行的Web開發者大會上,來自谷歌及其旗下Chromium開源開發團隊的成員們終于揭開了全新語言Dart的神秘面紗,谷歌同時承諾該語言將為Web編碼工作帶來全新的構造方式。
要讓Dart正常運作,我們需要部署一套全新的虛擬機,這種要求無形中使其與Java、Adobe Flash以及微軟Silverlight天然形成了競爭關系。不過從體系結構角度而言,Dart就目前來看將更多地依托于瀏覽器。
谷歌的計劃是意欲將Dart虛擬機打造為對瀏覽器現有JavaScript引擎的一種補充。換句話來說,它將把Dart代碼加以重組并生成功能相同的JavaScript代碼。盡管谷歌一直在回避討論Dart嵌入全部瀏覽器之中的可能性,但在今早發布的博文中,Bak明確指出在將Dart虛擬機整合到谷歌Chrome瀏覽器方面,“我們已經有計劃探索這一方案。”
終于,我們迎來了類
Dart語言存在的意義是為JavaScript提供輔助功能,因為后者隨著時間的推移,其在“開放式Web”中的分布式應用程序方面已經無法勝任功能上的核心角色。比起結構化更徹底、面向對象特性更明確的C#及Java,JavaScript工作起來總會帶來一些無法清除的累贅因素。而與諸如Python、Ruby以及D之類更為智能化的動態語言相比,JavaScript又顯得比較啰嗦,無法迅速切入主題。
隨著Dart語言首部教程的問世,Bak及其架構團隊以JavaScript的基礎為起點,向其中加入了大量關鍵性Java要素,并通過對翻譯程序潛在條件的改進大大優化了語言的整體簡潔性。
對于JavaScript而言,實際上存在著一些能夠使其更偏面向對象的類函數,而這些類函數所使用的正是關鍵字函數。我們可以對那些恰好具備屬性的函數進行聲明,而該函數將作為一種類函數嵌入其中。不過這種處理方式的問題在于,該類函數本身并沒有得到重復調用,而是每次都以重新創建的形式出現,因此將該類函數以綁定的方式添加至函數原型中才是上佳的解決辦法。當然,我們也可以對通用實例進行加值以實現對某種對象的聲明,這可能需要利用常量對內部結構加以定義。接下來,從常量中選取一個,進而為函數賦值的做法也就使得該函數在某種意義上具備了變量值。或者我們也可以對加值進行聲明,并使用整個函數的結果為其賦值,這就相當于假設該函數是對象的惟一組成部分。
以上方法都不是特別理想。在V8以及Mozilla出品的TraceMonkey這些最新一代JavaScript引擎中,大部分的工作負載都是在將那些由不理想的指令所帶來的“垃圾代碼”轉化為少些混亂、多些嚴謹的有序代碼。
所以從理論角度出發,運行有Dart虛擬機的瀏覽器也許可以擺脫性能表現低下的噩夢,因為JS翻譯程序所要處理的代碼已經更為有序且易于理解。當然這只是理論。
Dart重新將類的概念以Java程序員們最為熟悉的方式引入。其中幾項調整使得定義工作更為簡潔;舉例來說,反向指針可能會被用于成員函數的聲明(例如用 Ball.throw (this.distance)代替 Ball.throw (distance); this.distance = distance;)。而接口也將為那些通用于多個類的屬性及函數提供支持;一個類啟用一個接口,這不正是大家一直以來所期望的結果么。
至今仍不明確:事件的觸發
對那些始終關注Dart項目的JS開發人員們來說,其中一大戲劇性結構變化也許會激起他們的廣泛反對。JavaScript函數通常是被粘貼于整個頁面當中的,而且盡管其中某部分充當的是main()函數,大多數函數仍然是由瀏覽器事件所觸發,包括window.onload。而在Dart中,每個 <script>元素本身都是個自成一體的環境。類成員以及變量在默認情況下都是公有的(在Dart語言中沒有“public”這一關鍵字),盡管Dart的本意并不是將公有屬性推廣到整個頁面——而只是在腳本內部。
“在JavaScript當中,跨多個腳本標簽的聲明都在同一個命名空間內被結合在一起,”Sigmund Cherem與Vijay Menon今早在文章中聲稱。“但在Dart中,同一個腳本標簽中的代碼無法直接訪問被定義在另一個標簽中的代碼。如果某個腳本需要讀取來自不同URL的代碼,它必須通過#import方能實現。每個腳本標簽要想運行都必須定義自己的main()接入點才行。
main()函數是DOMContentLoaded事件的事件句柄。否則我們也不會看到早期的說明文檔中提到任何關于Dart代碼如何像JavaScript代碼那樣響應瀏覽器事件的聲明。如果Dart根本沒有做出任何變化,那么可以預見的是在DOM載入前不會有任何代碼付諸運行;main()函數也就可以直接留空,而讓其它函數負責響應事件——這跟原先JavaScript所做的混蛋事完全沒有區別。
不過想想就知道,上述計劃將會為多線程處理帶來相當簡單而直接的處理方法:同一個頁面可以擁有多個腳本,而虛擬機也能夠使其并行運行…再次強調,這只是根據早期說明文檔進行的理論層面分析。瀏覽器目前還不具備多線程翻譯程序,而Dart也還沒有明確指出其JS翻譯程序中擁有如此猛料。綜上所述,斷言Dart能夠調用這一目前尚不存在的功能實在是為時尚早。
然而,從結構角度來看,Dart已然具備了諸多優勢,因此我們有足夠的理由相信它很可能將支持多款瀏覽器,甚至包括IE。目前還有待觀察的是Dart將如何沖擊瀏覽器上的HTML 5應用程序或者是“本機應用程序”。我們將繼續關注本周從谷歌自家的開發者大會上所傳出的新消息。
原文鏈接:http://www.readwriteweb.com/hack/2011/10/dart-is-to-javascript-as-c-is.php
【編輯推薦】