和v8引擎握个手,交个朋友

91 阅读2分钟

作为程序员,无论前后端,大家都对这个名字并不陌生,他与我们息息相关,我们时时刻刻都在用,大多数情况下,却只是知道它叫做v8。

v8引擎出入各大“高端会所”,无论是主流浏览器(chrome)、还是Nodejs,甚至于electron(Node + Chromium)都视它为座上宾,可见其影响力之深,跨端能力之强。就连独树一帜的edge,在“换心”手术后,采用Chromium内核,也成了v8的有力支持者。

那么v8是什么,它到底有强在哪里?

v8是一款强大的JavaScriptWebAssembly引擎,也是为数不多的js引擎中的佼佼者。底层使用c++实现,接受js、编译js,如何执行js的程序,编译后的代码能够兼容各个操作系统。

mindmap
  v8
        Parser解析器
            Parser将源代码转换为抽象语法树(AST)
        Ignition解释器
            Ignition生成紧凑字节码,也能执行字节码,是代码执行的启动器
        TurboFan编译器
            对热点代码进行JIT优化,提升执行效率,类似增压提升动力
        内存管理
            控制内存分配与回收,如堆空间和栈空间管理
        Orinoco垃圾回收器GC
            清理无用内存,垃圾回收机制

AST: 抽象语法树,将代码进行一个树结构的描述,描述了函数名、变量名、入参出参,方法体等等,AST是一种描述格式。不同的编程语言可能有不同的语法规则,但它们都可以被转换为AST,这意味着后续的处理模块可以基于AST进行统一的处理,而不需要考虑具体的语法差异。

字节码:一种中间表示形式,它介于高级编程语言代码和机器码之间。高级编程语言、字节码均是不能直接被操作系统识别并运行的,字节码简洁紧凑,会减少内存的占用.

Ignition解释器是v8中用于执行字节码的工具,它的作用是解释字节码,基于解释结果进行操作。

TurboFan编译器的作用是将字节码转换为操作系统可识别并执行的二进制代码,然后操作系统运行二进制。

v8并不会将所有的代码都完全进行编译,直接将代码编译成机器码是一个相对耗时的过程,且机器码通常比字节码占用更多的内存空间。全量编译,会导致启动速度明显变慢。这个时候就需要JIT、TurboFan编译器的介入了。

JIT 编译是一种在程序运行时将代码编译为机器码的技术,与传统的提前编译(Ahead-Of-Time,AOT)不同,它不是在程序运行前就把所有代码都编译成机器码,而是在程序运行过程中,根据代码的执行情况,对热点代码进行即时编译和优化。

v8的做法是,解释器执行过程中会进行热点代码的收集,所谓热点代码就是频繁调用的函数,将其进行记录,编译时,仅对热点代码进行编译,会从而避免频繁的解释造成的性能损耗,也避免了全量编译造成的内存损耗。