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

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

公众号新闻

编译 | 核子可乐、Tina
谷歌 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/

声明:本文为 InfoQ 翻译整理,未经许可禁止转载。

今日好文推荐

重磅!阿里开源自研高性能核心搜索引擎Havenask

程序员离职后为泄私愤远程锁公司服务器硬盘;前程无忧宣传语嘲讽“996”职场人;Twitter 开源工作停摆| Q资讯

再不重视软件开发工具就晚了

“睡车间”、削减一切,马斯克为SpaceX定制的文化,不能照搬到互联网公司

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
马斯克抱洗手池进Twitter,要求特斯拉工程师审查Twitter代码。。。【1.14折扣】Boots/Hollister罕见5折!麦昆鞋6折!Urban Outfitters白菜25折!新版TensorFlow又立flag!官方团队明确「四大支柱」:承诺100%向后兼容,2023年发布故乡遥,何日去?欧洲科学院院士沙赫兰·杜斯塔:“弹性”边缘计算赋能AR/VR应用《满江红》片方提起诉讼/疑小米汽车设计效果图曝光/苹果头显或支持Siri创建AR应用NSA:建议从 C/C++ 切换到内存安全语言全面审查Twitter代码、当场炒掉CEO等众多高管:马斯克正式入主Twitter每秒1000000000000000000次运算!Cerebras新超级计算机打造世界最大1350万核心AI集群王思聪也该考虑一下万达了NeurIPS 2022 | 全新迁移学习范式DeRy,把知识迁移玩成活字印刷美众议院封杀TikTok!禁止在官方设备上使用该应用股市在2022年的所有忧虑,在2023年第1个月烟消云散。从近日北京出现的反标说起。。用脚丈量曼哈顿(一)比亚迪全面进军英国!2023将在英开店卖电车苹果头显团队放出多个招聘:面向AR/VR应用开发,看重游戏、虚拟效果方面能力Twitter正式启动蓝勾勾付费制 | 拜登突向Twitter发难!bitter是苦,sweet是甜,bittersweet是又苦又甜...大学录取该不该考虑肤色?这群亚裔学生认为...好难证明你是国内父母的孩子马萨诸塞州最低工资达到15/h;Modern Butcher Shop将在2023年搬到波士顿附近蔚来宣布将在欧洲增加买断模式,将在2023年初开启交付积木式深度学习的正确玩法!新加坡国立大学发布全新迁移学习范式DeRy,把知识迁移玩成活字印刷|NeurIPS 2022瞧不上 C++ 和 D 语言,国外程序员将 5.8 万行代码迁移到 Jai 语言,到底图什么?Dart 3 将成为 100% 健全的空安全语言苹果狂整花活:嘿,Siri!给我做一个AR应用前瞻:Flutter 编写的全新 Ubuntu 安装程序209万后,王思聪也该考虑一下万达了出书了简直像“穿越时光”!航班在2023年起飞 却在2022年降落 跨年2次简直赚到消息称三星Galaxy S23将搭配一款SmartThings无线充电器Dart 3将成为100%健全的空安全语言C++ 之父:Rust等内存安全语言的安全性并不优于C++Dunkin 回归Midnight Coffee 并推出全新Brown Butter Toffee Latte 及新年优惠
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。