理解V8的字节码
V8是谷歌的开源JavaScript引擎。Chrome,节点。js和许多其他应用程序使用V8。本文解释了V8的字节码格式- - -实际上是容易阅读一旦你了解一些基本概念。
当V8 JavaScript代码,编译解析器生成一个抽象语法树。语法的语法树是一个树表示JavaScript代码的结构。点火,翻译,从这个语法树生成的字节码。涡扇发动机,优化编译器,最终优化字节码并生成机器代码。
如果你想知道为什么我们有两种执行模式,你可以看看我的视频从JSConfEU:
字节码是一个抽象的机器代码。编译字节码机器代码更容易如果相同的字节码设计物理CPU的计算模型。这就是为什么翻译常常是机器注册或堆栈。点火是一个注册机累加寄存器。
你能想到的V8字节码小积木当组合在一起构成任何JavaScript功能。V8几百字节码。有字节码操作添加
或TypeOf
或属性加载LdaNamedProperty
。V8也有一些非常特定的字节码CreateObjectLiteral
或SuspendGenerator
。的头文件bytecodes.h定义了V8的字节码的完整列表。
每个字节码指定其输入和输出寄存器操作数。点火使用寄存器r0, r1, r2,…
和一个累加寄存器。几乎所有的字节码使用累加寄存器。它就像一个普通注册,除了字节码不指定它。例如,添加r1
增加了寄存器中的值r1
累加器中的值。这使字节码短和节省内存。
许多的字节码乔治。
或Sta
。的一个
在Ld一个
和圣一个
代表一个ccumulator。例如,LdaSmi [42]
装入小整数(重度)42
累加寄存器。明星r0
目前蓄电池的值存储在寄存器中r0
。
到目前为止最基本,时间看看实际的字节码的功能。
函数incrementX (obj) {
返回1 + obj.x;
}incrementX ({x: 42});/ / V8的编译器是懒惰,如果你不运行一个函数,它不会解释它。
如果你想看到的V8 JavaScript代码的字节码,您可以通过调用打印D8或节点。js(8.3或更高版本)的国旗
——print-bytecode
。铬,铬从命令行开始——js-flags = "——print-bytecode”
,请参阅运行铬与旗帜。
美元节点——print-bytecode incrementX.js
…
[为函数生成字节码:incrementX]
参数统计2
帧大小8
12 E x2ddf8802cf6e @ StackCheck > 0
19 S > 0 x2ddf8802cf6f @ LdaSmi [1]
0 x2ddf8802cf71 r0 @明星
34 E > 0 x2ddf8802cf73 @ LdaNamedProperty a0, [0], [4]
28日E > 0 x2ddf8802cf77 @添加r0, [6]
36岁> 0 x2ddf8802cf7a @返回
常量池(大小= 1)
0 x2ddf8802cf21 (FixedArray):在旧空间
-地图= 0 x2ddfb2d02309 <地图(HOLEY_ELEMENTS) >
-长度:1
0:0 x2ddf8db91611 <字符串[1]:x >
处理程序表(大小= 16)
我们可以忽略的大部分产出和关注实际的字节码。这是每一个字节码是什么意思,逐行。
LdaSmi [1]
LdaSmi [1]
加载恒定值1
在累加器。
明星r0
接下来,明星r0
商店的价值目前蓄电池,1,
在注册r0
。
LdaNamedProperty a0, [0], [4]
LdaNamedProperty
加载一个命名属性的a0
蓄电池。人工智能
指的是i参数incrementX ()
。在这个例子中,我们查找命名属性a0
的第一个参数incrementX ()
。这个名字是由常数0
。LdaNamedProperty
使用0
查找的名字在一个单独的表中:
-长度:1
0:0 x2ddf8db91611 <字符串[1]:x >
在这里,0
映射到x
。所以这个字节码加载obj.x
。
操作数的值是什么4
用来做什么的?这是一个所谓的指数反馈向量函数的incrementX ()
。反馈向量包含用于性能优化的运行时信息。
现在的寄存器是这个样子:
添加r0, [6]
最后一个指令补充道r0
累加器,导致43
。6
反馈的是另一个索引向量。
返回
返回
在累加器返回的值。这是函数的结束incrementX ()
。调用者的incrementX ()
开始与43
在蓄电池和可以进一步使用这个值。
乍一看,V8的字节码看起来相当神秘,尤其是所有的额外的信息打印出来。但是一旦你知道点火是一个注册机累加寄存器,可以找出大多数字节码。
学会了什么?Clap your to say “thanks!” and help others find this article.
注意:这里描述的字节码从V8版本6.2,铬62,(未发布)版本的节点9。我们总是在V8改善工作性能和内存消耗。在其他V8版本,细节可能是不同的。