当前位置: 首页 > Web前端 > HTML

浏览器的工作原理及V8引擎的解析过程

时间:2023-04-02 23:36:40 HTML

浏览器浏览器加载html资源时,会执行以下解析过程会见HTML标签并构建DOM树会见style/link标签调用相应的解析器进行处理CSS标签和构建出CSS样式树,遇到script标签,调用javascript引擎处理script标签,绑定事件,修改DOM树/CSS树等。将DOM树和CSS树合并为一棵渲染树并根据渲染树进行渲染,计算出每个节点的几何信息,最后将每个节点绘制到屏幕上,用一张很经典的图片来表示浏览器引擎。浏览器引擎分为两部分,渲染引擎和js引擎。渲染引擎用于解析、处理html、css文件和布局绘制。JavaScript引擎用于解析js文件。常见的JavaScript引擎包括JavascriptCore和V8。我们知道javascript是一种高级语言,需要经过编译才能被计算机识别。编译过程由V8引擎完成。V8引擎V8通过以下步骤处理JS文件:1.Parser模块支持对Javascript代码进行词法分析,并将其解析为AST(抽象语法树)。AST的生成如下图所示。定义一个名为name的常量,解析成右边的树形结构,这样所有代码的结构就非常统一,容易处理2.Ignition将AST解析成字节码(bytecode),最后编译成计算机可读的代码根据不同的操作系统/环境识别机器码如windows/macos,cpu架构不一致时可以执行不同的机器指令,字节码可以跨平台,执行时,V8引擎将字节码解析成机器码codes3.Ignitioncollection优化信息,通过Turbofan将字节码编译成机器码如果一个函数会被执行多次,AST-->bytecode-->machinecode这个过程很浪费性能。为了优化,该功能将被标记为热门功能。当Ignition会收集优化信息,比如函数的参数,从而通过Turbofan将字节码直接编译成机器码。如果优化信息发生变化,比如函数入参的类型一直是number,突然变成了string。这时Turbofan会将机器码反编译成字节码,然后用Iginition解析成机器码执行。Parser模块如下图所示。在将Parser模块解析成AST的过程中,也经过了以下步骤。Blink(Chrome浏览器内核)将源代码传递给V8引擎,Stream进行编码转换,Scanner进行词法分析,将代码转化为tokenPreParser(preparsing),如果不调用该函数,则不会被Parser解析module解析成ASTIgnition,Toburfan再解析如下图