写点什么

你的 Flutter 应用该考虑迁移代码了:Dart 3 将在 2023 年成为 100% 健全的空安全语言

  • 2022-12-12
    北京
  • 本文字数:2738 字

    阅读完需:约 9 分钟

你的Flutter应用该考虑迁移代码了:Dart 3将在2023年成为100%健全的空安全语言

谷歌 Dart 语言即将告别 null 值,开发者们必须在 Dart 3 正式到来之前调整自己的代码。

 

根据计划,在 Dart 编程语言的第三个主要版本于 2023 年年中首度亮相时,将不允许在非必要位置使用 null 值。

 

在该上下文中,null 代表一个赋值,用于表示不存在值或引用的对象。Null 引用最早可以追溯到 1964 年左右,当时英国计算机科学家 Tony Hoare 在 ALGOL 语言家族中引入了这个概念。他认为这是个“价值十亿美元的错误”,这里指的是修复此错误将要耗费的时间和金钱总值。这个判断相当精准,毕竟时至今日 null 仍然相当令人头痛。

 

从 2.12 版本开始,Dart 逐渐获得了健全的 null 安全性支持——一种防止对被设定为 null 的变量进行错误访问的方式。虽然出手修复,但 Dart 仍然保留了不加 null 安全(或部分 null 安全)保护直接运行代码的模式。

 

但从 Dart 3 开始,这些非最优解将彻底消失。

 

来自谷歌的编程语言

 

Dart 是一种面向对象、带垃圾收集的类 C 语言。维基百科的定义是:“Dart 是谷歌开发的一种通用编程语言,后被 Ecma 认定为标准(ECMA-408)。它被用于构建 Web、服务器、桌面和移动应用程序。”

 

在 2011 年 10 月 10 日的 GOTO 大会上,谷歌的两位工程师发布了“Dart”,旨在帮助开发者构建 Web 应用程序。

 

Dart 1.0 于 2013 年 11 月 14 日发布,曾经踌躇满志地想要取代 JavaScript 成为 Web 开发的首选语言。然而不久后,谷歌放弃了这个想法。因为 Dart 不仅仅在语言本身,包括它的整个生态圈,都比 JavaScript 落后了一大截。Dart 开发团队转而求其次,在可以被编译成 JavaScript 的同时,Dart 在 2.0 版本中也针对 Web 和移动客户端开发进行了独特优化,从而能让它更好地满足客户端开发人员的需求。

 

在谷歌内部, AdWords、AdSense 和 Fiber 项目团队都把 Dart 融入他们的前端应用开发。而随着跨平台移动 UI 框架 Flutter 的走红,作为 Flutter 的御用开发语言,Dart 也一时名声大噪。

 

与往常一样,来自谷歌的所有事物都能引发科技产业的极大兴趣,因此多年来,已经有不少其他公司用 Dart 来构建自己的关键性应用程序。

 

根据 Stack Overflow 开展的 2022 年开发者调查,Dart 目前在编程语言领域的流行度排名第 16 位。在近 72000 名受访者 2 中,约有 6.54%正在使用 Dart;相比之下,9.16%的受访者正在使用 Kotlin(第 15 位),9.32%在使用 Rust(第 14 名),11.15%的人在使用 Go(第 13 名)。苹果的 Swift 编程语言排在第 19 位,占比 4.91%。在全部受访者当中,应用最广的编程语言是 JavaScript,这位冠军的覆盖率达到了惊人的 65.36%。

 

让 Dart 成为更安全的编程语言

 

不少现代编程语言都支持 null 安全(也称空安全),解决的是 null 引用的问题。Tony Hoare 曾将其称为一个价值十亿美元的错误:“这导致了无数的错误、漏洞和系统崩溃,在过去四十年间造成了价值十亿美元的痛苦和损失。”

 

为了解决这个问题,Swift、C#和 Kotlin 等语言开始支持一种类型系统,开发者可以在其中将变量声明为非 null(永远不能保存为 null 值)或可 null(可以保存为 null 值)。这个类型系统可以与静态分析配合使用,检测是否将 null 赋值给了不可为 null 的变量。Dart 语言中的 null 安全支持也采取类似的模式,默认情况下变量不可为 null,仅在显式声明时才允许为 null。

 

在此基础上,Dart 更进一步,引入了健全 null 安全机制。这种健全机制保证,意味着不可为 null 的变量永远不会被赋予 null 值。

 

并不是每种语言的 null 安全实现都能如此稳定:Swift 在设计之初就考虑到了健全性;TypeScript 本质上并不健全,因为其底层类型系统允许将任何对象视为任意静态类型。所以在 TypeScript 当中,开发者其实仍可以将 null 值分配给非 null 变量。至于 C#这边,出于使用习惯和避免迁移所有当前代码的考虑,其中仍保留了几个例外。Kotlin 同样存在几个不合理的例外,部分原因是为了保持与 Java 的互操作性。举例来说,泛型类型可能导致声明包含非 null 元素的列表中流入 null 值。

 

Dart 与 Flutter 产品经理 Michael Thomsen 发布博文解释称,“我们的下个版本 Dart 3 将彻底完成通往绝对 null 安全语言的发展之旅。作为旅程的最后一步,我们将删除各个遗留 Dart 语言及 SDK 工件,不再支持非 null 安全条件下的运行模式。”

 

迁移到 Dart 3 的成本

 

