SpiderMonkey 体系结构
SpiderMonkey 引擎是一个快速的解释器,也就是一个虚拟机。同时,它还包括两个 JIT 编译器,垃圾回收器,以及一些通用的库。SpiderMonkey 实现了 ECMA 262-3 标准,并提供了一些扩展。
解释器部分与其他的虚拟机一样,主体部分具有一个 switch 语句,根据不同的操作码来进 行分发,并调用各自的处理函数,直到遇到停机指令。由于代码中会有这种场景:JavaScript 代码调用 C 代码,被调用的 C 代码里又调用其他的 JavaScript 代码,这就要求解释器必须是可重入的。
编译器部分用以分析 JavaScript 代码,生成字节码,代码注释,常量表等。编译器由三部 分组成:一个词法分析器,一个递归向下的分析器(生成抽象语法树),一个代码生成器(遍 历语法树产生代码)。编译器会做一些代码优化,并会将源码的注解附加在生成的脚本中,以便后期的反编译。反编译器中实现了 Function.toSource(),用以重建函数的源码,并 将后缀形式(指令集中的格式)转换成中缀(程序员可读)的格式。
垃圾回收器使用标记-清除方式,SpiderMonkey 的垃圾回收采用精确方式,一般情况下, SpiderMonkey 的 API 应采用 JS_GC 及 JS_MaybeGC 来进行显式的垃圾回收。由于采 用精确方式,使用此引擎时,应确保所有的活动对象,字符串,对象等都是垃圾回收器可访问的。
正如第三章提到的,JavaScript 对象是一个属性的集合,并且有一个原型对象。原型可以 是一个对象或者 null。一般的引擎实现中,JS 对象会包含若干个隐藏属性,对象的原型由 这些隐藏属性之一引用,我们在本文中讨论时,将假定这个属性的名称为"__proto__"(事 实上,SpiderMonkey 内部正是使用了这个名称,但是规范中并未做要求,因此这个名称 依赖于实现)。
{$ activeFileHint $}