likes
comments
collection
share

Flutter - 为什么选择 Dart

作者站长头像
站长
· 阅读数 17

到底是什么让 Dart 脱颖而出,使得 Flutter 团队从茫茫语言中选择了它?

1. 多编译模式

首先,最最重要的一点就是Dart多样化的编译方式。一般来说,静态类型语言(例如 C / C++)主要是以 AOT(Ahead Of Time)的方式编译,而动态类型语言(例如 JavaScript)则是以 JIT(Just In Time)的方式编译。而 Dart 作为一个静态类型语言,不但是众多编程语言中少数同时支持 AOT 和 JIT 的语言,而且可以转译成 JavaScript,甚至还可以作为直译式语言,在 Dart VM 上直接执行。支持 JIT 编译让 Flutter 在开发阶段能够通过 Hot Reload 进行极为快速的迭代,而支持 AOT 编译则让 Flutter 能在部署时产生启动快、执行快且可预期的 ARM Code。通过 Dart 实现的 Stateful Hot Reload 不仅大幅提升了 Flutter 的开发效率,而且进一步影响了 Flutter UI 的编写方式。

2. 单一 UI 语言

在早期的原生开发中,不论是 iOS 或 Android,编写 UI 时大多都会使用各自的模板语言(xib / XML),并搭配 IDE 提供的工具进行快速编辑和预览。当然也有人因为各种因素选择直接使用代码来编写 UI,但相对的就必须经过冗长的编译过程才能看到修改的结果。Stateful Hot Reload 彻底解决了这个问题。当我们可以在毫秒内在设备上直接看到我们修改 UI 代码的结果,我们就不再需要 IDE 的辅助工具来进行预览,同时也就不需要另一套辅助的模板语言来编写 UI。当我们可以使用一套语言,在一个领域完成所有UI相关的代码,不但让 Flutter 的学习门槛进一步降低,也避免了在不同编程语言和模板语言间进行情境转换所造成的开发效率损失。最后,当你使用编程语言而非模板语言来撰写 UI,你的 UI 代码同时也得到了该语言的所有特性、弹性和安全性。你也不再需要奇特的语法来将一点点代码塞入模板中(例如Android Databinding,React JSX),你可以拥有全部。

再次强调,没有 Hot Reload 这一切都不会发生,而 Dart 是世上少数同时拥有 JIT 和 AOT 的语言,在实现了 Hot Reload 的同时也能兼顾到发布时的性能。

3. 快速对象分配及回收

首先,Flutter UI 设计受到了 React 很大的启发,它是陈述式以及复合式的。不同于React的是,Dart作为面向对象语言,自然是以Class而非Function作为复合的主要元素。最后,Flutter不但采取了复合,而且还进一步实现成了激进式复合(Aggressive composability)。套一个简单的背景色,你得复合一个DecoratedBox;想要居中,你要再复合一个Center;想加入点击事件,再一个GestureDetector。这每一层都是一个需要被分配的对象。这样的设计让 Flutter 在绘制 UI 时必须不断分配和回收大量微小又短命的对象,而 Dart 独特的对象分配和回收机制正好适合这个任务,使其不会在 GC 时卡住 Flutter 引以为傲的 60FPS。


总结来说,未来 Dart 在语法特性上很可能会逐渐赶上 C#、Swift、Kotlin 等其他强大的语言,但同时又保有最重要的多编译模式。试想如果当初 Flutter 团队选择的是 Kotlin,能有多少影响力请 Kotlin 团队放下所有 issue / feature,全力开发能支持极快速 Stateful Hot Reload 的 JIT / AOT 双编译模式?我想可以说 Flutter 团队不是选择了 Dart,而是选择了一个能让它尽情培养,年轻但潜力无穷的编程语言。