美文网首页
浅析V8引擎的原理流程

浅析V8引擎的原理流程

作者: 瓯海 | 来源:发表于2021-08-10 16:49 被阅读0次

    V8引擎的定义

    1.V8是用C ++编写的Google开源高性能JavaScript和WebAssembly引擎,它用于Chrome和Node.js等
    2.它实现ECMAScript和WebAssembly,并在Windows 7或更高版本,macOS 10.12+和使用x64,IA-32,ARM或MIPS处理器的Linux系统上运行
    3.V8可以独立运行,也可以嵌入到任何C ++应用程序中

    V8引擎的原理流程

    v8引擎
    当我们的一段js代码需要进行执行时,
    1.V8引擎首先会使用解析器(编译器)(Parse模块)经过词法分析 > 语法分析 这几步生成一颗抽象语法树(AST) ,由于解释器(Ignition模块)是不能直接认识js代码的所以需要经过编译器将js代码生成AST 。当需要进行代码转换时,例如es6,ts代码需要转换成es5的时候,可以访问AST树,将AST树转换为es5规定的代码,然后再生成新的AST树
    parse的V8官方文档
    2.抽象语法树在由解释器(Ignition模块)生成字节码(伪汇编代码),生成的字节码可以跨平台使用,在浏览器和node环境下都是可以用字节码直接生成所需要的的结果
    Ignition的V8官方文档
    3.字节码接着执行接下来的步骤真正的汇编代码 =>机器码 => cpu执行,这就是当你在调用相关的js函数时,V8引擎需要执行的步骤(上面三步主要由解释型语言实现的)
    function sum(num1,num2){
    return num1 + num2 
    }
    

    4.如果一个函数被多次调用,那么就会被标记为热点函数,那么就会经过TurboFan转换成优化的机器码,不需要在经过步骤三就可以直接被CPU执行,提高代码的执行性能(这一步主要由C++实现),这里有一个需要注意的是:以上面的代码为例,多次调用sum函数,并且传入的参数类型都是相同类型时(列如number类型),这一步骤才会生效,如果我们这时改变一个参数的类型,之前优化的机器码并不能正确的处理运算,就会逆向的转换成字节码,这样做会让性能大打折扣,如果在使用typescript进行类型检测,是可以提高一定的性能
    TurboFan的V8官方文档

    相关文章

      网友评论

          本文标题:浅析V8引擎的原理流程

          本文链接:https://www.haomeiwen.com/subject/vptfbltx.html