非Flutter场景下Dart编译中的snapshot是什么?与可执行文件有何区别?
Dart编译产物Executable与Snapshot的差异及Snapshot命名由来
1. 二者核心差异
你提到的「Executable内置Dart runtime而Snapshot没有」确实是最核心的区别,二者的具体差异可以总结为两点:
- *可执行文件(Executable)*是自包含原生程序:它由「目标平台的可执行文件启动壳 + 对应架构的AOT编译产物 + 精简版Dart运行时」打包而成,分发到对应操作系统后无需安装Dart SDK即可直接运行,体积通常比同代码的Snapshot大几MB。
- *各类Snapshot(AOT/JIT/Kernel快照)*是非独立序列化数据文件:仅存储了不同编译阶段的代码、VM运行状态数据,本身不具备可执行能力,必须依赖对应版本的Dart VM/运行时加载才能运行,体积更小,适合预装了Dart环境的场景使用。
补充说明:本质上Executable就是把AOT快照和运行时打包在了一起,二者的业务代码编译产物没有本质区别。
2. Snapshot的命名由来
Snapshot的命名来自它的设计初衷:早期Dart作为解释型语言运行时,每次启动都要依次完成源码解析、语义分析、中间码生成、Runtime状态初始化等流程,启动速度很慢。
Snapshot本质是某一时刻Dart VM运行状态的序列化镜像,就像给当时的VM运行环境拍了一张「快照」:下次启动时不需要重新走完整的编译初始化流程,直接把快照文件加载到VM内存里就能快速恢复到快照记录的状态,大幅提升启动速度,因此得名Snapshot。
不管是Kernel(中间码阶段)、JIT(带运行时优化信息)、AOT(提前编译为机器码)快照,都是不同编译运行阶段的VM状态序列化产物。
内容的提问来源于stack exchange,提问作者Ben Butterworth
相关产品推荐
相关产品推荐

