探索Flutter:Dart运行机制(Runtime)的初步学习

发表时间: 2021-08-23 00:37

学习一个框架,不单单要学习它的上层建筑,还要对框架基础要有一定的了解,清楚它的优缺点,才能在后续开发实践过程中,对遇到的技术问题有更好的认知,才能在性能优化环节有的放矢。

Why Dart

Flutter框架为什么选择Dart语言?语言学家认为一个人说话的自然语言会影响到他的思维方式,不同语言的人对事物的理解以及处理方案经常千差万别。这个理论对于编程框架以及编程语言同样适用。

  • Dart 支持JIT(Just in time)编译,开发效率高,不需要漫长的编译再运行,同时可以实现热重载(微秒级),应用程序在重载时会将isolate的堆(驻留在堆中的对象)序列化成二进制快照,并且在重新运行时将快照反序列化,从而实现状态的恢复并运行,这点在开发过程中非常高效。
  • Dart 支持AOT(Ahead of time)编译,发布版本运行速度快,启动时间短,通过编译成高效的机器语言,不仅是的FLutter运行速度快,还可以在编译环节就发现问题。
  • 单线程模型类似于Javascript,不需要抢占式任务,而是通过用户显示控制任务让出CPU控制权,(通过async/await、Futurn以及Stream),使得并发任务流程可控,无需加锁来保护共享资源(加锁可能出现死锁以及交互卡顿)
  • 先进的垃圾回收机制(GC)以及对象分配机制,dart使用分代垃圾回收以及对象分配方案(Generational GC)。它的主要作用就是当一个对象被实例化(instantiated)或者变成不可达(unreachable)时,对内存资源进行分配以及释放。后面会对GC专门说明。

Debug模式与Release模式

Dart components in Flutter’s debug and release modesDart components in Flutter’s debug and release modes

Dart 是在 Dart VM虚拟机环境执行的,但是这并不意味着Dart只能采取解释执行的方式,同时Dart VM还包括一种AOT管道可将代码编译为机器代码,然后运行在虚拟机的精简环境中,称之为预编译运行时环境(precompiled runtime),该环境不包括解释器等组件,无法动态加载Dart源代码

  • 上图左边是Debug模式运行环境:Runtime、JIT编译器/解释器、调试以及性能分析服务。
  • 上图右边是Release模式运行环境,只保留Runtime。