0%

【文章翻譯】Announcing Dart 2.1: Improved performance & usability

【文章內容使用 Gemini 1.5 Pro 自動翻譯產生】

宣佈 Dart 2.1:改進效能和易用性

今天,我們宣佈推出 Dart 2.1 穩定版,這是 Dart 2 的一個更新,它提供了更小的程式碼大小、更快的類型檢查、更好的類型錯誤易用性,以及新的語言特性,以提高構建使用者體驗時的生產力。

Dart 2 正式發佈

Dart 2 是 Dart 平台的一次重大升級。它完成了從早期網頁根源到主流程式語言的轉變,適用於跨行動裝置和網頁快速開發豐富的使用者體驗。Dart 作為一種語言,在提供虛擬機器 (VM) 和編譯成原生機器碼和 JavaScript 方面都有些獨特。這支援了各種平台的不同需求,無論是開發還是生產。

作為向 Dart 2 過渡的一部分,我們加入了健全的類型系統,以支援大型團隊構建複雜的應用程式;新的編譯器支援生成針對行動裝置最佳化的原生程式碼;以及完全重新設計的網頁平台工具。Dart 為 Flutter 提供動力,Flutter 是一個快速發展的工具包,用於從單一程式碼庫為 iOS 和 Android 構建美觀的原生體驗;它也是 Google 一些最大專案(例如 Google Ads)使用的語言。

自 8 月份 Dart 2 發佈 以來,我們一直致力於讓整個生態系統都使用 Dart 2。我們將 dartlang.org 網站切換到使用 Dart 2 範例,並提供用於遷移 Dart 1.x 套件的工具和文件。我們理解 Dart 2 中的重大變更涉及到現有 Dart 開發人員的遷移工作,我們非常感謝那些幫助我們為未來建立新基礎的人。我們現在的重點轉向利用這些投資來改進效能和生產力。

Dart 2.1 語言支援 int 到 double 的轉換

新的 Flutter 開發人員經常在指定 padding、設定字體大小等時遇到如下分析錯誤:

從系統的角度來看,這些錯誤是有道理的:API 需要一種類型 (double),而開發人員指定了不同類型 (int) 的值。但是,從易用性的角度來看,這似乎有點愚蠢:從 int 到 double 有一個簡單的轉換,為什麼不直接這樣做呢?Dart 2.1 現在可以推斷 int 何時可以靜默地評估為 double

Dart 2.1 語言支援 Mixins

我們還改進了 Dart 對 Mixins 的支援。如果您以前沒有接觸過 Dart Mixins,那麼值得閱讀 Romain Rastel 撰寫的這篇關於 Dart Mixins 的精彩介紹。Dart 2.1 引入了一種新的 Mixins 語法,其中包含一個新的 mixin 關鍵字,您可以使用它來定義只能用作 Mixins 的類別。我們還加入了支援,以便 Mixins 可以擴展其他類別(以前它們只能擴展 Object),並且可以在其父類別中調用方法。

擴展非 Object 類別的一個例子來自 Flutter 的動畫 API,其中 SingleTickerProviderStateMixin(一個提供用於將動畫前進一幀的 ticker 的框架類別)宣告了一個實作通用 TickerProvider 介面的 Mixin。動畫僅適用於有狀態的 Widget(因為動畫中的位置被視為狀態)。新的 Mixin 支援允許我們透過宣告只有擴展 Flutter State 類別的類別才能使用 Mixin 來表達這一點:

Dart 2.1 編譯時類型檢查

Dart 2 的健全類型系統可以在開發過程中保護您,當您違反類型指定的契約時,它會告訴您。例如,假設您正在為 Flutter 建立一個狀態類別。這個類別應該擴展框架 State 類別。State 類別應該傳遞包含其狀態的 StatefulWidget。

現在,如果您犯了一個程式設計錯誤,並且例如傳遞了 StatelessWidget 的後代而不是 StatefulWidget,類型資訊可以使工具捕獲錯誤並立即向您顯示警告:

這些編輯時類型檢查已在 Dart 2.0 中加入(由 Dart Analyzer 提供支援)。但是,還有另一個地方您可能會期望進行這些類型檢查,即在編譯時,當您進行 Flutter 發佈構建時。這些檢查在 Dart 2.0 中是不完整的,這可能會導致易用性問題,錯誤的原始程式碼可以在不產生任何錯誤的情況下進行編譯。在 Dart 2.1 中,這些檢查是完整的,並且 Analyzer 和 Dart 編譯器包含相同的檢查。

