准备资料
参考
- 浏览器是如何工作的:Chrome V8让你更懂JavaScript 讲了很多很好,但是有些东西需要补充
- V8引擎是如何工作 讲的相对简单,但是容易懂
准备说作用域和执行环境这篇需要了解很多计算机基础知识,不然只会感觉花里胡哨看了个寂寞
如果可以推荐看一些极客时间的《图解Goole V8》质量不错
一、高级语言是如何被编译执行或者解释执行的
极客时间的重学前端和图解Goole V8
(1) 编译原理
编译目标:
-
如果源代码在操作系统上运行:目标代码就是“汇编代码”。再通过汇编和链接的过程形成可执行文件(二进制代码),然后通过加载器加载到操作系统执行。
-
如果源代码在虚拟机(解释器)上运行:目标代码就是“解释器可以理解的中间形式的代码”,比如字节码(中间代码)IR、AST语法树。
编译过程可以分为这几个阶段,每个阶段做了一定的任务,层级的让下一个阶段进行。
(2) 编译器如何编写
编译器是如何编写的
机器语言或汇编语言编写核心代码,再将已经能够编译的核心代码作为基础,用它编写拓展代码的编译程序,一直下去,直到所有的拓展代码全部能够编译识别
也就是说,编译器是高级和低级语言的混合
(3) 编译过程
- 词法分析
- 语法分析
- 语义分析
=> 抽象语法树,解释器就能识别执行 - 中间代码
- 优化
- 生成目标代码
如果是解释性语言,那么是边编译边执行的
二、V8了解
Google V8 引擎是用 C ++编写的开源高性能 JavaScript 和 WebAssembly 引擎,它已被用于 Chrome 和 Node.js 等
常见误区:
-
V8 是解释器也是执行器,这也是为什么要叫引擎它拥有单独执行JavaScript代码的能力,可以独立运行的模块
-
V8 是C++编写,但是注意,翻译的最终目标不是C++代码,关于这一点可以再回去上面看第一大点,C++只是控制如何解释JS代码,最终将JS变成“目标代码”,只是C++既然是控制这过程,当然意味着C++的执行能够影响最终结果
-
很多人基于第二点的误解,认为JS没有堆栈,是C++软件层面实现的,这同样能用“最终目标代码执行来解释”,并不是C++和JS语法的映射,直接翻译C++执行,一定要谨记这一点
三、V8 执行 JavaScript 干了写啥
- 初始化基础环境;
- 解析源码生成 AST 和作用域;
- 依据 AST 和作用域生成字节码;
- 解释执行字节码;
- 监听热点代码;
- 优化热点代码为二进制的机器代码;
- 反优化生成的二进制机器代码。
其中 解释执行字节码 是我们需要讨论的