Dart源码学习01

1 篇文章 0 订阅

1、Dart历史

2、dart设计基础思想

3、Dart的编译模式

Dart VM 支持五种编译模式:

1, :最常见的 JIT 模式,可以直接在虚拟机中执行 Dart 源码,像解释型语言一样使用。通过执行dart xxx.dart就可以运行,写一些临时脚本,非常方便。

2, Kernel Snapshots: JIT 模式,和 模式不同的是,这种模式执行的是 Kernel AST的二进制数据,这里不包含解析后的类和函数,编译后的代码,所以它们可以在不同的平台之间移植在《Flutter’s Compilation Patterns》(https://proandroiddev.com/flutters-compilation-patterns-24e139d14177) 这篇文章中,将 Kernel Snapshots 称为 Snapshots 也是对的,这应该是之前的叫法,从 dart-lang 的 wiki 中可以看出来:Dart Kernel 是 Dart 程序中的一种中间语言,更多的资料可阅读 Kernel Documentation(https://github.com/dart-lang/sdk/wiki/Kernel-Documentation)。通过执行 dart --snapshot-kind=kernel --snapshot=xx.snapshot xx.dart生成。

3, JIT Application Snapshots:JIT 模式,这里执行的是已经解析过的类和函数,所以它会运行起来会更快。但是这不是平台无关,它只能针对 32 位或者 64 位架构运行。通过执行 dart --snapshot-kind=app-jit --snapshot=xx.snapshot xx.dart生成。

4, AOT Application Snapshots:AOT 模式,在这种模式下,Dart 源码会被提前编译成特定平台的二进制文件。要使用 AOT 模式,需要使用 dart2aot命令, 具体使用为: dart2aot xx.dart xx.dart.aot,然后使用 dartaotruntime命令执行。

5,Native: Datrt2.6以后提供可执行编译模式,dart2native 

 4、Flutter的编译模式

  • Script: 同Dart Script模式一致,虽然Flutter支持,但暂未看到使用,毕竟影响启动速度。
  • Script Snapshot: 同Dart Script Snapshot一致,同样支持但未使用,Flutter有大量的视图渲染逻辑,纯JIT模式影响执行速度。
  • Kernel Snapshot: Dart的bytecode模式,与Application Snapshot不同,bytecode模式是不区分架构的,Kernel Snapshot在Flutter项目中也叫Core Snapshot。这种模式可以归类为AOT编译。
  • Core JIT: Dart的一种二进制模式,将指令代码和heap数据打包成文件,然后在VM和isolate启动时载入,直接标记内存可执行,这是一种AOT模式。Core JIT也被叫做AOTBlob。
  • AOT assemblely:即Dart的AOT模式。直接生成汇编源代码文件,由各自平台自行汇编。
  • 开发阶段在开发阶段,我们需要Flutter的Hot Reload和Hot restart功能,方便UI快速成型。同时,框架层需要比较高的性能来进行视图渲染展现,因此开发模式下,Flutter使用了Kernel Snapshot模式编译,编译产物有:

    isolate_snapshot_data:用于加速 isolate 启动,业务无关代码,固定,仅和 flutter engine版本有关
    platform.dill:和 Dart VM 相关的 kernel 代码,仅和 Dart 版本以及 engine编译版本有关。固定,业务无关代码;
    vm_snapshot_data: 用于加速 Dart VM 启动的产物,业务无关代码,仅和 flutter engine 版本有关;
    kernel_blob.bin:业务代码产物

  • 生产阶段
    在生产阶段,应用需要的是非常快的速度,所以Android和iOS都选用了AOT打包,不过由于平台特性不同,打包模式还是有很大区别的。

    Android使用Core JIT编译模式,而iOS则使用AOT Assemblely。

    iOS跟Android不同的原因在于:App Store审核条例不允许动态下发可执行二进制代码

    Android也可以使用AOT Assemblely,但是这种方式需要支持多架构,增大代码包,而且还需要JNI调用,不如Core JIT的Java API方便,所以Android上默认使用Core JIT打包,而不是AOT Assemblely。

    Core JIT 的打包产物有 4 个:isolate_snapshot_data、vm_snapshot_data、isolate_snapshot_instr、vm_snapshot_instr。我们不认识的产物只有 2 个:isolate_snapshot_instr 和 vm_snapshot_instr,其实它俩代表着 VM 和 isolate 启动后所承载的指令等数据。在载入后,直接将该块内存执行即可

6、源码分析前置知识基础

   gn ,gni ,python ,C/C++

7、编辑配置

8、dart规范

Linter for Dart

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值