0%

【文章翻譯】Announcing Dart 2.2: Faster native code, support for set literals

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

宣佈 Dart 2.2:更快的原生程式碼,支援集合字面量

今天,我們宣佈推出 Dart 2.2 SDK 的穩定版本,這是 Dart 2 的一個增量更新,它提供了改進的 提前 (AOT) 編譯 原生程式碼的效能和一個新的集合字面量語言功能。

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

我們繼續努力使 AOT 編譯的程式碼(例如 Flutter 應用程式)更快。在 Dart 2.1 中,我們減少了類型檢查的開銷,大大降低了 AOT 編譯程式碼和使用 JIT(即時)編譯在 VM 中執行的程式碼的類型檢查成本。

在 Dart 2.2 中,我們特別關注 AOT 編譯程式碼的效能,在微基準測試中將 AOT 效能提高了 11-16%(代價是程式碼大小增加了約 1%)。這一改進是幾個季度以來努力減少靜態調用開銷的結果。我們最佳化的 AOT 程式碼現在能夠使用 PC 相對調用(即使用 程式計數器)直接調用目標;之前我們必須對物件池進行多次查找才能確定目標地址。當程式碼包含大量建構函式和靜態方法調用時,這些最佳化特別有用,例如建立大量 Widget 的 Flutter 使用者介面程式碼。

Dart 2.2 集合字面量語言功能

Dart 的核心函式庫 (dart:core) 包含許多集合類別,用於對物件的 映射列表集合 進行建模。映射是鍵值對的集合。列表是有序的值序列,其中每個值可以透過索引存取,並且可以出現多次。集合是無序的值集合,其中每個值只能出現一次,並且可以有效地檢查集合中是否存在值。

Dart 集合通常使用編譯時常數初始化,因此 Dart 有一種方便的字面量語法來表達這種初始化。在 Dart 中,可以使用以下程式碼初始化列表:

1
var list = ['USD', 'EUR', 'JPY'];

以前,Dart 僅支援列表和映射的字面量語法,因此集合的初始化很麻煩,因為我們必須透過列表進行初始化:

1
var currencies = new Set.from(['USD', 'EUR', 'JPY']);

這段程式碼不僅不方便且效率低下;缺乏字面量支援會導致貨幣無法成為編譯時常數。透過 Dart 2.2 將字面量擴展到支援集合,我們可以使用一種方便的新語法初始化集合並使其成為常數:

1
const currencies = {'USD', 'EUR', 'JPY'};

有關 Flutter 團隊如何開始應用集合字面量的真實範例,請參閱 PR #27811。有關如何使用集合字面量的更多一般詳細資訊,請參閱 更新的 Dart 2.2 語言導覽

使用 Dart 2 通用前端 (CFE) 建立新的語言功能

Dart 語言實作(Flutter 使用的 Dart VM、dart2js 編譯器和 Dart 開發編譯器 (dartdevc))共用一個通用前端。Dart 通用前端(或 CFE)會解析 Dart 程式碼、執行類型推斷,並將 Dart 轉換為後端實作接受為輸入的低階中間語言。

集合字面量功能是一個語言結構的例子,由於 CFE,我們能夠快速開發它。解析集合字面量和執行類型推斷的程式碼在 CFE 中為所有 Dart 後端實作一次。此外,我們建立了一個僅限前端的過渡實作,後端最初可以使用它。在過渡實作中,上述非 const 版本的貨幣集合字面量在編譯期間被轉換為等效的:

1
2
3
4
var currencies = new Set<String>();
currencies.add('USD');
currencies.add('EUR');
currencies.add('JPY');

const 集合字面量的過渡實作是不同的,因為 const 集合不能以片段的形式逐步建立。相反,我們根據一個私有的不可修改集合類別來實作它,該類別包裝一個 const 映射,其中集合元素是映射的鍵:

1
const currencies = _UnmodifiableSet({'USD': true, 'EUR': true, 'JPY': true});

不可修改集合類別根據包裝的映射實作 Set 介面中的方法。

總體而言,我們最初能夠將集合字面量實作為僅限 CFE 的功能。後端最初可以使用 CFE 實作,然後獨立於功能的初始啟動開發自己的原生支援。這允許後端推遲其原生支援,直到更好地理解此功能的效能方面。

Dart 2.2 語言規範

Dart 2 是 Dart 的一次 重大升級,我們花了一段時間才將正式的 Dart 語言規範 更新以符合我們所做的所有變更。我們終於完成了這項工作,並且規範已更新至 Dart 2.2。我們還將語言規範來源移至新的 語言儲存庫,並加入了持續整合,以確保在我們為未來版本的 Dart 語言發展規範時,以 PDF 格式生成滾動草案規範。2.2 和滾動 Dart 2.x 規範都可以從 Dart 規範頁面 獲得。

獲取 Dart 2.2

Dart SDK 2.2 現在可以從 Dart 首頁下載。如果您是 Flutter 開發人員,則 Dart 2.2 已包含在內。(注意:目前的 Flutter master 和 dev channel 將報告 Dart 2.2。今天的 Flutter 1.2 穩定版本將報告 Dart 2.1.2;這與 Dart 2.2 具有相同的功能)。

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


宣佈 Dart 2.2:更快的原生程式碼,支援集合字面量 最初發佈在 Dart 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。