持续创作,加速成长!这是我参与「掘金日新计划 · 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的
疑惑:为什么不直接转换成机器码呢?