美文网首页
V8引擎解析js代码和WASM模块链路

V8引擎解析js代码和WASM模块链路

作者: 盼旺 | 来源:发表于2019-12-10 12:19 被阅读0次

    我们写的JavaScript代码直接交给浏览器或者Node执行时,底层的CPU是不认识的,也没法执行。CPU只认识自己的指令集,指令集对应的是汇编代码。写汇编代码是一件(不)(可)(能)的事情。

    V8:强大的JavaScript引擎

    V8由许多子模块构成,其中这4个模块是最重要的:

    • Parser:负责将JavaScript源码转换为Abstract Syntax Tree (AST)
    • Ignition:即解释器,负责将AST转换为Bytecode,解释执行Bytecode;同时收集TurboFan优化编译所需的信息,比如函数参数的类型
    • TurboFan:即编译器,利用Ignition所收集的类型信息,将Bytecode转换为优化的汇编代码;
    • Orinoco:垃圾回收模块,负责将程序不再需要的内存空间回收;

    将JS源码编译为汇编代码流程图

    简单地说,Parser将JS源码转换为AST,然后Ignition将AST转换为Bytecode,最后TurboFan将Bytecode转换为经过优化的Machine Code(实际上是汇编代码)。

    图片中的红线是逆向的,这的确有点奇怪,Optimized Machine Code会被还原为Bytecode,这个过程叫做Deoptimization。这是因为Ignition收集的信息可能是错误的,比如add函数的参数之前是整数,后来又变成了字符串。生成的Optimized Machine Code已经假定add函数的参数是整数,那当然是错误的,于是需要进行Deoptimization。

    function add(x, y) {
        return x + y;
    }
    
    add(1, 2);
    add("1", "2");
    

    wasm 并不需要以上的全部步骤-它如下所示插入到执行过程中

    相关文章

      网友评论

          本文标题:V8引擎解析js代码和WASM模块链路

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