内容

Dart product logo

Dart 是一种针对客户端进行优化的语言,用于在任何平台上开发快速应用。其目标是为多平台开发提供最具生产力的编程语言,并为应用框架提供一个灵活的执行运行时平台

语言由其技术包络定义,即在开发过程中做出的选择,这些选择塑造了语言的功能和优势。Dart 专为特别适合客户端开发的技术包络而设计,优先考虑开发(亚秒级有状态热重载)和跨各种编译目标(网络、移动和桌面)的高质量生产体验。

Dart 还构成了 Flutter 的基础。Dart 提供了为 Flutter 应用提供支持的语言和运行时,但 Dart 还支持许多核心开发任务,如格式化、分析和测试代码。

Dart:语言

#

Dart 语言是类型安全的;它使用静态类型检查来确保变量的值始终与变量的静态类型匹配。有时,这被称为健全类型。尽管类型是强制性的,但由于类型推断,类型注释是可选的。Dart 类型系统也很灵活,允许使用 dynamic 类型结合运行时检查,这在实验期间或对于需要特别动态的代码很有用。

Dart 内置了健全空安全。这意味着除非您明确允许,否则值不能为 null。借助健全空安全,Dart 可以通过静态代码分析在运行时保护您免受空异常的影响。与许多其他空安全语言不同,当 Dart 确定一个变量为非空时,该变量永远不会为 null。如果您在调试器中检查正在运行的代码,您会看到非空性在运行时得以保留;因此是健全空安全。

以下代码示例展示了多种 Dart 语言特性,包括库、异步调用、可空和不可空类型、箭头语法、生成器、流和 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
  • 文件、套接字、HTTP 和其他 I/O 支持,适用于非 Web 应用程序(dart:io
  • 用于与提供 C 风格接口的其他代码进行互操作的外部函数接口(dart:ffi
  • 使用隔离进行并发编程——独立工作者,类似于线程,但不会共享内存,仅通过消息进行通信(dart:isolate
  • HTML 元素和其他资源,适用于需要与浏览器和文档对象模型 (DOM) 交互的基于 Web 的应用程序(dart:html

除了核心库之外,还通过一组全面的软件包提供了许多 API。Dart 团队发布了许多有用的补充软件包,例如以下这些

此外,第三方发布者和更广泛的社区发布了数千个软件包,支持以下功能

要查看展示 Dart 核心库的一系列工作示例,请阅读核心库文档。要查找其他 API,请参阅常用软件包页面

Dart:平台

#

Dart 的编译器技术允许你以不同的方式运行代码

  • 本机平台:对于针对移动设备和台式机设备的应用,Dart 既包括带有即时 (JIT) 编译的 Dart VM,也包括用于生成机器码的预先 (AOT) 编译器。

  • Web 平台:对于针对 Web 的应用,Dart 可以进行编译以用于开发或生产目的。其 Web 编译器将 Dart 转换为 JavaScript。

An illustration of the targets supported by Dart

Flutter 框架是一个流行的多平台 UI 工具包,由 Dart 平台提供支持,并提供工具和 UI 库,用于构建可在 iOS、Android、macOS、Windows、Linux 和 Web 上运行的 UI 体验。

Dart Native(机器码 JIT 和 AOT)

#

在开发过程中,快速的开发周期对于迭代至关重要。Dart VM 提供了带有增量重新编译(支持热重载)、实时指标收集(支持DevTools)和丰富的调试支持的即时编译器 (JIT)。

当应用准备部署到生产环境中时,无论您是发布到应用商店还是部署到生产后端,Dart 预先 (AOT) 编译器都可以编译到原生 ARM 或 x64 机器代码。您的 AOT 编译的应用启动时具有稳定、较短的启动时间。

AOT 编译的代码在高效的 Dart 运行时中运行,该运行时强制执行健全的 Dart 类型系统,并使用快速对象分配和 分代垃圾回收器 来管理内存。

更多信息

Dart Web(JavaScript 开发和生产)

#

Dart Web 可以在由 JavaScript 提供支持的 Web 平台上运行 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。以下是我们推荐的一些方式