初识V8引擎原理

179 阅读4分钟

1、什么是javascript引擎

我们写的js代码,实际是一种高级语言(给开发人员使用),这种语言并不是机器语言,也就是说计算机其实不理解js。所以我们需要把写的js代码转换成机器语言,才能被计算机识别并执行,这就是js引擎的作用

2、javascript引擎作用

  • 我们写的js代码无论是交给浏览器还是node执行,最后都需要被CPU执行
  • CPU只识别自己的指令集也就是机器语言
  • 所以我们需要js引擎帮我们把js代码翻译成机器语言来执行

3、常见的javascript引擎

  • SpiderMonkey:第一款JavaScript引擎,由Brendan Eich开发(也就是JavaScript作者);
  • Chakra:微软开发,用于IT浏览器;
  • JavaScriptCore:WebKit中的JavaScript引擎,Apple公司开发;
  • V8:Google开发的强大JavaScript引擎,也帮助Chrome从众多浏览器中脱颖而出;

浏览器和js引擎关系

我们写的代码是如何再浏览器上渲染成页面的呢

浏览器进程

  1. 主进程:负责协调,主控,与用户交互前进后退等
  2. GPU进程:图形处理器渲染
  3. 插件进程:一种类型的插件对应一个进程
  4. 渲染进程:浏览器内核,用于js脚本解析,页面渲染,事件处理等

接下来我们主要介绍下浏览器内核,js引擎是浏览器内核的一个组件,负责解析,编译和执行javascript代码,以WebKit为例,WebKit由两部分组成

  • WebCore:负责HTML解析,布局,渲染等
  • JavascriptCore:解析执行javascript代码

V8引擎运行原理

1、官方定义

V8引擎是一款Google开源的高性能JavaScript和WebAssembly引擎,它是使用C++编写的。

  • V8引擎的主要目标是提高JavaScript代码的性能和执行速度。
  • V8引擎可以在多种操作系统上运行,包括Windows 7或更高版本、macOS 10.12+以及使用x64、IA-32、ARM或MIPS处理器的Linux系统。

V8引擎可以作为一个独立的应用程序运行,也可以嵌入到其他C++应用程序中,例如Node.js。

  • 由于V8引擎的开源性和高性能,许多现代浏览器都使用了V8引擎或其修改版本,以提供更快、更高效的JavaScript执行体验。

2、V8引擎如何工作

整体流程梳理下

image.png 词法分析: v8引擎把javascript代码分成一个个标记或词法单元,例如变量名,关键字,运算符等,使用词法分析器完成这个任务 语法分析: v8引擎使用语法分析器把上面的标记转换为AST抽象语法树 字节码生成: v8引擎将语法树生成字节码,字节码是一种中间代码,比源代码更接近机器语言,但仍需要进一步编译成机器指令 机器码生成 v8引擎使用JIT即时编译器将字节码编译成机器码

3.v8引擎架构设计

  1. Parse模块会讲javascript代码转换成AST抽象语法树,如果函数没有被调用,不会被转换成AST
  2. Ignition是一个解释器,会将AST转换为字节码,同时会收集TurboFan优化所需要的信息,如果函数只调用一次,Ignition会执行解释字节码
  3. TuboFan是一个编译器,可以把字节码编译成CPU可以直接执行的机器码。
  • 如果一个函数被多次调用,那么就会被标记为热点函数,那么就会经过TurboFan转换成优化的机器码,提高代码的执行性能;
  • 但是,机器码实际上也会被还原为ByteCode,这是因为如果后续执行函数的过程中,类型发生了变化(比如sum函数原来执行的是number类型,后来执行变成了string类型),之前优化的机器码并不能正确的处理运算,就会逆向的转换成字节码;

还有v8引擎的垃圾回收机制及内存管理,后面再学习