Dart的快照和Java字节码有什么区别?

时间:2013-01-27 12:08:20

标签: dart

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

例如:

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

另外,他们是跨平台的:

“快照格式本身是跨平台的,这意味着它可以在32位,64位机器之间工作等等。格式已经完成,因此它可以快速读入内存,并强调最小化额外的工作,如指针修正。“

我在某处弄错了吗?

来源:
What is the snapshot concept in dart?
http://www.infoq.com/articles/google-dart

3 个答案:

答案 0 :(得分:11)

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

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

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

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

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

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

-Ivan

答案 1 :(得分:8)

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

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

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

答案 2 :(得分:0)

我要指出的是,从Dart 2+开始,关于快照有几个独特的概念:

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

您可以阅读更多here