深度解析浏览器工作原理与v8引擎

news2024/10/6 0:35:56
1.浏览器中js如和被执行的

        当我们输入一个域名时会经历dns解析变成一个ip地址,然后浏览器会通过这个ip地址去访问服务器,服务器会放回一个index.html页面,浏览器开始解析这个inde.html文件,当解析到link标签时就开始下载对应的css文件,遇见script标签就开始下载对应的js文件。

2.浏览器内核

浏览器对各种html、css、js文件的解析都需要通过浏览器内核来完成,它是持浏览器运行的最核心的程序,分为两个部分的,一是渲染引擎,另一个是JS引擎。渲染引擎在不同的浏览器中也不是都相同的。下面是一些主流浏览器内核:

  • Gecko:早期被NetScape和Mozilla Firefox浏览器使用;
  • Trident:IE4-IE11浏览器内核,现在的Edge以转向了Blink;
  • Webkit:苹果基于KHTML开发的、开源的,用于Safari,Google Chrome也曾使用过;
  • Blink:是Webkit的一个分支,Google开发,目前用于Google Chrome、Edge、Opera等浏览器。
3.浏览器渲染过程

        

        浏览器在渲染一个网页时会先收到一个服务器返回的index.html文件,然后浏览器通过渲染引擎和JS引擎对整个index.html进行解析,HTML标签会被HTML Paeser解析成DOM Tree(DOM树),在生成DOM树的过程中会有一些JS代码来对DOM进行操作,这些JS代码由JS引擎解析执行(后面会对JS引擎做介绍),CSS文件会被CSS Parser解析成style Rules(样式规则),DOM Treestyle Rules通过Attachment附加到一起,再结合Layout(布局引擎)进行布局(虽然前面已经将DOM树和样式结合形成了渲染树,但随着浏览器所处的状态不同,布局也会随之改变,所以需要通过Layout布局引擎布局),这会生成一个Render Tree,然后就可以开始绘制(Painting),最后进行展示(Display)。

4.JavaScript引擎
  • JavaScript是一门高级语言,高级语言都是需要编译成01的机器语言来执行的;
  • 无论是浏览器还是Node执行JS代码,最终都会交个CPU执行,CPU只能读懂机器语言;
  • JavaScript引擎做用就是将JS转译成机器指令交个CPU来执行。
5.V8引擎执行JS过程
  • V8引擎是用 C++ 编写的Google开源的高性能 JavaScriptWebAssembly 引擎,目前它主要用于Chrome和Node.js等;
  • 它实现了 ECMAScriptWebAssembly,并在Windows7或更高版本,macOS10.12+和使用x64、AI-32、ARM或MIPS处理器的Linux系统上运行;
  • V8可以独立运行,也可以嵌入到认可C++应用程序中。

    V8引擎解析和运行JS代码流程:

        V8引擎会先对Js源代码做一个解析(Parse),分为词法分析语法分析,解析完之后会生成一个抽象语法树(AST),AST 通过V8的一个库 Ignition转换为字节码,之所以转换成字节码而不是机器码,是因为在不同的环境中cpu的指令集是不同的,就像Java通过JVM实现跨平台一样,这里的字节码也起到了类似的作用,字节码不依赖于平台,它在任何平台都可以运行。当需要运行时V8引擎会将字节码转译成对应系统的机器码运行,相交于直接将AST运行转译为对应的机器码,这样的效率高很多。但是每一次运行都需要通过字节码编译一遍,在面对高频使用的的一些函数、变量、类等js代码时,相同的字节码编译多次非常浪费性能。V8引擎有一个TurboFan库,它可以通过Ignition库分析可能高频率使用的一些变量、函数等代码,给他们打上一个hot标记,这些被打上hot标记的函数、变量等代码会被TurboFan转换为优化的机械码,等到后面调用时就直接运行被优化的机械码,不需要在去编译字节码。 如果被优化编译的函数、变量等出现了某些改变需要重新编译,那么对应的机械码会反向优化(Deoptimization)转回字节码,再由字节码文件完成编译运行。

