发表在

DailyJS

理解V8的字节码

V8是谷歌的开源JavaScript引擎。Chrome,节点。js和许多其他应用程序使用V8。本文解释了V8的字节码格式- - -实际上是容易阅读一旦你了解一些基本概念。

这篇文章是可以在中国,翻译的justjavac

点火!我们发射了!翻译点火自2016年以来是我们编译器管道的一部分。

当V8 JavaScript代码,编译解析器生成一个抽象语法树。语法的语法树是一个树表示JavaScript代码的结构。点火,翻译,从这个语法树生成的字节码。涡扇发动机,优化编译器,最终优化字节码并生成机器代码。

V8的编译器管道

如果你想知道为什么我们有两种执行模式,你可以看看我的视频从JSConfEU:

字节码是一个抽象的机器代码。编译字节码机器代码更容易如果相同的字节码设计物理CPU的计算模型。这就是为什么翻译常常是机器注册或堆栈。点火是一个注册机累加寄存器。

你能想到的V8字节码小积木当组合在一起构成任何JavaScript功能。V8几百字节码。有字节码操作添加TypeOf或属性加载LdaNamedProperty。V8也有一些非常特定的字节码CreateObjectLiteralSuspendGenerator。的头文件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 ()。这个名字是由常数0LdaNamedProperty使用0查找的名字在一个单独的表中:

-长度:1
0:0 x2ddf8db91611 <字符串[1]:x >

在这里,0映射到x。所以这个字节码加载obj.x

操作数的值是什么4用来做什么的?这是一个所谓的指数反馈向量函数的incrementX ()。反馈向量包含用于性能优化的运行时信息。

现在的寄存器是这个样子:

添加r0, [6]

最后一个指令补充道r0累加器,导致436反馈的是另一个索引向量。

返回

返回在累加器返回的值。这是函数的结束incrementX ()。调用者的incrementX ()开始与43在蓄电池和可以进一步使用这个值。

乍一看,V8的字节码看起来相当神秘,尤其是所有的额外的信息打印出来。但是一旦你知道点火是一个注册机累加寄存器,可以找出大多数字节码。

学会了什么?Clap your to say “thanks!” and help others find this article.

注意:这里描述的字节码从V8版本6.2,铬62,(未发布)版本的节点9。我们总是在V8改善工作性能和内存消耗。在其他V8版本,细节可能是不同的。

看看我的博客更多的事情V8和节点。js✨✨

- - -

- - -

得到了媒介的应用betway娱乐官网

一个按钮“App Store下载”说,如果点击它会使你的iOS应用程序商店
说一个按钮上,谷歌玩,如果点击它会使你的谷歌商店
Franziska Hinkelmann

Franziska Hinkelmann

主要工程经理在微软。节点。js猴子补丁包。

Baidu