Flutter采用Dart语言开发,相信大家会有一个疑问,为什么不采用应用更为广泛的JavaScript、Java或者C语言呢?让我们先来看一下Dart中重要的核心特性。
JIT 与 AOT
Dart 是少数同时支持 JIT(Just In Time,即时编译)和 AOT(Ahead of Time,运行前编译)的语言之一。
- JIT 在运行时即时编译,一句一句边翻译边运行,如JavaScript、python等,事实上,所有脚本语言都支持JIT模式。
- AOT 即提前编译,在执行前全部被翻译为机器码,运行速度快、执行性能好,但每次执行前都需要提前编译,开发测试效率低。典型代表是用C/C++开发的应用,它们必须在执行前编译成机器码。
总结来讲,在开发周期中 使用JIT ,可以动态下发和执行代码,开发测试效率高,可以缩短产品的开发周期,在发布期使用 AOT,编译成快速、可预测的本地代码。所以说,Dart 具有运行速度快、执行性能好、开发效率高的特点。
内存分配与垃圾回收
Dart可以在没有锁的情况下进行对象分配和垃圾回收。Dart开发团队的很多成员都是来自Chrome团队的,像JavaScript一样,Dart避免了抢占式调度和共享内存,大多数支持并发执行线程的计算机语言(Java、Kotlin、Swift)都使用抢占式来切换线程,抢占就会产生竞态条件,竞态条件很有可能导致严重错误,如应用程序崩溃导致数据丢失等等,一般解决竞态条件使用锁来保护,但是锁本身可能导致卡顿,也有可能产生死锁,而Dart针对这个问题,采取了isolate方法来解决,那么Dart是单线程,因为它天然不存在资源竞争和状态同步的问题。这就意味着,一旦某个函数开始执行,就将执行到这个函数结束,而不会被其他 Dart 代码打断。Dart 中并没有线程,只有 Isolate(隔离区)。Isolates 之间不会共享内存,就像几个运行在不同进程中的 worker,通过事件循环(Event Looper)在事件队列(Event Queue)上传递消息通信。
类型安全
Dart是类型安全的语言,支持静态类型检测,可以在编译前发现一些类型的错误,并排除潜在问题,这一点对于前端开发者来说可能更具有吸引力。与之相比,JavaScript是一个弱类型语言,虽然前端社区出现了很多给JavaScript代码添加静态类型检测的扩展语言和工具,如TypeScript,相比之下,Dart本身就支持静态类型,这是它的一个重要优势。
Dart 集合了各种优秀语言的优点,容易学习,具有静态和动态语言用户都熟悉的特性。只要你有过其他编程语言,尤其是 Java、JavaScript、Swift 或 Objective-C 编程经验的话,可以很容易地在 Dart 身上找它们的影子,以极低的成本快速上手。