Dart 2.1 針對 Flutter 開發人員的效能改進

對於在我們的 VM 上執行的 AOT 編譯程式碼(例如 Flutter 應用程式),Dart 2 通常比 Dart 1.x 更快。但是,在一些邊緣情況下,新類型系統 加入的全面檢查會導致 20-40% 的額外開銷。在 Dart 2.1 中,我們大幅降低了類型檢查的成本,無論是對於 AOT 編譯程式碼,還是對於使用 JIT(即時)編譯在 VM 中執行的程式碼。

一個由此受益的具體案例是我們的開發人員工具(使用 VM 執行)。例如,對一個大型基準測試應用程式(基於 Flutter Gallery 的多個串聯副本)執行程式碼分析過去需要約 41 秒;現在只需要約 25 秒。

Dart 2.1 針對網頁開發人員的效能改進

我們還改進了在網頁上執行的 Dart 程式碼的程式碼大小和編譯時間。我們專注於 dart2js 的輸出大小,並且看到了良好的結果,例如,對於我們的一個範例,縮小後的輸出大小減少了 17%,編譯時間提高了 15%

核心 SDK 之外的變更

除了 Dart SDK 中的上述變更之外,我們還在核心 SDK 之外進行了一些令人興奮的變更。

Protocol Buffers(簡稱 protobuf)是一種平台中立的序列化結構化資料的機制。它們在 Google 內部廣泛使用,並且在 Google 之外也得到了廣泛的採用,例如作為 gRPC 的一部分。Dart 現在是一種官方支援的 protobuf 語言,我們在 核心 protocol buffers 網站 上加入了詳細的文件,其中包含教學參考文件。

您可能聽說過 knative,這是一個基於 Kubernetes 的平台,用於支援構建、部署和管理無伺服器工作負載。我們最近調查了在 knative 上支援 Dart 程式碼的服務,並建立了一個小範例。對於大多數 Dart 應用程式開發人員來說,這可能太低階了,但我們從平台的角度來看,覺得這非常令人興奮,並預計這將是改進 Google Cloud 中 Dart 程式碼服務支援的關鍵基石,例如為 Flutter 應用程式建立後端。

獲取 Dart 2.1

Dart SDK 2.1 可以從 Dart 首頁下載。如果您是 Flutter 開發人員,Dart 2.1 將作為即將推出的 Flutter 1.0 版本的一部分包含在內。

我們還更新了 DartPad 以執行 Dart 2.1,並加入了 int-to-doublemixins 的範例。

接下來是什麼

我們預計將發佈多個 2.x 版本,以利用 Dart 2 平台基礎。我們將根據框架合作夥伴和應用程式開發人員的需求來制定這些版本。在 2019 年,我們預計將研究以下領域:

  • Dart 語言的持續發展:對於 Dart 2.2,我們正在研究許多變更,例如對 const 表達式 的改進和對新的 Set 字面量 的支援。除了 2.2 之外,我們還在研究對 Unicode 字串的支援,並且正在研究是否可以提供更好的空值安全性。
  • 進一步改進以最佳化 Dart 作為建立使用者介面的語言:Dart 2 以其新的類型系統和可選的 new 開始了這段旅程,Dart 2.1 加入 int 到 double 值推斷,我們目前正在研究許多潛在的改進,例如支援 Widget 列表中的條件,將 物件集合 擴展到其他集合,甚至可能移除使用分號終止語句的需要
  • 更好的效能:我們將繼續減小編譯後 Dart 程式碼的大小和提高效能,包括更好地支援使用多核處理器,進一步減小程式碼大小以改善下載和啟動時間,以及可能更好地控制大小或運行時效能是否最重要。

要了解更多關於 Dart 和 Flutter 的資訊,我們誠邀您加入我們參加 Flutter Live,這是一個線上活動,將於 12 月 4 日舉行,並將在網路上進行直播。我們很興奮屆時能與您分享更多關於路線圖的資訊。

目前就這些。我們希望您喜歡 Dart 2.1!


宣佈 Dart 2.1:改進效能和易用性 最初發佈於 Medium 上的 Dart,人們在那裡透過突出顯示和回應這個故事來繼續對話。