7

我一直在阅读 Dart 快照,并且经常将它们与 Smalltalk 图像进行比较。但对我来说,它们听起来很像 Java 字节码。

例如:

“Dart 快照只是令牌流的二进制序列化,是通过解析代码生成的。快照不是“正在运行的程序的快照”,它是在令牌变成机器代码之前生成的。所以,没有程序状态是在快照中捕获。”

此外,它们是跨平台的:

“快照格式本身是跨平台的,这意味着它可以在 32 位、64 位机器等之间工作。这种格式的设计使其可以快速读入内存,重点是最大限度地减少指针修复等额外工作。 "

我在某处弄错了吗?

资料来源:
dart 中的快照概念是什么?
http://www.infoq.com/articles/google-dart

4

3 回答 3

11

快照包含以类似于 Smalltalk 图像的序列化形式表示已加载脚本的 VM 数据结构。为了更好地理解快照中包含的内容,我们应该看一下 Dart VM 在读取脚本时创建的内容:

  • 库对象,指所有顶层结构,例如类或顶层方法和变量。
  • 类对象,包含描述所有方法和字段的所有对象。
  • Script 和 Tokenstream 对象代表所有加载的源代码。
  • 源代码中所有使用的标识符和字符串常量的字符串对象。

当使用与架构无关的格式生成快照时,此对象图被序列化为文件。这允许 Dart VM 在 32 位或 64 位机器上反序列化此快照文件,并重新创建所有必要的内部 VM 数据结构,这比从一组文件中读取原始脚本要快得多(参见 John 的回答)。

澄清一下约翰的回答。Dart VM 在生成快照时不会解析所有源代码。它只需要解析源的顶层就能够提取类、方法和字段定义,因为它们在序列化图中表示。特别是方法体不会被解析,并且因为脚本语言的习惯,只有在控制到达特定方法时才会报告错误。

正如 Ladicek 所指出的,Java 字节码的目的完全不同。加载字节码后,您可以在 JVM 中创建 VM 数据结构的快照以获得类似的效果。

简而言之:快照包含在 Dart VM 堆上分配的所有数据结构的有效表示,这些数据结构是开始执行脚本所需的。

-伊万

于 2013-01-30T01:35:53.653 回答
8

Dart 快照只是所有已提前解析的源文件的汇总。Dart 快照与 Java 字节码文件不同。Java 字节码文件由 JVM机器代码组成,是编译、链接和组装(进入 JVM 机器代码)阶段的产物。

Dart 快照是 Dart 程序的二进制文件,它的导入/部分源文件依赖项已被解析为抽象语法树并滚动到单个文件中。执行 Dart 快照可以缩短启动时间,因为:

  1. 只能从磁盘或离线加载 1 个文件。相反,必须获取非快照 Dart 程序,然后必须获取任何导入的文件,依此类推。在可以进行每个后续源文件请求之前,必须解析先前获取的源文件以查明它是否引用了更多源文件。想象一下,如果你的 Dart 程序导入了 10 个库,每个库包含 10 个源文件。这意味着 110 个 I/O 请求和解析一个接一个地完成。
  2. 解析已经提前完成。它在语法上是正确的并且可以被 Dart VM 编译。

HTH,约翰

于 2013-01-27T15:39:32.240 回答
2

我只想指出,在 Dart 2+ 中,关于快照有几个独特的概念:

  • 内核快照
  • JIT 快照
  • AOT 快照

你可以在这里阅读更多。

于 2019-07-21T20:29:30.210 回答