我一直在阅读Dart快照,他们经常与Smalltalk图像进行比较。但对我来说,它们听起来很像Java字节码。
例如:
“Dart快照只是令牌流的二进制序列化,通过解析代码生成。快照不是”正在运行的程序的快照“,它是在令牌转换为机器代码之前生成的。所以,没有程序状态在快照中捕获。“
另外,他们是跨平台的:
“快照格式本身是跨平台的,这意味着它可以在32位,64位机器之间工作等等。格式已经完成,因此它可以快速读入内存,并强调最小化额外的工作,如指针修正。“
我在某处弄错了吗?
来源:
What is the snapshot concept in dart?
http://www.infoq.com/articles/google-dart
答案 0 :(得分:11)
快照包含表示加载脚本的VM数据结构,其序列化形式类似于Smalltalk图像。为了更好地理解快照中包含的内容,我们应该看看Dart VM在读取脚本时创建的内容:
使用与架构无关的格式生成快照时,此对象图将序列化为文件。这允许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快照可以缩短启动时间,因为:
HTH, 约翰
答案 2 :(得分:0)