|
去年 12 月,我们通过第一篇讨论 Dart 3 的博文让我们瞥见了未来。今天——在肯尼亚内罗毕举行的Flutter Forward开发者活动现场直播——我们分享了 Dart 下一个主要版本的更广阔愿景,以及我们的第一个预览构建,Dart 3 alpha。
我们对 Dart 的使命是创建最好的编程语言,用于在任何应用程序平台上构建高质量的应用程序。Dart平易近人,简单易学,避免了不必要的复杂性,并且内部一致。Dart 是高效的;应用程序开发人员始终面临着要求不断变化的应用程序的压力,他们需要在更短的时间内交付具有毫不妥协的质量和完成度的应用程序。因此,我们构建 Dart 的重点是实现快速开发、快速迭代和高质量。而且 Dart 是可移植的,跨越最广泛的平台集,使您能够将应用程序部署到今天和明天的设备上。
多年来,我们一直致力于建立这些品质。对于 Dart 3,我们打算迈出又一大步,以重要的方式改进和扩展可访问性、生产力和可移植性。
Dart 3 是一个新的主要版本。部分是为了表示新功能向前迈出了一大步,部分是因为它在语义版本控制方面是一个突破性的版本:我们正在更改类型系统以仅支持健全的空安全(在 Dart 2.12 和更高版本中这是可选的),并在 Dart 的核心库中进行了相应的重大更改。让我们深入了解细节!
在过去的几年里,我们快速发展了 Dart 语言,自 2.0 以来增加了 23 项新功能。在 Dart 3 中,我们希望添加两个新的主要功能,记录和模式,目的是提高结构化数据的处理效率。
记录允许您从任何现有数据高效简洁地创建匿名复合值,而无需声明一个类来保存这些值的概念开销。有了记录,您可以轻松构建新的数据结构来组合现有数据。例如,要返回一对值:
在记录允许您组合数据的地方,模式可以将复合数据分解为其组成部分。例如,要将geoLocation上面的返回值(由一对整数组成的记录)解构为两个单独的int变量,lat和long,您可以使用这样的模式声明:
模式是完全类型安全的,并在开发过程中进行检查。
您还可以对值的类型进行模式匹配,例如来自类的层次结构。Aswitch可以使用匹配类型的模式,以及每种类型的各个字段,如此处的正文calculateArea所示:
总的来说,我们正在添加大量可供选择的模式,将这些模式组合在一起后,可以使 Dart 对结构化数据更具表现力。
结合模式,我们还通过几个新的修饰符向类添加功能控制:
- interface class: 无法扩展。
- base class: 禁用隐式接口,因此无法实现。
- final class: 不能在类中扩展、实现或混合(在当前库之外)。
- sealed class:与 abstract + final + 类型相同,该类型被认为是用于穷举检查的密封类型族的根。Shape以上面的类层次结构为例。在Shape类型的 switch 语句中(如calculateArea函数),如果 switch 语句未处理密封类型的所有可能子类型,则分析器将触发错误。
- mixin class:一个可以用作mixin的类。
每一个新特性都增加了语言的复杂性。为了确保 Dart 保持平易近人,类默认情况下是完全宽松的,就像今天一样,除了一个小例外,即打算用作 mixins 的类现在必须使用mixin关键字。
我们正在努力扩展 Dart 语言的互操作性,以便直接从 Dart 调用平台库。在 Apple 平台上,我们正在为 C 互操作性构建我们的 FFI工作,它支持从 Dart 调用任何遵循 C 调用约定的 C 模块。到目前为止,它已经支持 C、Go 和 Rust 等语言。现在,我们在iOS/macOS上添加了对 Swift 和 Objective-C 的支持。在 Android 上,您可以利用 FFI 和 Android 的 Java 本机接口 (JNI) 调用以 Kotlin 编写的 Jetpack 库和以 Java 编写的 Android 库。
在新工具的支持下,Dart 可以根据原始 C/ObjC/Swift/Java/Kotlin 代码的头文件/接口文件,自动创建具有 Dart 接口的绑定以及那些跨语言互操作代码背后的绑定。有关使用它调用 Apple 的Core Motion API和 Android 的HealthConnect API的演示,请查看示例应用程序。
这些新的互操作机制目前处于试验阶段,但我们希望它们至少能在 Dart 3.0 稳定版中达到 beta 质量。欢迎在Java/Kotlin或C/ObjectiveC/Swift的问题跟踪器中提供反馈。最后,我们还致力于改进 Dart 与 JavaScript 的互操作;我们将在以后的博文中发布更多相关消息。
Dart 已经通过我们的本地和网络编译器支持广泛的目标平台。在 Web 上,我们目前编译为 JavaScript。在本机设备上,我们目前支持 Intel 32 位和 64 位以及 ARM 32 位和 64 位架构。我们正在努力增加对许多新兴设备和标准的支持,以确保 Dart 为未来的设备做好准备。
对于网络,我们正在努力支持WebAssembly (Wasm),它作为一种平台中立的二进制指令格式在所有现代浏览器中都在不断成熟。我们希望 Wasm 能够使 Dart 网络应用程序的启动速度与本机设备上的应用程序一样快。
另一个越来越受到关注的平台架构是RISC-V,这是一种为广泛使用而设计的开放标准指令集架构 (ISA)。Android 团队最近就他们支持 RISC-V 的工作发表了演讲,我们认为它也将广泛适用于嵌入式设备。对 RISC-V 的支持可在 Dart 3 alpha 中预览。
最后,我们正在努力扩展我们当前对 ARM 设备的支持,以涵盖 Windows 上的 ARM64 支持。
介绍了新的 Dart 3 功能后,让我们转向本着更一致、更易于使用的 Dart 的精神所做的重大更改。
我们在 2021 年的Dart 2.12中引入了可靠的空安全性。在可靠的类型系统中,您可以信任类型,这意味着当类型声明它不是时,变量永远不会为空。这通过在开发过程中而不是在生产过程中发现问题来提高生产力,并使 Dart 编译器能够生成更小和更优化的代码。正如我们在 12 月讨论的那样,Dart 在为现有语言引入 100% 可靠的空安全方面是独一无二的。
从 Dart 2.12 开始,null safety 成为一个配置选项,可以是on或off。在 Dart 3 中,所有代码在. 不再可能在没有空安全的情况下或在具有部分空安全的混合模式下运行应用程序。
我们意识到停止支持在没有空安全的情况下运行可能会给现有的应用程序和包带来问题。然而,我们认为现在是推进这一改变的正确时机。拥有单一类型系统,空安全始终开启,可以减少开销和复杂性。每当开发人员阅读一段 Dart 3 代码时,他们可以放心,默认情况下所有变量都是非空的。在实现方面,Dart 的编译器和运行时可以专注于支持运行 Dart 代码的单一方式,这降低了添加新功能的成本和复杂性。
Dart 生态系统表现出了将现有代码迁移到空安全的强烈奉献精神和意愿。截至今日,
- pub.dev 上 100% 的前 250 个包都支持空安全
- pub.dev 上 98% 的前 1000 个包支持空安全
- 只有 14% 的 flutter run session 仍然在没有空安全的情况下运行
感谢生态系统的迁移工作!
随着 Dart 语言和类型系统的发展,我们核心库中的一些 API 已经变得多余或不够理想。为了确保 Dart 仍然易于使用,我们进行了一些重大更改以清理不必要的 API。有关详细信息,请参阅 GitHub 问题#34233和#49529。我们还删除了默认参数值的历史语法 ( #2357 )。
随着 Dart 3 alpha 的完成,我们的注意力现在转向了 Dart 3 beta。在那里,我们希望通过添加一些新的 API 来进一步完善 Dart 核心库。您可以在反馈问题中对此提供意见。
一般来说,我们相信大多数已经迁移到使用空安全的代码,使用 Dart 2.12 或更高版本,将适用于 Dart 3。但是,一些小的包和应用程序子集可能会受到上面讨论的重大变化的影响。因此,为了让您有时间为今年晚些时候的 Dart 3 稳定版本做准备,我们没有计划在 Dart 3 alpha 之后对 Dart 语言和核心库进行任何进一步的重大更改。
为了利用已经迁移的代码来使用空安全,我们在 Dart 3 中实现了向后兼容性,这将允许迁移的包pub get在 Dart 3 中解析,尽管有像 SDK 版本约束>=2.12 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|