【V8引擎】 V8引擎如何运行JS的

文章目录

    • 概要
    • 什么是V8引擎
    • 为什么需要V8引擎
    • 比较常见的javascript引起有哪些呢?
    • V8引擎是如何工作的(V8引擎的解析过程)
    • V8引擎的做了哪些优化

概要

本篇文章主要是讲V8引擎如何运行JS,对运行JS做了哪些优化

什么是V8引擎

V8 是一个由 Google 开发的开源 JavaScript引擎,目前用在 Chrome 浏览器和 Node.js中,其核心功能是执行和解析我们编写的JavaScript代码。

为什么需要V8引擎

高级的编程语言都是需要转成最终的机器指令来执行的。
我们编写的JavaScript无论交给浏览器或者Node执行,最后都是需要被CPU执行的。但是CPU只认识自己的指令集,机器语言才能被CPU所执行。所以我们需要JavaScript引擎帮助我们将JavaScript代码翻译成机器语言,才能被CPU指令来执行。

比较常见的javascript引起有哪些呢?

V8:Chrome 和 Opera 中的 JavaScript 引擎;

SpiderMonkey:Firefox(火狐) 中的 JavaScript 引擎;

Chakra:IE 中的 JavaScript 引擎;

ChakraCore:Microsoft Edge 中的 JavaScript 引擎;

SquirrelFish:Safari 中的 JavaScript 引擎。

V8引擎是如何工作的(V8引擎的解析过程)

大家都知道浏览器的渲染过程是,浏览器接受到资源后,开始解析HTML,在浏览器的内核里面有一个HTMLParser,把HTML转换成DOM
Tree(DOM树),在这个过程中,JavaScript也可以对DOM进行操作,CSS也会被CSS
Paser进行解析,转换成styleRules(css规则),然后DOM Tree和Style Rules会结合到一起生成Render
Tree(渲染树),然很会经过Layout进行适配对不同浏览器的屏幕大小进行适配布局,然后进会进行最终的绘制,生成我们最终看见的页面模样。

那么网页中的JS代码的解析过程是怎么样的呢?

这就是这篇文章的重点了,V8引擎的解析过程

在这里插入图片描述

1、JS由解析器解析后生成AST抽象语法树 2、解释器 Ignition 生成byteCode字节码 并直接执行 (清除AST
释放内存空间)
3. 解释器执行bytecode (此时的bytecode将被作为基准执行模型)
4. 得到25% - 50%的等效机器代码大小 (是以第三部生成的bytecode作为基准执行模型,字节码更简洁)
5. compiler 运行过程中,解释器收集优化信息发送给编译器TurboFan
6. 重新生成机器码
7. 有些热点函数变更会由优化后的机器码还原成字节码 也就是deoptimization 回退字节码操作执行

V8引擎的做了哪些优化

  • 函数值只声明未被调用,不会被解析生成ast 。
  • 函数只被调用一次,bytecode直接解释执行(就是说他会直接调用第三步的bytecode不会到TurboFan,因为TurboFan需要收集之前执行时的类型信息,那么就意味着TurboFan的优化对象函数至少执行大于一次)。
  • 函数被调用多次,可能会被标记为热点函数,可能会被编译成机器代码(就是说当函数被标记为热点函数后,Ignition就收集了很多类型信息,那么TurboFan就会优化这些信息将bytecode生成机器代码。后面再调用就会直接调用TurboFan生成的机器代码)。

由于一开始不需要直接编译成机器码,生成了中间层的字节码,从而节约了时间,优化编译阶段,不需要从源码重新解析,直接通过字节码进行优化,也可以deoptimization回退操作。

参考链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/711133.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IOC (一)

