持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
铃铛说点题外话
上一篇详细说了JS引擎是用来解析我们的JS代码的,并且也说了浏览器内核和JS引擎之间的关系,常见的一些JS引擎等等,这一篇我们来详细说说最为常见的V8引擎是如何解析我们的JS代码的。
铃铛说正文
先看一张图,这张图上展示就是V8引擎解析我们JS代码的过程。
-
解析生成Ast抽象语法树
这里面的parse中文翻译是解析的意思,那么我们应该猜得到这是解析我们JS代码的地方。对我们JS解析又分为词法分析和语法分析。我们先来看看这两项都对我们的JS代码做了什么
- 词法分析:假设我们有这样一段代码
const name = "syl"
词法分析会将这一句代码分析生成AST抽象语法树
这里又有一个问题,为什么非要解析为Ast抽象语法树呢?
- 因为抽象语法树里面格式和关键字比较固定,不管是做转化还是操作就都方便很多。
- 可以通过
v8引擎中的ignaton将ast抽象语法树转换成字节码。
- ignaton转换为字节码 在完成解析生成AST抽象语法树之后,会由V8引擎内置的ignaton的对Ast抽象语法树进行转换。
-
为什么要转换成字节码?
- 因为代码运行的环境是一样的,不同的环境有不同的CPU,也就是有不同的CPU的架构,
v8引擎会将字节码转换成对应的CPU对应的指令,就可以真正运行了。 - 字节码是跨平台的。字节码转换成汇编代码,在输出运行代码
- 因为代码运行的环境是一样的,不同的环境有不同的CPU,也就是有不同的CPU的架构,
-
TurboFan标记多次执行的代码
如果代码中一个多次执行的函数,
TurboFan库通过ignation收集多次执行的代码,如果发现这个函数需要多次执行,就将这个函数标记成hot(热)函数,通过TurboFan将这个函数变成优化后的机器码,直接执行。
跟铃铛说再见
在这里算是对浏览器内核和JS引擎的引擎做一个收尾工作了,不知道大家对浏览器有没有进一步的了解,这部分可以作为对浏览器的一个扩展知识。
下一篇见