js(V8)引擎运行原理(上)

167 阅读1分钟

​持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

V8引擎的定义

v8引擎是c++编写的,有谷歌开源的高性能JavaScript和WebAssembly引擎

它实现了ECMAScript和WebAssembly,并在Windows 7或更高版本,macOS 10.12+和使用 x64,IA-32,ARM或MIPS处理器的Linux系统上运行

V8可以独立运行也可以嵌入到任何C++应用程序中

​编辑

javascript代码 ===> V8引擎 ====> 目标 cpu

首先javascript代码通过parse(有解析的意思)模块,进行词法分析和语法分析生成ast抽象语法树

如果是ts代码(babel进行转换),就会将ts代码 ===> ts对应的ast语法树 ===> 修改后的新ast抽象语法树 ===> generate code  ===> js代码

vue    template ===> ast抽象语法树 ===> createVNode(创建虚拟DOM节点)

例如:

const name = 'why';

parse模块

词法分析:

他会对这行代码的每一个词进行切割(相当于一个切割),最后会生成恒多个tokens:[{type: 'keyword', value: 'const',}, {type: 'identifier', value: 'name'},......],也可以把它看成一个json,keyword是因为解析到const时发现是个关键字,所以type值为keyword,并且会给value赋值const,当解析到name时,发现是个标识符,所以type为identifier,value为name,一直这样进行词法分析,包括最后的分号都会进行解析,就这样通过type划分了一个一个的类型,通过词法分析的一个个类型分别进行语法分析

语法分析:

根据不同类型进行生成对应的ast抽象语法树

​编辑

 之所以转成抽象语法树是因为里面的属性都是固定的,无论以后做什么操作,都很方便,

比如说现在这个抽象语法树我就可以转成es5的代码,也可以转成我想要的字节码(bytecode),而转换成字节码是由V8的ignation来进行操作

ignation模块(解释器/转化器)

作用:将ast抽象语法树转换成字节码(bytecode) 如果函数未调用,是不会转换成ast的

疑惑:为什么不直接转换成机器码呢?