Dart和x27之间有什么区别;s快照和Java字节码?

Dart和x27之间有什么区别;s快照和Java字节码?,dart,Dart,我一直在阅读Dart快照,它们经常被比作Smalltalk图像。但对我来说,它们听起来很像Java字节码 例如: Dart快照只是通过解析代码生成的令牌流的二进制序列化。快照不是“正在运行的程序的快照”,而是在令牌转换为机器代码之前生成的。因此,快照中不会捕获程序状态 另外,它们是跨平台的: “快照格式本身是跨平台的,这意味着它可以在32位、64位机器等之间工作。该格式的制作使其能够快速读入内存,重点是最大限度地减少额外的工作,如指针修正。” 我哪里弄错了 资料来源: Dart快照只是提前解析

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

例如:

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

另外,它们是跨平台的:

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

我哪里弄错了

资料来源:


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

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

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

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

    • 库对象,引用所有顶级结构,如类或顶级方法和变量
    • 类对象,包含描述所有方法和字段的所有对象
    • 表示所有加载源代码的脚本和令牌流对象
    • 源代码中所有使用的标识符和字符串常量的字符串对象
    当使用与体系结构无关的格式生成快照时,此对象图将序列化为文件。这使得Dart VM能够在32位或64位机器上反序列化此快照文件,并重新创建所有必要的内部VM数据结构,这比从一组文件中读取原始脚本要快得多(参见John的答案)

    让约翰的回答更清楚一点。Dart VM在生成快照时不会解析所有源代码。它只需要解析源代码的顶层,就可以提取序列化图中表示的类、方法和字段定义。在特定的情况下,不会解析方法体,并且按照脚本语言的惯例,只有在控件到达特定方法时才会报告错误

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

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


    -Ivan

    我只想指出,从Dart 2+开始,在快照方面有几个独特的概念:

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

    您可以阅读更多内容。

    只是澄清一下,“汇总所有源文件”不是类似于链接过程吗?此外,如果解析已经提前完成(即Dart到快照),这不是像Java代码到JVM字节码一样吗?JVM字节码是JVM和语言编译器之间定义良好的接口。Dart快照只不过是一种优化启动时间的巧妙技术。它们的内部工作原理可能听起来和你很相似,但它们是为完全无关的目的而设计的。哇,你真的很了解它们的内部结构——感谢你提供了如此详细的答案!