Dart 概述
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) - 支援非同步程式設計,提供
Future和Stream等類(dart:async) - 高效處理固定大小資料(例如,無符號 8 位元組整數)和 SIMD 數值型別的列表(
dart:typed_data) - 非 Web 應用程式的檔案、套接字、HTTP 和其他 I/O 支援(
dart:io) - 用於與其他呈現 C 風格介面的程式碼進行互操作的外部函式介面(
dart:ffi) - 使用隔離區(isolates)的併發程式設計——獨立工作單元,類似於執行緒但不共享記憶體,僅透過訊息通訊(
dart:isolate) - HTML 元素和其他資源,用於需要與瀏覽器和文件物件模型 (DOM) 互動的基於 Web 的應用程式(
dart:js_interop和package:web)
除了核心庫之外,許多 API 透過一套全面的包提供。Dart 團隊釋出了許多有用的補充包,例如這些
此外,第三方釋出者和更廣泛的社群釋出了數千個包,支援以下功能
要檢視 Dart 核心庫的一系列工作示例,請閱讀核心庫文件。要查詢其他 API,請檢視常用包頁面。
Dart:平臺
#Dart 的編譯器技術允許您以不同方式執行程式碼
本機平臺:對於面向移動和桌面裝置的應用,Dart 包含帶即時 (JIT) 編譯的 Dart VM 和用於生成機器碼的預先 (AOT) 編譯器。
Web 平臺:對於面向 Web 的應用,Dart 可以編譯用於開發或生產目的。它的 Web 編譯器將 Dart 轉換為 JavaScript 或 WebAssembly。
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。以下是一些我們推薦的
- 透過 DartPad(一個基於 Web 的 Dart 程式碼執行環境)在瀏覽器中探索 Dart。
- 瀏覽 Dart 語言之旅,它向您展示如何使用每個主要的 Dart 特性。
- 完成一個 Dart 教程,涵蓋使用 Dart 構建命令列應用的基礎知識。
- 參加由 Dart 專家提供的全面線上培訓。
- 探索描述 Dart 核心庫的 API 文件。
- 閱讀一本關於 Dart 程式設計的書.