》》新建一个CORE 控制台程序 注册服务 》》 安装 Microsoft.Extensions.DependencyInjection using Microsoft.Extensions.DependencyInjection;namespace ConsoleApp1 {internal class Program{static void Main(string[] args){Method();Console.ReadKey();}static void…

LVGL:

LVGL(little video graphics library)是一个开源的嵌入式图形库,提供高性能、低资源占用的图形用户界面(GUI)。具有模块化(项目工程源码)设计,可以在多平台使用(如微处理…

SSM母婴用品交流系统-计算机毕业设计源码05772

摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 母婴用品交流系统,主要的模块包括查看首页、轮播图管理、通知公告管理、资源管理(母婴资讯、资讯分类)、交…

网络爬虫概述

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 网络爬虫(又被称为网络蜘蛛、网络机器人,在某社区中经常被称为网页追逐者),可以按照指定的规则&#…

【动态规划】| 路径问题之不同路径 力扣62

🎗️ 主页:小夜时雨 🎗️ 专栏:动态规划 🎗️ 如何活着,是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/unique-paths/description/ 通常动态规划的题目有…

【RAM】利用AWS Resource Access Manager服务实现与其他账户共享AWS资源

文章目录 1. 先决条件说明2. 导航至ARM控制面板3. 指定资源共享详细信息4. 关联托管式权限5. 向委托人授予访问权限6. 查看和创建7. 查看由我共享的资源8. 资源共享详细信息9. 取消关联10. 参考链接11. 生成式AI书籍推荐📢 1. 先决条件说明 报错现象: …

【PL理论】(24) C- 语言:有块的作用域 | 更新的语法 | 新的语义域 | 环境 vs. 内存

💭 写在前面:我们将再次扩展之前的C语言,让我们向这种语言引入“作用域”的概念。 目录 0x00 C- 语言:有块的作用域 0x01 C- 语言:更新的语法 0x02 新的语义域 0x03 环境 vs. 内存 0x00 C- 语言:有块的…

干部考评系统如何评估干部表现

一、引言 干部考评系统是现代组织管理中不可或缺的一部分,它通过科学、公正、客观的方式对干部的表现进行评估,为干部的选拔、培养、激励和约束提供有力依据。本文旨在探讨干部考评系统如何有效评估干部表现。 二、干部考评系统的构建 明确考评目标&a…

Go-知识并发控制RWMutex

Go-知识并发控制RWMutex 1. 介绍2. 原理2.1 读写锁的数据结构2.2 接口定义2.3 Lock() 写锁定 原理2.4 Unlock() 写锁定解锁 原理2.5 RLock() 读锁定 原理2.6 RUnlock() 读锁定解锁 原理 3. 场景分析3.1 写锁定如何阻塞写锁定3.2 写锁定如何阻塞读锁定3.3 读锁定如何阻塞写锁定3…

QT 5.14.2 应用程序打包

我们可以直接通过开发工具预览我们的程序。但是当要把开发好的程序给别人使用的时候,我们就需要把程序打包成可执行的exe,然后把这个exe文件和其他相关的文件一起发给别人,这样别人就可以使用了。 一、生成可独立运行的exe (一)、编译程序的…

调教LLaMA类模型没那么难,LoRA将模型微调缩减到几小时

简介: 调教LLaMA类模型没那么难,LoRA将模型微调缩减到几小时 LoRA 微调方法,随着大模型的出现而走红。 最近几个月,ChatGPT 等一系列大语言模型(LLM)相继出现,随之而来的是算力紧缺日益严重。虽…

移动端消息中心,你未必会设计,发一些示例出来看看。

APP消息中心是一个用于管理和展示用户收到的各种消息和通知的功能模块。它在APP中的作用是提供一个集中管理和查看消息的界面,让用户能够方便地查看和处理各种消息。 以下是设计APP消息中心的一些建议: 1. 消息分类: 将消息按照不同的类型进…

【网络编程】多进程服务器端

并发服务器的实现 多进程服务器:通过创建多个进程提供服务多路复用服务器:通过捆绑并统一管理IO对象提供服务。多线程服务器:通过生成与客户端等量的线程提供服务。、 理解进程process 定义:占用内存空间的正在运行的程序。 CPU核和进程数:1个CPU 中…

电机控制安全:PWM 直通

在 H 桥中使用互补 PWM 时的一个主要考虑因素是短路的可能性,也称为“击穿”。 如图 5 所示,如果同一支路上的两个开关同时打开,H 桥配置可能会导致电源和接地之间发生直接短路。 如果同一条腿上的两个开关同时打开,则可能会发生…

ConcurrentHashMap如何保证线程安全?

ConcurrentHashMap 是 HashMap 的多线程版本,HashMap 在并发操作时会有各种问题,比如死循环问题、数据覆盖等问题。而这些问题,只要使用 ConcurrentHashMap 就可以完美解决了,那问题来了,ConcurrentHashMap 是如何保证…

EvaluLLM: LLM Assisted Evaluation of Generative Outputs论文阅读

Abstract 随着大型语言模型(LLM)能力的迅速提升,衡量自然语言生成(NLG)系统输出质量变得越来越困难。传统的指标如BLEU和ROUGE依赖于参考数据,通常不适用于需要创造性或多样化输出的任务。人工评估是一种选…

救命!接手了一个老项目,见到了从业10年以来最烂的代码!

后台回复“书籍”,免费领取《程序员书籍资料一份》 后台回复“5000”,免费领取面试技术学习资料一份 在程序员这个行业从业快10年了,每过几个月回头看看自己写的代码,都会觉得写的也太烂了,不敢想象是自己之前写的。…

官网首屏:太漂亮了,真是着了它的魔,上了它的道。

大气的企业官网致力于提供用户友好的界面和优质的用户体验。网页经过精心设计和开发,旨在展示客户的品牌形象和产品信息,并为用户提供便捷的服务和沟通渠道。 官网设计追求简洁、美观、易用的原则,以吸引用户的注意力并提供清晰的导航和信息…

【文档智能 RAG】RAG增强之路-智能文档解析关键技术难点及PDF解析工具PDFlux

前言 在私域知识问答和企业知识工程领域,结合Retrieval-Augmented Generation(RAG)模型和大型语言模型(LLM)已成为主流方法。然而,企业中存在着大量的PDF文件,PDF解析的低准确性显著影响了基于…

git配置3 - 一个git仓库同时push到多个代码托管平台

1. 应用场景2. 单个代码托管平台时3. 多个代码托管平台时 3.1. 在github上创建一个项目3.2. 添加远端仓库关联3.3. 查看关联的远端仓库3.4. 推送代码到github 1. 应用场景 场景一: 你有一个开源的项目,你希望托管到多个开源代码托管平台。比如github…