01.V8引擎工作原理

V8引擎工作过程

V8 引擎是由Google开发的开源JavaScript引擎,用于Chrome浏览器和Node.js等环境。它的设计目标是提供快速、高性能的JavaScript执行环境。

  • 首先v8引擎接收到js源代码,通过Parse模块将源代码转换为AST抽象语法树。函数如果没被调用,则不会被转换为AST。同时在解析的过程中会验证语法,如果有错误就会抛出语法错误。
    • 在Parse模块的构建过程中,首先会进行词法分析,将源代码分割成一个个词法单元(tokens)。词法单元可以是关键字、标识符、运算符等
    • 随后Parser模块进行语法分析,根据词法单元的组合规则构建抽象语法树(AST)
  • Ignition解释器将AST转为字节码Bytecode,同时收集TurboFan优化所需要的信息(例如函数参数的类型信息),如果某函数仅运行一次,则直接解释执行Bytecode字节码
  • TurboFan编译器的作用是处理源代码中的热点函数。将这些热点函数转换为机器码MachineCode。V8引擎会将这些机器码直接在处理器上执行,而不需要解释器的介入,提高运行速度。
    • V8引擎在执行过程中,会使用一种叫做"热点探测(HotSpot Detection)"的技术来确定哪些代码被频繁执行,这些代码被称作热点函数。

然而需要注意的是,如果这些热点函数的参数类型发生变化,则需要将对应的机器码重新还原为字节码进行执行。因此在编写Js代码过程中,调用函数时尽量使用相同的参数类型,会有一定的性能优化。

JIT

JIT是"Just-In-Time"的缩写,它指的是一种在程序运行时(即执行阶段)进行即时编译的技术。

现代的JavaScript引擎通常包括两个主要组件,即解释器和编译器。解释器负责解释和执行JavaScript源代码,而编译器则负责将源代码编译成机器代码。JIT编译器结合了这两者的优势,它可以在运行时动态地将解释器执行频率较高的代码块(例如循环或热点函数)编译成机器代码,从而提高执行效率。

V8引擎生成AST的执行细节

在将Js源代码解析为AST的过程中,首先通过Scanner进行词法分析(lexical analysis),代码转换成tokens。

在将词法单元生成AST的过程中,V8引擎存在Lazy Parsing(延迟解析)方案,即在解析过程中,一部分JavaScript代码不会在一开始时被执行,对于这部分代码,通过PreParser进行预解析,仅仅解析一部分暂时需要的内容。

当解析顶层代码的时候,遇到了一个函数,但是这个函数只是声明了,并没有调用,那么预解析器就会对该函数做一次快速的预解析。例如下列情况,talk函数就会进行预解析

经过以上步骤,最终生成AST,并通过Ignition解释器转换为字节码进行后续步骤。

相关推荐
崔庆才丨静觅1 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60612 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了2 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅2 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅2 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅3 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment3 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅3 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊3 小时前
jwt介绍
前端
爱敲代码的小鱼3 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax