我一直在阅读Dart快照,他们经常与Smalltalk图像进行比较.但对我来说,它们听起来很像
Java字节码.
例如:
“Dart快照只是令牌流的二进制序列化,通过解析代码生成.快照不是”正在运行的程序的快照“,它是在令牌转换为机器代码之前生成的.因此,没有程序状态是在快照中捕获.“
而且他们是跨平台的:
“快照格式本身是跨平台的,这意味着它可以在32位,64位机器之间工作,等等.格式已经完成,因此可以快速读入内存,并强调最小化指针修正等额外工作. “
我在某处弄错了吗?
资料来源:
What is the snapshot concept in dart?
http://www.infoq.com/articles/google-dart
解决方法
快照包含表示加载脚本的VM数据结构,其序列化形式类似于Smalltalk图像.为了更好地理解快照中包含的内容,我们应该看看Dart VM在读取脚本时创建的内容:
>库对象,指的是所有顶级结构,如类或顶级方法和变量.
>类对象,包含描述所有方法和字段的所有对象.
>脚本和Tokenstream对象表示所有加载的源代码.
>源代码中所有使用的标识符和字符串常量的字符串对象.
使用与架构无关的格式生成快照时,此对象图将序列化为文件.这允许Dart VM在32位或64位计算机上反序列化此快照文件,并比从一组文件中读取原始脚本快得多地重新创建所有必需的内部VM数据结构(请参阅John的回答).
为了澄清约翰的答案.生成快照时,Dart VM不会解析所有源代码.它只需解析源的顶层就能提取类,方法和字段定义,因为它们在序列化图中表示.特别是方法体不被解析,并且由于脚本语言的惯例,一旦控制到达特定方法,将仅报告错误.
正如Ladicek所指出的,Java字节码的目的完全不同.一旦加载了字节码,您就可以在JVM中创建VM数据结构的快照,以获得类似的效果.
简而言之:快照包含开始执行脚本所需的Dart VM堆上分配的所有数据结构的有效表示.
-Ivan