目錄

Dart product logo

Dart 是一種針對客戶端最佳化的語言,可在任何平臺上開發快速的應用程式。其目標是為多平臺開發提供最高效的程式語言,併為應用程式框架搭配了 靈活的執行時執行平台

通常來說,程式語言會包含一些 技術壁壘,即語言在設計中的抉擇決定了其功能和優勢。 Dart 的語言設計針對客戶端開發,它優先考慮多平臺 (Web,移動端和桌面端) 上的開發 (亞秒級的狀態熱重載) 和高品質生產環境體驗。

Dart 也是 Flutter 的基礎。 Dart 作為 Flutter 應用程式的程式語言,為驅動應用執行提供了環境,同時 Dart 還支援許多核心的開發任務,例如格式化,分析和程式碼測試。

Dart 語言

Dart 語言是型別安全的;它使用靜態型別檢查來確保變數的值 始終 與變數的靜態型別相匹配。這也叫健全型別。儘管型別是強制性的,但由於 Dart 支援型別推斷,型別註釋仍是可選的。 Dart 的型別系統也很靈活,允許結合使用 dynamic 型別與執行時期檢查,在測試開發期間,或是遇到需要特別指定為動態型別的程式碼時,這項特性很有幫助。

Dart 內建了 健全的空值安全,這意味著只有您宣告值可以為空的情況下,值才可以為空;當 Dart 確定變數不可為空時,該變數 永遠 不可為空。憑藉健全的空值安全,Dart 可以透過靜態程式碼分析在執行時保護您免受空值例外的影響。如果你在偵錯程式中審查正在執行的程式碼,你會看到不可為空性仍在執行時被保留,所以是完全的空安全。

以下程式碼範例展示了 Dart 語言的一些功能,包括庫、非同步呼叫、可空和不可空的型別、箭頭語法、產生器、流和 getter。要了解有關 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)

  • 為非 Web 應用程式提供的檔案、套接字、HTTP 和其他 I/O 支援 (dart:io)

  • 非同步程式設計支援,比如 FutureStream 類 (dart:async)

  • 能夠有效處理固定大小的資料(例如,無符號的 8 位元組整數)和 SIMD 數字型別的列表 (dart:typed_data)

  • 用於提供 C 語言風格程式碼互通性支援的外部函式介面 (dart:ffi)

  • 使用 isolates 的併發程式設計 — 這些獨立的工作程式與執行緒相似但它們不共享記憶體並僅透過訊息進行通訊 (dart:isolate)

  • 基於 Web 的應用程式中需要與瀏覽器和文件物件模型 (DOM) 互動的 HTML 元素和其他資源 (dart:html)

除核心函式庫外,Dart 還透過一整套軟體套件提供了許多 API。 Dart 團隊釋出了許多有用的補充套件,例如:

此外,第三方釋出者和更廣泛的社群也釋出了上千個軟體套件,支援諸如此類功能:

你可以存取 函式庫概覽,檢視關於 Dart 核心函式庫的一系列範例。如果你想要查詢其他 API,請參見 常用軟體包頁面

Dart 平台

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

  • 原生平台:針對面向移動和桌面裝置的應用程式, Dart 擁有具有即時 (JIT) 編譯功能的 Dart VM 和用於產生機器程式碼的提前 (AOT) 編譯器。

  • Web 平台:Dart 可用於編譯開發和生產階段的面向 Web 的應用,它的 Web 編譯器可以將 Dart 轉換為 JavaScript。

An illustration of the targets supported by Dart

Flutter 框架 是一款流行的多平臺 UI 工具套件,由 Dart 語言強力驅動,提供一套工具和 UI 庫,幫助開發者們在 iOS、Android、macOS、Windows、Linux 和 Web 平台建構優秀的 UI 體驗。

原生平台的 Dart (JIT 和 AOT 機器碼)

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

當應用程式可以部署到生產環境時 (無論是釋出到應用商店還是部署到生產後端), Dart AOT 編譯器可以編譯成原生的 ARM 或 x64 的機器碼。經過 AOT 編譯的應用程式將穩定快速地啟動。

經過 AOT 編譯的程式碼會在高效的 Dart 執行環境中執行,該執行環境擁有健全的 Dart 型別系統,並使用快速物件分配和 分代垃圾收集器 來管理記憶體。

更多相關資訊:

Web 平台的 Dart (使用 JavaScript 開發和部署)

Dart 的 Web 支援讓你可以在 JavaScript 驅動的網頁平臺上執行 Dart 程式碼。使用 Web 環境下的 Dart 時,你可以將 Dart 編譯為在瀏覽器中執行的 JavaScript 程式碼,例如: Chrome 中的 V8

Dart Web 包含兩種編譯模式:

  • 一個為快速開發提供幫助的增量編譯器。

  • 一個為生產環境最佳化的編譯器,可以將 Dart 程式碼編譯成快速、緊湊、可部署的 JavaScript。它的高效之處在於使用了類似消除無用程式碼的最佳化。

更多相關資訊:

Dart 執行時環境

不論你在哪個平臺上使用、選擇如何建構你的程式碼,執行程式碼時都需要一個 Dart 執行時環境。這個執行時環境負責下面的關鍵任務:

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

  • 執行 Dart 語言的型別體系: Dart 語言裡大多數型別檢查都是靜態的(編譯時),但仍有部分檢查是動態的(執行時)。比如,Dart 執行時環境會在遇到 型別判斷運算子 時執行動態檢查。

  • 管理 isolates: Dart 執行時環境會負責控制主 isolate(程式碼通常在這裡執行)以及其他應用建立的 isolate。

在原生平臺上,Dart 執行時環境被自動包含在獨立的可執行檔案中,是 dart run 命令提供的 Dart VM 的一部分。

學習 Dart

學習 Dart 有很多選擇。以下是我們推薦的一些方法: