首页 > 其他分享 >一、V8 引擎的介绍

一、V8 引擎的介绍

时间:2023-12-14 11:47:23浏览次数:40  
标签:解释器 AST 代码 介绍 编译器 引擎 bytecode V8

一、V8 引擎的介绍

懂思念的杨树 2023-06-27753阅读4分钟   专栏:  V8引擎源码分析  

Google V8 引擎的作用

用来解析 javascript 代码,它内置jit (实时编译),用来编译和执行JS代码,处理调用栈,内存分配,处理垃圾回收

V8和其他高级语言具有相同的能力,具备解析器,解释器,编译器功能

image.png

首先V8先讲代码解析成 AST 语法树

image.png

在将AST语法树,解释成字节码bytecode,注意(解释器也具有直接解释执行bytecode的能力)

image.png

在将bytecode编译成机器代码

image.png

早期—V8的编译流程

据说在早起的V8引擎中,没有解释器,却有两个编译器,它的编译流程是这样的:

JS由解析器,转换为 AST语法树,然后由Full-codegen编译器,直接使用AST,来编译成机器代码,而不进行中间转换,Full-codegen编译器也被称为基准编译器,因为它生成的是一个基准的,未被优化的机器代码,这样做的好处是,当你第一次执行js的时候,就是直接使用了高效的机器代码,因为没有中间的字节码产生,所以就不需要解释器,当代码运行一段时间后,v8引擎中的分析线程收集了足够的数据,来帮助另一个编译器Crankshaft来做代码优化,然后需要优化的源码,重新解析生成AST,然后Crankshaft使用生成好的AST,在生成优化后的机器代码,来提升运行的一个效率,所以Crankshaft的编译器又被称为优化编译器。

但是这个架构也带来了一定的问题

1、机器码占用大量内存

2、缺少中间层机器码,无法实现一些优化策略

3、无法很好的支持和优化JS的新语法特效

新的V8编译流程:

JS由解析器,解析成AST

AST 由 lgniton 基准解释器,生成bytecode 字节码,此时AST被清除,释放内存空间,bytecode由解释器执行,同时生成的bytecode将作为基准执行模型,字节码更加简洁,生成的bytecode大小相当于等效的基准机器代码25%-50%左右,在代码的不断的运行过程中,解释器收集到了很多,可以用来优化代码的信息,比如变量的类型,那些函数执行的频率较高,这些信息被发送给编译器,V8引擎新的编译器TurboFan,会根据这些信息和字节码,来编译出经过优化的机器代码。

这里简单说几个v8引擎在处理JS过程中的一些优化策略,

1、如果函数只是声明,却没有被调用,则改函数不会被解析生成AST,也就不会生成字节码

2、函数只被调用一次,bytecode直接被解释执行

3、函数被调用多次,可能会被标记为“热点函数”,可能会被编译成机器代码

在某些情况下,机器代码还可能被逆向还原成字节码,这个过程叫做 deoptimization,这是因为Javascript是一个动态语言,会导致lgnition收集到的信息是错误的

比如有一个 sum函数

  js 复制代码
function sum(x, y) {
  return x + y
}

在函数声明时,JS引擎不知道x,y是什么类型的,但是多次调用后,传入的都是int类型,sum函数被识别为热点函数,此时编译成机器码就假定了x和y都是int类型,如果你调用x,y传入string类型,机器码不知道如何处理,就需要执行 deoptimization 操作了

注意 deoptimization 操作会带来性能的影响,如果你看到有人这样用了,你就可以去装B了。

新的V8还有什么优点

因为不需要一开始就解析成机器码,所以bytecode体积比机器码小,网页初始化解析执行JS的时间缩短了

进行 deoptimization 操作等情况的时候,依赖bytecode了,会比依赖原有的AST更快

image.png

v8 主要组成

Parser: 解析器,负责将源代码解析成AST

Ignition: 解释器,负责将AST转换成字节码并执行,同时会标记热点代码

TurboFan: 编译器,负责将热点代码编译成机器码并执行

Orinoco: 垃圾回收器,负责进行内存空间回收

标签:解释器,AST,代码,介绍,编译器,引擎,bytecode,V8
From: https://www.cnblogs.com/sexintercourse/p/17900868.html

相关文章

  • Excel 公式SWITCH函数你用过吗?多种查找函数介绍
    我们公司的项目上的模板使用了Excel的Switch函数,今天我使用的时候,发现报错,无法使用。环境说明我使用的是Windows10专业版,Office2016报错信息在Excel中的报错如下: 单元格的公式如下:=F8*_xlfn.SWITCH(H8,"高",1.5,"中",1,"低",0.5)*(100-I8)/100 查找问题从网上找了......
  • Unity引擎2D游戏开发,创建人物动画
    给人物创建Animator动画组件在素材库新建Animation文件夹专门存动画相关的文件Animation文件夹中创建Player文件夹右击Player文件夹,创建AnimatorController将新建的AnimatorController赋予人物中Animator组件中的Controller选择Window,选择Animation,打开Animator窗......
  • OAuth2.0详细介绍与实践
    一、OAuth2.0介绍1.1概述OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。oAuth......
  • Unity引擎2D游戏开发,解决空中无限跳跃以及黏墙问题
    一、解决空中无限跳跃解决空中无限跳跃的根本就是添加落地检测,即在地面上才能进行跳跃(二段跳功能以后再开发)在文件夹内新建PhysicsCheck物理检测脚本在里面开发人物物理检测相关功能添加isGround布尔值变量,接触地面则为1,空中则为0。以及两种检测变量:checkRadius检测半径......
  • k8s介绍
    k8s容器编排系统k8S是谷歌几十年来研发的一套系统,更新了运维领域的玩法。内容很多,先快速练习玩法,知道是什么就行。具体【为什么】再花时间慢慢学吧!0.参考资料1.k8s能干什么https://kubernetes.io/zh-cn/docs/concepts/overview/#why-you-need-kubernetes-and-what-can-i......
  • 【干货】SSH安全协议介绍
    原创:厦门微思网络SSH(SecureShell,安全外壳)是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。传统远程登录和文件传输方式,例如Telnet、FTP,使用明文传输数据,存在很多的安全隐患。随着人们对网络安全的重视,这些方式已经慢慢不被接受。SSH协议通过对网络数据进行......
  • 运维工程师必备-Linux-RHCE认证介绍
    原创:厦门微思网络红帽RHCE9.0课程介绍红帽公司介绍红帽是首个(也是全球最大、全球领先)的企业开源软件解决方案提供商,在过去20几年里,红帽已经成为开源社区里令人尊敬的成员,赞助了数百个开源项目,并为数千个项 目贡献代码。屡获殊荣的支持、培训和咨询服务使红帽成为《财富》500......
  • Unity引擎2D游戏开发,C#实现人物跳跃
    一、Component内,实现变量参数分栏[Header("XXXX")]二、在新建的InputActions中添加跳跃绑定三、在2D刚体所绑定的C#代码中调用InputActions中新建的跳跃动作在unity中,跳跃动作相当于对2D刚体施加Y轴方向的力。因此,增加一个力数值的变量jumpForce。publicfloatjumpF......
  • 嵌入式系统开发中常用的程序例程的简要介绍
    这些例程都是嵌入式系统开发中常用的程序,它们分别属于不同的领域和功能。以下是对这些例程的简要介绍:audio_codec:音频编解码器程序,用于处理音频数据的编码和解码。cherryusb:基于CherryPi的USB设备驱动程序,用于连接USB设备。coremark:一个用于测试处理器性能的基准测试程序......
  • 嵌入式系统开发中常用的程序这些例程的简要介绍和使用示例
    这些例程都是嵌入式系统开发中常用的程序。以下是对这些例程的简要介绍和使用示例:audio_codec:音频编解码器程序,用于处理音频数据的编码和解码。使用示例:#include"audio_codec.h"intmain(){AudioCodeccodec;uint8_tinput[]={0x01,0x02,0x03,0x04};uint8_......