【JS】V8 引擎原理

article/2025/8/21 14:34:58

文章目录

    • 认识JS引擎
    • V8引擎原理
    • V8引擎架构
    • V8引擎的解析图

认识JS引擎

  • 为什么需要 JS 引擎?
1. `高级编程语言`都有转化成`最终的机械指令`来执行的
2. 我们平时编写的js,无论你交给`浏览器或Node`执行,最后都是需要被CPU执行的
3.CPU只认识自己的指令集,实际上是机械语言,才能被CPU所执行
4. 所以我们需要JS引擎将JS代码翻译成CPU指令来执行
  • 常见的 JS 引擎有:
5. SpiderMonkey:第一款JS引擎,由Brendar Eick开发,也就是JS作者
6. Chakra:微软开发,用于IE浏览器
7. JavaScriptCore:WebKit中的JS引擎,Apple公司开发
8. V8:Google开发的强大JS引擎,帮助Chrome从众多浏览器中脱颖而出
9. 等等。。。。。 

浏览器内核与JS引擎的关系

  • 以WebKit为例,它由2部分组成
第一部分 WebCore:负责HTML解析、渲染布局等相关工作
第二部分 JavaScriptCore:解析执行JS代码

在这里插入图片描述

  • 在小程序中编写的JS代码就是被JSCore执行的

在这里插入图片描述

V8引擎原理

  • V8是用C++编写的Google开源高性能的JavaScriptWebAssembly 引擎,用于Chrome和Node.js等
  • 它实现ECMAScriptWebAssembly,并在win7或更高版本,macOS10.12+版本和使用x64、IA-32、ARM或MIPS处理器的Linux系统上运行
  • V8可以独立运行,也可以嵌入到任何C++程序当中

工作流程图:

在这里插入图片描述

流程图分析:

  • parse:对js代码进行解析,包括词法分析和语法分析
const name = "lisi";
// 词法分析:拆分js代码(const, name, =, "lisi", ;,)
tokens = [{type:"keyword",value: const,}{type:"identifier",value: "name",}...
]
// 语法分析:再根据tokens进行分析,比如type是啥,value又是啥,分析完后生成 AST 树
AST 树如下图所示:
  • const name = "lisi";对应的AST
    在这里插入图片描述
  • const name = "lisi";对应的JSON 结构
{"type": "Program","start": 0,"end": 20,"body": [{"type": "VariableDeclaration","start": 0,"end": 20,"declarations": [{"type": "VariableDeclarator","start": 6,"end": 19,"id": {"type": "Identifier","start": 6,"end": 10,"name": "name"},"init": {"type": "Literal","start": 13,"end": 19,"value": "lisi","raw": "\"lisi\""}}],"kind": "const"}],"sourceType": "module"
}
  • 扩展:babelts 代码转换成 js 代码过程
ts ==> ast树 ==> 修改ast树 ==> generate code (生成代码) ==> js
// 同理,es6转es5
ES6 ==> ast树 ==> ES5
  • ignition:将AST树转换为bytecode字节码