总结: 在学习函数执行与作用域链之前先要了解一个底层概念:代码执行是先从磁盘加载到内存中,然后代码内存中被转换成机器指令,最后交给cpu执行。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

非科班菜鸡算法学习记录 | 代码随想录算法训练营第56天|| 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇

583. 两个字符串的删除操作583. Delete Operation for Two Strings 知识点:动规 状态:看思路自己写 思路: dpij为到i-1和j-1为止的最小操作次数,需要初始化; dp[i][0] 表示i-1要想变成和-1一样的删除次数&#xff0c…

基于CycleGAN的山水风格画迁移

基于CycleGAN的山水风格画迁移 1、简介 1.1 研究背景及意义 绘画是人类重要的一种艺术形式,其中中国的山水画源远流长,具有丰富的美学内涵,沉淀着中国人的情思。游山玩水的大陆文化意识,以山为德、水为性的内在修为意识&#x…

几分钟创建自己的助理

链接: Droxy 上传pdf或者mp4.要求如下: 仅支持PDF或MP4文件。 一次最多可以上传5个文件。 总文件大小应小于1000MB。 视频时长应少于120分钟。 开始使用:

seata1.4.2版本配置总结

文章目录 环境准备:seata-server配置registry.conf创建数据库表 nacos配置client配置seata_orderseata_storageseata_account 注意点 创建项目seata-order-service2001pom.xml文件application.yml 实体类CommonResultOrder DaoOrderDaoOrderMapper.xml config配置类…

华为Mate 60Pro“一机难求”,预计一年出货1200万部,花粉狂欢

根据天风国际分析师郭明錤的报告显示,华为Mate 60 Pro自8月29日上市以来,需求一直保持强劲势头,并且预计下半年出货量将提高约20%,达到550-600万部。与旧款机型相比,华为Mate 60 Pro的需求明显更加强劲。 例如&#xf…

[SSM]MyBatisPlus进阶

三、进阶篇 3.1映射 3.1.1自动映射规则 表名和实体类名映射 -> 表名user 实体类名User字段名和实体类属性名映射 -> 字段名name 实体类属性名name字段名下划线命名方式和实体类属性驼峰命名方式映射 -> 字段名 user_email 实体类属性名 userEmail 开启驼峰命名 m…

靓丽出挑,轻盈舒适:南卡OE Pro运动蓝牙耳机体验

随着科技的不断发展,运动蓝牙耳机在市场上备受瞩目。NANK南卡在运动蓝牙耳机领域深耕细作多年,旗下Runner挂耳骨传导耳机系列细分多款,并且因为优秀的品质、不俗的性价有着亮眼的销量与风评反馈。最近南卡在自家OE的基础上推出了升级Pro款&am…

Apipost:让API研发更高效、更协同

在数字化时代,API(应用程序接口)已经成为数字生态系统中的重要组成部分。API不仅使得不同应用程序能够相互通信,还成为了企业间进行数据交换和业务整合的关键手段。在这个趋势下,API研发工具市场也日益繁荣&#xff0c…

【Linux】Ubuntu20.04版本安装谷歌中文输入法【教程】

【Linux】Ubuntu20.04版本安装谷歌中文输入法【教程】 文章目录 【Linux】Ubuntu20.04版本安装谷歌中文输入法【教程】一、下载fcitx-googlepinyin二、配置Language SupportReference 一、下载fcitx-googlepinyin 使用下面的命令行下载fcitx-googlepinyin sudo apt-get insta…

【TI毫米波雷达笔记】MMwave毫米波雷达API配置及驱动(以IWR6843AOP为例)

【TI毫米波雷达笔记】MMwave毫米波雷达API配置及驱动&#xff08;以IWR6843AOP为例&#xff09; MMWave API&#xff08;位置处于BSS&#xff09;可以被DSS和MSS调用 通过Mailbox进行数据通信 毫米波雷达接口 #include < ti/control/mmwave/mmwave.h> #include <ti/…

Redis基本了解

