跳過主內容

Dart 概述

Dart product logo Dart product logo

Dart 是一種客戶端最佳化語言,用於在任何平臺上開發快速應用。其目標是為多平臺開發提供最具生產力的程式語言,並搭配適用於應用框架的靈活執行執行時平臺

語言由其“技術範疇”定義——開發過程中塑造語言能力和優勢的選擇。Dart 的設計技術範疇特別適合客戶端開發,同時優先考慮開發(亞秒級有狀態熱過載)以及在各種編譯目標(Web、移動和桌面)上的高質量生產體驗。

Dart 也構成了 Flutter 的基礎。Dart 提供了驅動 Flutter 應用的語言和執行時,但 Dart 也支援許多核心開發任務,例如格式化、分析和測試程式碼。

Dart:語言

#

Dart 語言是型別安全的;它使用靜態型別檢查來確保變數的值始終與變數的靜態型別匹配。有時,這被稱為健全型別。儘管型別是強制性的,但由於型別推斷,型別註解是可選的。Dart 型別系統也很靈活,允許使用 dynamic 型別並結合執行時檢查,這在實驗期間或需要特別動態的程式碼時會很有用。

Dart 內建健全空安全。這意味著值不能為 null,除非您明確允許。透過健全空安全,Dart 可以透過靜態程式碼分析在執行時保護您免受空異常的影響。與許多其他空安全語言不同,當 Dart 確定一個變數不可為 null 時,該變數絕不會是 null。如果您在偵錯程式中檢查正在執行的程式碼,您會發現非空性在執行時得以保留;因此是健全的空安全。

以下程式碼示例展示了 Dart 語言的幾個特性,包括庫、非同步呼叫、可空和不可空型別、箭頭語法、生成器、Stream 和 Getter。要了解更多關於該語言的資訊,請檢視Dart 語言之旅

import 'dart:math' show Random;

void main() async {
  print('Compute π using the Monte Carlo method.');
  await for (final estimate in computePi().take(100)) {
    print('π ≅ $estimate');
  }
}

/// Generates a stream of increasingly accurate estimates of π.
Stream<double> computePi({int batch = 100000}) async* {
  var total = 0; // Inferred to be of type int
  var count = 0;
  while (true) {
    final points = generateRandom().take(batch);
    final inside = points.where((p) => p.isInsideUnitCircle);

    total += batch;
    count += inside.length;
    final ratio = count / total;

    // Area of a circle is A = π⋅r², therefore π = A/r².
    // So, when given random points with x ∈ <0,1>,
    // y ∈ <0,1>, the ratio of those inside a unit circle
    // should approach π / 4. Therefore, the value of π
    // should be:
    yield ratio * 4;
  }
}

Iterable<Point> generateRandom([int? seed]) sync* {
  final random = Random(seed);
  while (true) {
    yield Point(random.nextDouble(), random.nextDouble());
  }
}

class Point {
  final double x;
  final double y;

  const Point(this.x, this.y);

  bool get isInsideUnitCircle => x * x + y * y <= 1;
}

Dart:庫

#