为什么不把 AST树 转换为 机械码0101 的形式?而要先转成字节码?
答:
代码的运行环境是不一定的,而不同的环境他有不同的CPU架构,
他们执行的机械指令是不一样的,而ignition他不知道该转换成什么机械指令的代码,
而bytecode字节码他相当于是跨平台的
v8引擎就会把`字节码`转换成对应的`汇编代码`然后再转换成相应平台(window、Linux)的CPU指令(0101
  • TurboFan:将ignition中执行次数比较多的代码,直接转换成对应的机械码(0101),提高性能

V8引擎架构

V8引擎本身的源码非常复杂,大概有超过100w行的C++代码,通过了解他的架构,可以知道他是怎么对JS执行的

Parse

  • 该模块会将JS代码转换成AST(抽象语法树),因为解析器并不直接认识JS代码
  • 如果函数没有调用,那么是不会转换成AST的
  • Parse的V8官方文档:https://v8.dev/blog/scanner

Ignition

  • 是一个解析器:会将AST树转换成ByteCode字节码
  • 如果函数只调用一次,ignition会解析执行ByteCode字节码
  • Ignition的V8官方文档:https://v8.dev/blog/ignition-interpreter

TurboFan

  • 是一个编译器:可将ByteCode字节码编译成CPU可直接执行的机械码
  • 如果一个函数被多次调用,那么就会被标记为热点函数,那么就会经过TurboFan转换成优化后的机械码,提高代码的执行性能
  • 如果后续执行函数的过程中,类型发生了改变(比如sum函数原来执行的number类型,后面执行变成了string类型),之前优化的机械码就不能正常的处理运算了,就会逆向的转换成字节码
  • TurboFan的V8官方文档:https://v8.dev/blog/turbofan-jit

V8引擎的解析图

官方:
在这里插入图片描述

Blink(内核):解析HTML,解析过程中遇到JS就会下载下来以引流的方式传递给V8引擎
Stream(数据流):获取源码并进行编码转换
Scanner(扫描器):做词法分析的,会转换成很多 tokens
Parser(解析):将tokens转换成AST树
PreParser(预解析):预解析后再将数据交给Parser
  • 为什么需要预解析呢?

因为并不是所有JS代码从一开始就会被执行。如果直接全部解析所有代码,会影响网页的运行效率,所以V8引擎就实现了Lazy Parsing(延迟解析)方案。他的作用是将`不必要的函数进行预解析`,只解析暂时需要的内容(比如函数名),而对`函数的全量解析`是在`函数被调用的时候`才会进行比如我们在fun函数里面定义一个fn函数,那么fn函数就会进行预解析
function fun(){function fn(){	// 会被预解析var name = "lisi"	// 不会被预解析}
}

http://chatgpt.dhexx.cn/article/of5aMdad.shtml

相关文章

浏览器执行原理-V8引擎

浏览器内核 不同浏览器的内核组成 Gecko:早起被Netscape和Mozilla Firefox浏览器使用 Trident:微软开发,被IE4-IE11浏览器器使用,但在Edge已经转向Blink Webkit:苹果基于KHTML开发、开源的,用于Safari,Google Chrome之前也在使用 Blink:是…

浏览器原理之V8引擎

主流 JS 引擎 JavaScript 的主流引擎如下所示: V8 (Google) SpiderMonkey (Mozilla) JavaScriptCore (Apple) Chakra (Microsoft) duktape(IOT)JerryScript(IOT)QuickJSHermes(Facebook-React Native) V8 之 what & why & when? waht:V8是一…

V8引擎工作原理

V8引擎工作原理 1.V8引擎是干什么的? V8的工作是将js代码翻译为CPU指令。 2.V8工作过程 Blink将js源码交给V8引擎 Stream对js源码编码 Scanner进行词法分析,将代码转为token token转化为AST树 Parser将tokens直接转化为AST树PreParser(…

谷歌v8引擎详解

前言 JavaScript绝对是最火的编程语言之一,一直具有很大的用户群,随着在服务端的使用(NodeJs),更是爆发了极强的生命力。编程语言分为编译型语言和解释型语言两类,编译型语言在执行之前要先进行完全编译&am…

V8 引擎是如何工作的?

作者 | Fundebug 最近,JavaScript生态系统又多了2个非常硬核的项目。 大神Fabrice Bellard发布了一个新的JS引擎QuickJS,可以将JavaScript源码转换为C语言代码,然后再使用系统编译器(gcc或者clang)生成可执行文件。 Facebook为React Native开…

V8 JS引擎

一. Google开发V8 Google (丹麦)研发小组在 2006 年开始研发 V8 ,部分的原因是 Google 对既有 JavaScript 引擎的执行速度不满意, 在2008年推出chrome, 巨大的速度优势, 迅速占领市场. 2017年chrome的市场占有达到59%. 二. 常见JS引擎 JScript(IE6,IE7, IE8) …

前端深度之Chrome的V8引擎内存详解

内容:V8引擎、JS内存管理、V8引擎如何回收垃圾、如何查看V8内存使用情况、内存优化实例 目录 一、V8引擎是什么? 二、内存 2.1、内存生命周期:(这个不同的程序语言基本一样) 2.2、JavaScript的内存管理 2.3、为什…

linux硬盘格式改为xfs,如何给Linux系统配置XFS文件系统

现在的系统基本都配备了XFS文件系统,XFS文件系统因其优秀且功能丰富而使用的人数很多,下面小编就给大家介绍下Linux下如何配置XFS文件,给想要配置XFS的朋友做个参考。 一、XFS文件系统简介 主要特性包括以下几点: 数据完全性 采用XFS文件系统,当意想不到的宕机发生后,首先…

xfs_growfs

LVM扩容 1 检查当前使用情况 df -h lvs vgs 2 在线扩容/opt lvextend -L 100GB /dev/mapper/VolGroup-opt xfs_growfs /dev/mapper/VolGroup-opt 3 扩容后检查 lvs df -hdf -hT lvslvextend -L 100GB /dev/mapper/VolGroup-optxfr_growfs /dev/mapper/VolGroup-optdf -hT # xf…

linux7xfs,RHEL7--XFS FileSystem

XFS 介绍 在RHEL7中,把XFS作为一种高可用性,高扩展性的文件系统已经列为默认的首先文件系统类型 XFS支持元数据日志记录,支持在线的扩容和整理. 可用采用 mkfs.xfs device 来进行格式 XFS Quota Management xfs能够汇报出在用户&#xff0c…

时代催生枭雄——XFS应运而生

站在人类发展进程的角度,全球新冠肺炎疫情大势横行,促进了百年未有之大变局加速演变,全球原有格局打破,新型的世界秩序正在重塑,世界又站在了历史的十字路口。 中国经济的发展需要良好的营商环境,对虚拟货…

Linux之XFS文件恢复

xfs类型文件备份恢复 我们使用的centos 7 默认使用的是xfs 类型文件系统,可以用xfsdump 与 xfsrestore 工具进行备份恢复。 xfsdump 的备份级别:0 :表示完全备份。1-9 表示增量备份。xfsdump 的备份级别默认为0。 xfsdump 的命令格式&…

xfs mysql_XFS文件系统与mysql应用性能测试

XFS 最初是由 Silicon Graphics,Inc. 于 90 年代初开发的。那时,SGI 发现他们的现有文件系统(existing filesystem,EFS)正在迅速变得不适应当时激烈的计算竞争。为解决这个问题,SGI 决定设计一种全新的高性能 64 位文件系统&#…

关于XFS文件系统概述

前言: 目前XFS已成为Linux主流的文件系统,所以有必要了解下其数据结构和原理。 XFS文件系统 XFS是一个日志型的文件系统,能在断电以及操作系统崩溃的情况下保证数据的一致性。XFS最早是针对IRIX操作系统开发的,后来移植到linux上,目前CentOS 7已将XFS作为默认的文件系统…

XFS 文件系统 (一) :设计概览

文章目录 0 前言1 设计背景2. 需要解决的问题2.1 异常恢复太慢2.2 不支持大文件系统2.3 不支持大型稀疏文件2.4 不支持大型连续文件2.5 不支持大目录2.6 不支持过多文件个数 3 XFS 架构4 痛点解决4.1 Allocation Groups4.2 Manging Free Space4.3 大文件的支持 5 总结 0 前言 …

linux常见实战(一)--【基于centos7的磁盘操作(新磁盘挂载/已有磁盘扩容)】

文章目录 前言:磁盘与文件系统1.xfs2.ext4 一、新磁盘的挂载1.查看已挂载磁盘情况2.查看所有磁盘情况3.给新磁盘分区4.格式化磁盘5.挂载磁盘6.设置开机自动挂载7.测试重启后挂载状态 二、对已有磁盘进行扩容1.查看磁盘挂载情况、分区情况2.进入磁盘进行分区操作3.格…

更快更好的Linux文件系统:XFS

XFS一种高性能的日志文件系统,最早于1993年由Silicon Graphics为他们的IRIX操作系统而开发,是IRIX 5.3版的默认文件系统。2000年5月,Silicon Graphics以GNU通用公共许可证发布这套系统的源代码,之后被移植到Linux 内核上。XFS极具…

Centos7使用

目录 一.材料准备 二.安装VM 三.创建虚拟机 四.进入CentOS安装界面 五、最小化必要的一些工具 一.材料准备 1.VMware-workstation 16版本 2.CentOS-7 64位光盘映像文件 二.安装VM 略 三.创建虚拟机 1.打开VMware Workstation,点击创建虚拟机 2.选择自定义…

CentOS7安装MySQL8

文章目录 一 前言二、Centos 7 安装 mysql8 步骤:1.下载MySQL官方的 Yum Repository2.安装方法一: 用wget 下载后安装方法二:下载 RMP 软件包将该软件包上传到 Linux 服务器,并安装。 3.Navicate 远程连接配置 一 前言 最近在自己…

CentOS7的安装流程

CentOS7的安装流程 1、 环境准备 安装VMware 下载Centos7镜像文件 2、 CentOS7安装流程 步骤一:打开VMware,点击创建新的虚拟机 步骤二:选择典型安装,点击下一步 步骤三:选择稍后安装操作系统,点击…