但这一切也是有代价的。如果没有健全的 null 安全,由 2.12 或更早版本生成的带有 SDK 约束设置的 pubspec 文件(Dart 包的元数据)将根本无法兼容 Dart 3:“在 Dart 3 中,健全 null 安全将成为唯一受支持的模式。使用 2.12 及更早 SDK 约束版本的 pubspec 文件将无法在 Dart 3 或后续版本中正常解析。当约束设置为小于 2.12(例如 e.g. // @dart=2.9)时,任何包含语言标记的源代码都将报错。”

 

自 2.12 版本起,Dart 语言引入 null 安全已经有三年时间了,Dart 语言开发团队也意识到迁移现有 Dart 包和应用程序所造成的影响

 

为了降低迁移门槛,Dart 支持以三种方式运行应用程序代码,首先,可以在不启用 null 安全的前提下运行,也可以在启用部分 null 安全的混合模式下运行,最后可以在采取健全 null 安全的情况下运行。当代码 100%(包括所有依赖项)完成迁移时,即可实现健全 null 安全。如此一来,Dart 开发者就有时间一步步完成代码迁移。但请注意,支持多种模式也会增加维护开销和代码复杂度。

 

首先,Dart 开发者应当了解这三种模式选项。在阅读一段 Dart 代码时,首先应检查语言版本,据此判断类型会被默认为非 null、默认为可 null 或者二者兼有。其次,编译器和运行时若支持全部三种模式,则会拖慢 Dart SDK 的开发速度。这意味着新功能的添加成本和复杂度都会随之提升。

 

关于迁移的更多信息,谷歌也提供了参考迁移指南(https://dart.dev/null-safety/migration-guide)。

 

根据 Thomsen 的解释,约有 85%的 Flutter 代码(用 Dart 编写而成)能够直接支持健全 null 安全。而对于余下的 15%应用程序和软件包,开发者们必须在 Dart 3 正式到来之前调整自己的代码(please migrate before Dart 3 ships)

 

大型代码库的迁移可能需要一些时间。目前,德国汽车制造商宝马公司最近刚刚对其 MyBMW 应用进行了一轮 null 安全代码修订。这是一款由约 300 人开发者团队用 Flutter 构建的大规模应用程序。宝马公司移动应用开发主管 Christian Schmid 表示,“虽然对于像 MyBMW 应用这样的大型代码库来说,null 安全迁移工作并非易事,但谷歌提供的工具确实在迁移中给了我们很大帮助。在迁移完成之后,我们终于得到了一套更不容易出错的代码库。”

 

在 Dart 3 发布之后,该语言的下一个重要里程碑可能是支持将 Dart 代码编译为 Wasm。如此一来,Flutter Web 应用程序就能在浏览器中以本机代码的形式运行。当然,这项工作需要 W3C 和浏览器开发商合作,通过 WasmGC 扩展让 Wasm 能够支持各类垃圾收集语言(包括 Dart)。

 

参考资料:

https://medium.com/dartlang/the-road-to-dart-3-afdd580fbefa

https://www.theregister.com/2022/12/09/google_dart_null_safety/

2022-12-12 15:5522422

评论

发布
暂无评论
发现更多内容

SQL也能做AI ?没错!MLOps Meetup V3 回顾|OpenMLBD+SQLFlow+Byzer

星策开源社区

人工智能 机器学习 sql 特征平台

Python已有列表和字典,为什么还需要元组?

迷彩

Python Python基础知识 元组 7月月更

渲染与云渲染:一部电影的制作25%的时间是在“等”

Finovy Cloud

GPU服务器

【刷题记录】11. 盛最多水的容器

WangNing

7月月更

Docker(二)Docker-Compose、网络、数据卷

神农写代码

AWS Config

冯亮

云计算 DevOps 架构师 AWS 产品解决方案

包装类型

7月月更

金融行业开放平台

穿过生命散发芬芳

7月月更 开放平台

九联科技开发板正式合入OpenHarmony主干

科技汇

17张图带你深度剖析 ArrayDeque(JDK双端队列)源码

程序员小毕

Java 源码 程序员 jdk 队列

小程序媒体组件-1

小恺

7月月更

linux之拖拽上传文件

入门小站

Linux

谈Java Record类

ES_her0

7月月更

Codeforces Round #787 (Div. 3)

KEY.L

7月月更

在创建生成WIFI二维码手机扫码链接

入门小站

工具

在线SQL转YAML工具

入门小站

工具

自动化生成Javascript调用后台代码v0.5.3版本

百家饭隐私计算平台创业者

JavaScript API

行业首个「视频直播技术最佳实践图」发布!

阿里云CloudImagine

阿里云 音视频 直播

Flutter 模拟火箭发射动画

岛上码农

flutter ios 移动端开发 安卓开发 7月月更

【Docker 那些事儿】容器数据卷的妙手

Albert Edison

Docker Kubernetes 容器 云原生 7月月更

新书上市 | 图解、幽默、有趣、简单的 Java 书

图灵教育

Java 程序员 计算机

使用 SSH 方式拉取代码

攻城狮杰森

git GitHub SSH gitee 7月月更

Allure测试报告怎么设置

和牛

测试

鸿湖万联致远开发板正式合入OpenHarmony主干

科技汇

JSON 和JavaScript 介绍与区别

devpoint

JavaScript json 7月月更

Allure测试报告怎么设置

和牛

测试

手动上传表单数据+图片文件功能

猪痞恶霸

前端 7月月更

电商平台数据可视化监控系统-Echarts-vue项目综合练习

武师叔

7月月更

异步 API 设计之扇入扇出模式

宇宙之一粟

API 7月月更

你的Flutter应用该考虑迁移代码了:Dart 3将在2023年成为100%健全的空安全语言_移动_Tina_InfoQ精选文章