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引擎关系
我们写的代码是如何再浏览器上渲染成页面的呢
浏览器进程
- 主进程:负责协调,主控,与用户交互前进后退等
- GPU进程:图形处理器渲染
- 插件进程:一种类型的插件对应一个进程
- 渲染进程:浏览器内核,用于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引擎如何工作
整体流程梳理下
词法分析:
v8引擎把javascript代码分成一个个标记或词法单元,例如变量名,关键字,运算符等,使用词法分析器完成这个任务
语法分析:
v8引擎使用语法分析器把上面的标记转换为AST抽象语法树
字节码生成:
v8引擎将语法树生成字节码,字节码是一种中间代码,比源代码更接近机器语言,但仍需要进一步编译成机器指令
机器码生成
v8引擎使用JIT即时编译器将字节码编译成机器码
3.v8引擎架构设计
- Parse模块会讲javascript代码转换成AST抽象语法树,如果函数没有被调用,不会被转换成AST
- Ignition是一个解释器,会将AST转换为字节码,同时会收集TurboFan优化所需要的信息,如果函数只调用一次,Ignition会执行解释字节码
- TuboFan是一个编译器,可以把字节码编译成CPU可以直接执行的机器码。
- 如果一个函数被多次调用,那么就会被标记为热点函数,那么就会经过TurboFan转换成优化的机器码,提高代码的执行性能;
- 但是,机器码实际上也会被还原为ByteCode,这是因为如果后续执行函数的过程中,类型发生了变化(比如sum函数原来执行的是number类型,后来执行变成了string类型),之前优化的机器码并不能正确的处理运算,就会逆向的转换成字节码;
还有v8引擎的垃圾回收机制及内存管理,后面再学习