Journey of V8 Engine Compiler

Author Avatar
Misaka030 5月 09, 2018

什么是V8

V8是Google开发的Javascript引擎。Google Chrome和Node.js的Javascript引擎就是使用的V8引擎。

V8的执行流

First time: Source -> AST -> Bytecode
Hot code: Graph -> Assembly

Parsing

Basing Parsing

V8将source code进行解析变换为AST。

AST: Abstract Syntax Tree (抽象语法树)

什么是AST

1
2
3
if (x) {
x = 100
}

对于上面的源码,解析处理将会把它转换为一个语法树

AST

问题

解析全部的函数,速度必然较慢

在最开始时就解析全部的代码有些不太合适,如果解析之后的代码不被运行的话岂不是毫无意义?

分阶段解析

延迟进行解析,将解析分为两阶段进行

预解析 (Preparsing)

事先将全部的函数的布局(layout)解析完毕

例如下列代码将会被预解析

1
2
3
function x(a, b) {
return a + b;
}

得到如下信息

1
2
3
4
5
6
FUNCTION(x)
parameter-count: 2
start-position: 1
end-position: 34
use-super-property: false
...

当函数x被调用时

When x is called

延迟解析 (Lazy Parsing)

实际上,V8会将解析推迟到调用的时候,当函数被调用时,才会第一次被编译

更多

https://docs.google.com/presentation/d/1b-ALt6W01nIxutFVFmXMOyd_6ou_6qqP6S0Prmb1iDs/present?slide=id.p

抽象语法树 (Abstract Syntax Tree)

AST重写 (AST Rewriting)

将解析器生成的AST进行变形

这里会介绍几种变形

Subclass constructor return

将继承的class的constructor进行变形

派生class的constructor中含有return时,变形为三元运算符

执行的结果为undefined的时候将返回到this


未完待续 | Continue | つづく