目錄

Dart product logo

Dart 是一種客戶端最佳化的語言,用於在任何平台上開發快速應用程式。其目標是提供最具生產力的多平台開發程式語言,並搭配 彈性的執行執行時間平台,供應用程式架構使用。

語言由其技術範疇定義,也就是在開發過程中做出的選擇,用以塑造語言的功能和優勢。Dart 的設計符合特別適合客戶端開發的技術範疇,優先考量開發(亞秒級有狀態熱更新)和跨各種編譯目標(網頁、行動裝置和桌上型電腦)的高品質製作體驗。

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

Dart:語言

#

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

Dart 內建了 健全的空安全。這表示除非您說它們可以為空,否則值不能為空。透過健全的空安全,Dart 可以透過靜態程式碼分析在執行時期保護您免於空例外。與許多其他空安全的語言不同,當 Dart 確定變數為非空時,該變數永遠不會為空。如果您在偵錯器中檢查正在執行的程式碼,您會看到非空性在執行時期保留;因此是健全的空安全。

以下程式碼範例展示了多項 Dart 語言功能,包括函式庫、非同步呼叫、可為空和不可為空的類型、箭頭語法、產生器、串流和取得器。若要進一步了解此語言,請查看 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
  • 檔案、socket、HTTP 和其他 I/O 支援,適用於非網路應用程式(dart:io
  • 外國函數介面,用於與呈現 C 風格介面的其他程式碼進行互操作(dart:ffi
  • 使用隔離進行並行程式設計,獨立的工作人員類似於執行緒,但不會共用記憶體,僅透過訊息進行通訊(dart:isolate
  • HTML 元素和其他資源,適用於需要與瀏覽器和文件物件模型 (DOM) 互動的基於網路的應用程式(dart:html

除了核心函式庫之外,許多 API 都透過全面的套件集提供。Dart 團隊發布許多有用的補充套件,例如

此外,第三方發行商和更廣大的社群會發布數千個套件,支援下列功能

若要查看一系列使用 Dart 核心函式庫的範例,請閱讀 核心函式庫文件。若要尋找其他 API,請參閱 常用套件頁面

Dart:平台

#

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

  • 原生平台:對於針對行動裝置和桌上型電腦裝置的應用程式,Dart 包含一個具備即時 (JIT) 編譯功能的 Dart VM,以及一個用於產生機器碼的即時 (AOT) 編譯器。

  • 網頁平台:對於針對網頁的應用程式,Dart 可以編譯用於開發或生產目的。其網頁編譯器會將 Dart 轉譯為 JavaScript。

An illustration of the targets supported by Dart

Flutter 架構 是一個受 Dart 平台支援的熱門多平台 UI 工具組,它提供工具和 UI 函式庫,用於建立在 iOS、Android、macOS、Windows、Linux 和網頁上執行的 UI 體驗。

Dart Native(機器碼 JIT 和 AOT)

#

在開發期間,快速的開發週期對於反覆運算至關重要。Dart VM 提供一個具備增量重新編譯功能(支援熱更新)的即時編譯器 (JIT),即時指標收集(支援 DevTools),以及豐富的除錯支援。

當應用程式準備部署到生產環境時(無論您是發布到應用程式商店或部署到生產後端),Dart 即時 (AOT) 編譯器可以編譯成原生 ARM 或 x64 機器碼。您的 AOT 編譯應用程式會以一致且快速的啟動時間啟動。

AOT 編譯程式碼會在一個有效率的 Dart 執行時間內執行,它會強制執行健全的 Dart 型別系統,並使用快速物件配置和 世代垃圾回收器 來管理記憶體。

更多資訊

Dart Web(JavaScript 開發和生產)

#

Dart Web 能夠在由 JavaScript 支援的網頁平台上執行 Dart 程式碼。使用 Dart Web,您可以將 Dart 程式碼編譯成 JavaScript 程式碼,然後在瀏覽器中執行,例如 V8Chrome 中。

Dart Web 包含兩種編譯模式

  • 一個增量開發編譯器,支援快速的開發週期
  • 一個最佳化製作編譯器,將 Dart 程式碼編譯成快速、精簡且可部署的 JavaScript。這些效率來自於像死程式碼消除等技術。

更多資訊

Dart 執行時期

#

不論您使用哪個平台或如何編譯程式碼,執行程式碼需要 Dart 執行時期。此執行時期負責以下重要任務

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

  • 強制執行 Dart 類型系統:雖然 Dart 中大多數類型檢查都是靜態的 (編譯時期),但有些類型檢查是動態的 (執行時期)。例如,Dart 執行時期會透過 類型檢查和強制轉型運算子 來強制執行動態檢查。

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

在原生平台上,Dart 執行時期會自動包含在獨立可執行檔中,並且是 dart run 指令提供的 Dart VM 的一部分。

學習 Dart

#

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