Dart與JavaScript的關系就像C#與C++

jopen 14年前發布 | 34K 次閱讀 JavaScript

Dart是一種基于類的可選類型化編程語言,設計用于創建Web應用程序。 Google稱,Dart的設計目標是為Web編程創造結構化但又富有靈活性的語言;編程方法一目了然,符合程序員的自然習慣,易于學習;能在所有瀏覽器 和不同環境中實現高性能。

Dart代碼以兩種方式執行,一種是原生虛擬機,一種是JavaScript引擎,用編譯器將Dart代碼翻譯成 JavaScript代碼。這允許程序員在Dart中創建Web應用,編譯后在任何瀏覽器上運行。Dart語言官網提供了名叫Dartboard的在線應 用,讓感興趣的開發者在線上編程和運行。

示例代碼:

class Point {
  Point(this.x, this.y);
  distanceTo(Point other) {
    var dx = x - other.x;
    var dy = y - other.y;
    return Math.sqrt(dx  dx + dy  dy);
  }
  var x, y;
}

main() { Point p = new Point(2, 3); Point q = new Point(3, 4); print('distance from p to q = ${p.distanceTo(q)}'); }</pre>

在谷歌工程師拉爾斯·巴克(Lars Bak)的V8 JavaScript解釋器顛覆了Firefox所宣稱的速度這一背景之下,我們有理由相信,谷歌新的網絡開發語言很可能與Smalltalk類似。但是這可能會引領網絡走向一個截然不同的方向。在今天丹麥舉行的網絡開發者大會上,谷歌和Chromium開源開發團隊的成員揭開了谷歌寄予厚望的新的、更為結構化的網絡編程方法——Dart的神秘面紗。Dart的正常運行需要一個新的虛擬機,這就使得Dart處于與Java、Adobe Flash以及Microsoft、Silverlight競爭的地位。但是從結構上說,至少是現在,Dart將會更依賴于瀏覽器。

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應用程序(或者說是“本機應用程序”)仍有待觀察。我們這周將密切關注來自開發者大會及谷歌的消息。

英文文章:原文鏈接

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!