【问题标题】:What is a snapshot in Dart or compilation (not Flutter)?Dart 或编译(不是 Flutter)中的快照是什么?
【发布时间】:2021-09-22 03:54:37
【问题描述】:

我正在阅读dart compile,它有几个选项:可执行文件AOT 快照JIT 快照内核快照JavaScript

可执行文件和快照有什么区别?是否纯粹是可执行文件包含 Dart 运行时/虚拟机,而快照不包含。为什么叫快照?


2 个高度相关的问题(我在发布此问题后发现)是:

这个问题与Dart: Snapshots vs AOT 不同,因为它询问的是快照和 AOT 之间的区别,但实际上 AOT 文件是快照。它还主要询问了快照选项(AOT、内核、JIT)之间的区别。

【问题讨论】:

    标签: dart compilation


    【解决方案1】:

    可执行文件(由dart compile exe 创建)是 AOT 快照和 Dart 运行时的组合。运行任何 Dart 代码都需要 Dart 运行时,因为它执行管理内存(包括垃圾收集)和执行运行时类型检查等关键任务。

    三种快照(AOT、内核和 JIT)都只包含编译后的源代码。它们都需要运行时才能运行(通常您只需使用dart run <snapshot>)。

    快照可能应该以不同的方式命名。 “模块”会更容易理解吗?

    【讨论】:

    • 谢谢!使用“字节码/字节码文件”而不是“模块”或“快照”是否正确?或者是不正确的。该文件似乎类似于 Java 的 .class 文件,其中包含 Java 字节码。或者,我们可以在文档中添加定义:“快照文件包含 Dart 字节码”。我刚刚找到了stackoverflow.com/a/14595253/7365866stackoverflow.com/a/12877348/7365866,这也是一本不错的读物。
    • 不,那是不正确的。例如,AOT 快照不包含字节码(即更高级别的 VM 指令集);它包含实际的机器代码。内核快照也不是字节码,而是更高级别的 AST 表示。让我试着看看我们是否可以扩展我们的文档,我可以看到这不是很清楚。
    【解决方案2】:

    编译 Dart 代码时,它被编译成中间字节码而不是原生代码。这意味着为了让代码在任意环境中执行,编译器需要在可执行文件中包含 Dart 虚拟机以及用户代码以及程序所需的核心库的任何部分。通常,这很好,因为 Dart 运行时实际上非常紧凑,但这样做的明显缺点是可执行文件会更大并且启动时间会更长,因为需要在用户代码之前提取和预热运行时运行。

    但是,如果您正在为可以保证存在 Dart 运行时的环境(例如服务器机器或 IoT 设备)编译代码,则可以通过构建快照从编译的程序中省略运行时文件而不是可执行文件。这导致编译文件更小,启动时间更快,尽管它需要执行命令,因此不太方便。您可以通过on the Dart GitHib wiki page on snapshots了解更多关于快照以及如何构建和执行它们的信息。

    有三种不同类型的快照:内核快照,它只包含 AST 信息而不是编译的字节码,使它们可以在任何支持的架构上被 Dart 运行时使用(可移植但速度慢); JIT 快照,其中仅包含启动所需的程序部分,其余部分在运行时进行解释(启动速度最快但执行速度较慢);和AOT 快照,它将整个程序完全编译成字节码(启动速度较慢但执行速度最快)。

    至于为什么它被称为“快照”,我不能说。如果我不得不猜测,那是因为它是处于编译状态的程序的“快照”,但没有将其作为独立可执行文件运行所需的指令。

    (以上内容基于我对该主题的快速研究,可能遗漏了一些关键细节。如果 Dart 团队的成员遇到这个问题,他们可能会提供更详细和技术性的解释。)

    【讨论】:

      猜你喜欢
      • 2021-07-07
      • 2012-10-04
      • 1970-01-01
      • 2021-09-18
      • 2018-11-05
      • 2011-06-25
      • 2021-03-28
      • 2020-02-22
      • 1970-01-01
      相关资源
      最近更新 更多