Dart 擁有一套豐富的核心庫,為許多日常程式設計任務提供必需品

  • 每個 Dart 程式的內建型別、集合和其他核心功能(dart:core
  • 更豐富的集合型別,如佇列、連結串列、雜湊表和二叉樹(dart:collection
  • 用於在不同資料表示之間轉換的編碼器和解碼器,包括 JSON 和 UTF-8(dart:convert
  • 數學常數和函式,以及隨機數生成(dart:math
  • 支援非同步程式設計,提供 FutureStream 等類(dart:async
  • 高效處理固定大小資料(例如,無符號 8 位元組整數)和 SIMD 數值型別的列表(dart:typed_data
  • 非 Web 應用程式的檔案、套接字、HTTP 和其他 I/O 支援(dart:io
  • 用於與其他呈現 C 風格介面的程式碼進行互操作的外部函式介面(dart:ffi
  • 使用隔離區(isolates)的併發程式設計——獨立工作單元,類似於執行緒但不共享記憶體,僅透過訊息通訊(dart:isolate
  • HTML 元素和其他資源,用於需要與瀏覽器和文件物件模型 (DOM) 互動的基於 Web 的應用程式(dart:js_interoppackage:web

除了核心庫之外,許多 API 透過一套全面的包提供。Dart 團隊釋出了許多有用的補充包,例如這些

此外,第三方釋出者和更廣泛的社群釋出了數千個包,支援以下功能

要檢視 Dart 核心庫的一系列工作示例,請閱讀核心庫文件。要查詢其他 API,請檢視常用包頁面

Dart:平臺

#

Dart 的編譯器技術允許您以不同方式執行程式碼

  • 本機平臺:對於面向移動和桌面裝置的應用,Dart 包含帶即時 (JIT) 編譯的 Dart VM 和用於生成機器碼的預先 (AOT) 編譯器。

  • Web 平臺:對於面向 Web 的應用,Dart 可以編譯用於開發或生產目的。它的 Web 編譯器將 Dart 轉換為 JavaScript 或 WebAssembly。

An illustration of the targets supported by Dart

Flutter 框架是一個流行且由 Dart 平臺驅動的多平臺 UI 工具包,它提供工具和 UI 庫,用於構建可在 iOS、Android、macOS、Windows、Linux 和 Web 上執行的 UI 體驗。

Dart Native(機器碼 JIT 和 AOT)

#

在開發過程中,快速開發週期對於迭代至關重要。Dart VM 提供了一個即時編譯器 (JIT),支援增量重新編譯(啟用熱過載)、即時指標收集(驅動 DevTools),以及豐富的除錯支援。

當應用準備好部署到生產環境時——無論是釋出到應用商店還是部署到生產後端——Dart 預先 (AOT) 編譯器可以將程式碼編譯為原生 ARM 或 x64 機器碼。您的 AOT 編譯應用將以一致且短暫的啟動時間啟動。

AOT 編譯的程式碼在高效的 Dart 執行時中執行,該執行時強制執行健全的 Dart 型別系統,並使用快速物件分配和分代垃圾回收器管理記憶體。

更多資訊

Dart Web(JavaScript 開發與生產以及 WebAssembly)

#

Dart Web 使得 Dart 程式碼可以在由 JavaScript 驅動的 Web 平臺上執行。透過 Dart Web,您可以將 Dart 程式碼編譯為 JavaScript 程式碼,該程式碼又在瀏覽器中執行——例如,Chrome 中的 V8。或者,Dart 程式碼可以編譯為 WebAssembly。

Dart Web 包含三種編譯模式

  • 一個增量 JavaScript 開發編譯器,可實現快速開發週期。
  • 一個最佳化的 JavaScript 生產編譯器,將 Dart 程式碼編譯為快速、緊湊、可部署的 JavaScript。這些效率來自死程式碼消除等技術。
  • 一個最佳化的 WebAssembly (WasmGC) 生產編譯器,將 Dart 程式碼編譯為超快速、可部署的 WebAssembly GC 程式碼。

更多資訊

Dart 執行時

#

無論您使用哪個平臺或如何編譯程式碼,執行程式碼都需要 Dart 執行時。此執行時負責以下關鍵任務

  • 管理記憶體:Dart 使用託管記憶體模型,其中未使用的記憶體由垃圾回收器 (GC) 回收。

  • 強制執行 Dart 型別系統:儘管 Dart 中大多數型別檢查是靜態的(編譯時),但一些型別檢查是動態的(執行時)。例如,Dart 執行時透過型別檢查和轉換運算子強制執行動態檢查。

  • 管理隔離區:Dart 執行時控制主隔離區(程式碼通常執行的地方)和應用建立的任何其他隔離區。

在本機平臺上,Dart 執行時自動包含在自包含的可執行檔案中,並且是由 dart run 命令提供的 Dart VM 的一部分。

學習 Dart

#

您有多種選擇來學習 Dart。以下是一些我們推薦的