前言
每门语言都有各自的特点,适合自己的才是最好的
(一)JIT 与 AOT
Dart 是少数同时支持 JIT(Just In Time,即时编译)和 AOT(Ahead of Time,运行前编编译)的语言之一,这使Dart具有运行速度快、执行性能好的特点
那么 JIT 和 AOT 分别是什么呢?
JIT:在运行时即时编译,在开发周期中使用,可以动态下发和执行代码,开发测试效率高,但运行速度和执行性能则会因为运行时即时编译受到影响(代表语言 JS、Python)
AOT:即提前编译,可以生成被直接执行的二进制代码,运行速度快、执行性能表现好,但每次执行前都需要提前编译,开发测试效率低(代表语言 C、C++)
(二)内存分配与垃圾回收
Dart VM 的内存分配策略比较简单,创建对象时只需要在堆上移动指针,内存增长始终是线性的,省去了查找可用内存的过程
在 Dart 中,并发是通过 Isolate 实现的。Isolate 是类似于线程但不共享内存,独立运行的 worker。这样的机制,就可以让 Dart 实现无锁的快速分配
Dart 的垃圾回收,则是采用了多生代算法,新生代在回收内存时采用“半空间”机制,触发垃圾回收时,Dart 会将当前半空间中的“活跃”对象拷贝到备用空间,然后整体释放当前空间的所有内存。回收过程中,Dart 只需要操作少量的“活跃”对象,没有引用的大量“死亡”对象则被忽略,这样的回收机制很适合 Flutter 框架中大量 Widget 销毁重建的场景
(三)单线程模型
支持并发执行线程的高级语言(比如,C++、Java、Objective-C),大都以抢占式的方式切换线程,即:每个线程都会被分配一个固定的时间片来执行,超过了时间片后线程上下文将被抢占后切换。如果这时更在更新线程间的共享资源,抢占后就可能导致数据不同步的问题。解决这个问题的方式,使用锁来保护共享资源,但锁本身又可能会带来性能损耗,甚至出现死锁
Dart 是单线程模型,因为它天然不存在资源竞争和状态同步的问题。这就意味着,一旦某个函数开始执行,就将执行到这个函数结束,而不会被其他 Dart 代码打断。所以 Dart 中并没有线程,只有 Isolate(隔离区)。Isolate之间不会共享内存,就像几个运行在不同进程中的 worker,通过事件循环(Event Looper)在事件队列(Event Queue)上传递消息通信
(四)无需单独的声明式布局语言
Flutter 可以通过 Dart 编译定义,并不需要类似 JSX 或 XML 的声明式布局语言,易于阅读和可视化,开发中更不需要可视化界面构建起,因为热重载可以让我们立即在手机上看到运行效果
总结,Dart 的未来
Dart 是一个优秀而年轻的现代语言,但一种编程语言并不是搞定了引擎和开发者接口就算完成了,而是必须在这个语言得以立足的库、框架、 应用程序等“生态”都成熟起来之后,其价值才会真正开始体现。而要走到这一步,通常需要花上数年的时间。
目前,基于 Dart 语言的第三方库还很少,并且质量一般,不过值得庆幸的是,因为 Flutter 和 Fuchsia 的推动,Dart SDK 更新迭代的速度快了很多,开发者的热情也急剧增长,Dart 生态增速很快。
毕竟,在 Dart 社区目前最顶级的产品就是 Flutter 和 Fuchsia 了,因此 Dart 开发者主要以 Flutter 开发者居多,当然了也有用 Dart 开发浏览器前端的开发者,但人数并不多。所以,我觉得 Dart 是否能够成功,目前来看主要取决于 Flutter 和 Fuchsia 能否成功。而,Flutter 是构建 Fuchsia 的 UI 开发框架,因此这个问题也变成了 Flutter 能否成功。
现在,我们一起回到 Flutter 自身来看,它的出现提供了一套彻底的跨平台方案,也确实弥补了当今跨平台开发框架的短板,解决了业界痛点,极有可能成为跨平台开发领域的终极解决方案,前途光明,未来非常值得期待。