Redis 基于内存进⾏存储&#xff0c;⽀持 key-value 的存储形式&#xff0c;底层是⽤ C 语⾔编写的。 基于 key-value 形式的数据字典&#xff0c;结构⾮常简单&#xff0c;没有数据表的概念&#xff0c;直接⽤键值对的形式完成数据的管理&#xff0c;Redis ⽀持 5 种数据类型…

运维Shell脚本小试牛刀(六): Shell中的函数|本地变量

运维Shell脚本小试牛刀(一) 运维Shell脚本小试牛刀(二) 运维Shell脚本小试牛刀(三)::$(cd $(dirname $0)&#xff1b; pwd)命令详解 运维Shell脚本小试牛刀(四): 多层嵌套if...elif...elif....else fi_蜗牛杨哥的博客-CSDN博客 Cenos7安装小火车程序动画 运维Shell脚本小试…

14.Redis 主从复制

Redis 主从复制 redis 主从复制配置 redis 主从复制启动 redis 主从复制断开 redis 主从复制主从复制构特点主从复制的拓扑结构一主一从⼀主多从树状主从 主从复制原理数据同步psync 运行流程全量复制流程部分复制流程实时复制 关于从节点何时晋升成主节点总结 redis 主从复制 …

iKeyPrime完美解4G信号,可以登录iCloud,有消息通知,支持最新iOS16.6。

iKeyPrime是一款绕过激活锁界面的解锁工具&#xff0c;可以激活所有iPhone苹果手机&#xff0c;二网/三网恢复信号&#xff0c;并且支持插卡接打电话、收发短信、4G流量上网&#xff0c;支持iCloud登录&#xff0c;有消息通知&#xff0c;支持iPhone5S~X的所有型号&#xff0c;…

车规微控制器的ECC机制及EMU外设

车规微控制器的ECC机制及EMU外设 文章目录 车规微控制器的ECC机制及EMU外设引言ECC的基本原理ECC RAM的访问方式ECC RAM的初始化SRAM ECC错误注入及EMU外设Flash ECC校验参考文献 引言 ECC是微控制器系统中&#xff0c;用于保障信息安全的常用机制&#xff0c;主要是避免存储设…

gRPC远程进程调用

gRPC远程进程调用 rpc简介golang实现rpc方法一net/rpc库golang实现rpc方法二jsonrpc库grpc和protobuf在一起第一个grpc应用grpc服务的定义和服务的种类grpc stream实例1-服务端单向流grpc stream实例2-客户端单向流grpc stream实例3-双向流grpc整合gin

转型的每一步都至关重要!大运新能源远勤山谈品牌发展之道

“我们转型新能源乘用车&#xff0c;一开始选择研发生产悦虎和远志M1两款中低价位车型是为了“练练手”。我们用这两款车型探路&#xff0c;去熟悉和了解新能源市场&#xff0c;通过一步一步踏踏实实把产品做好&#xff0c;逐渐获得消费者认可&#xff0c;同时也为今后研发其他…

一周AIGC丨中国境内 151 个算法完成备案,腾讯、百度等 11 家 AI 大模型产品陆续上线...

近日&#xff0c;网信办官网公开发布第二批境内深度合成服务算法备案信息。至此&#xff0c;国内已有 151 个算法通过深度合成服务算法名单的备案。腾讯、百度等 11 家 AI 大模型产品完成备案陆续上线&#xff0c;标志着大模型行业在我国正式进入产品化落地阶段&#xff0c;大模…

链动2+1模式,让你的美妆消费变成收入来源

美妆&#xff0c;是一个与女性息息相关的话题&#xff0c;也是一个巨大的市场。据统计&#xff0c;2022年&#xff0c;中国美妆市场规模达到了1.3万亿元&#xff0c;占全球美妆市场的20%。美妆消费者的需求日益多样化和个性化&#xff0c;对产品的品质、效果、安全性等方面有着…

Nougat 深度剖析

Nougat 深度剖析 项目地址&#xff1a;https://github.com/facebookresearch/nougat 论文地址&#xff1a;Nougat: Neural Optical Understanding for Academic Documents 0 背景 近日&#xff0c;MetaAI又放了大招&#xff0c;他们提出了一种全新的端到端的OCR模型&#x…