【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

你的 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:5514936

评论

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

Android图形渲染系统新

江湖修行

渲染 an'droid 渲染技术

前端经典react面试题(持续更新中)

xiaofeng

前端 React

打造语言大模型的生成式AI,澜舟科技一年内完成数亿元融资

澜舟孟子开源社区

人工智能 AIGC

焱融科技发布国内首个NVIDIA DGX A100 + 全闪存储参考架构白皮书

焱融科技

文件存储 容器存储 分布式文件存储 高性能存储 全闪存储

中国美妆行业私域服务商发展洞察

易观分析

商业 美妆

8个云成本优化的最佳实践

SEAL安全

FinOps 云成本管理

连接内网SSH新姿势,告别慢速度及防火墙限制

百川云开发者

Linux 远程连接 主机运维

OPPO 对话式 AI 助手小布演进之路

安第斯智能云

人工智能 AI IoT 跨端 语音助手

2022年国内CVC参与股权投资事件1341个,同比减少43.9%;智能制造、医疗健康和企业服务最受青睐丨睿兽分析CVC年报

创业邦

不被定义,思岚科技机器人底盘的百变扩展可能!

科技热闻

移动端应用性能多维监控——崩溃监控系统

Openlab_cosmoplat

工业互联网 开源社区 崩溃监控系统

读懂React原理之调和与Fiber

xiaofeng

前端 React

好朋友 TIME_WAIT

黑客不够黑

TCP协议 TIME_WAIT

深入理解 Taier:MR on Yarn 的实现原理

袋鼠云数栈

hadoop

前端常考vue面试题(必备)

yyds2026

Vue 前端

ChatGPT-4 来了, OpenAI 官宣6种已落地应用和服务模式

B Impact

基于rsync实现海量文件高速传输的解决方案

镭速

21天吃透这套字节面试题后,我成功跳槽进了字节,税后25K

做梦都在改BUG

Java 数据结构 面试 算法

如何评估某活动带来的大盘增量 | 得物技术

得物技术

AI 数据

大厂不同职级要求有何不同

致知Fighting

Java 后端 晋升

【NLP 系列】Bert 词向量的空间分布

京东科技开发者

人工智能 nlp NLP 大模型 BERT 企业号 3 月 PK 榜

[译]TIME_WAIT及其对协议和可伸缩客户端服务器系统的设计实现

黑客不够黑

TCP TIME_WAIT

细说React组件性能优化

xiaofeng

前端 React

前端必会vue面试题(必备)

yyds2026

Vue 前端

vue实战中的一些小技巧

yyds2026

Vue 前端

FeatHub:流批一体的实时特征工程平台

Apache Flink

大数据 flink 实时计算

京东前端高频react面试题及答案

xiaofeng

前端 React

Nautilus Chain 现已推出测试网“Triton ”,有哪些潜在的机会?

西柚子

Stage模型深入解读

HarmonyOS开发者

HarmonyOS

3.15 数据库吐槽大会

NineData

数据库 mongodb 云计算 程序员 图数据库

vue的几个提效技巧

yyds2026

Vue 前端

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