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 编程的书.