浏览器工作原理和V8引擎

article/2025/11/10 6:17:43

一、浏览器的工作原理
在这里插入图片描述

比如在浏览器中输入网址,然后dns进行解析,解析出的就是服务器的一个ip地址。服务器返回一个html文件,浏览器内核在解析html文件的过程中,遇到link标签和script标签引用的css文件和JavaScript文件就会去下载下来。

二、浏览器内核

  1. 我们经常会说:不同的浏览器有不同的内核组成:

Gecko:早期被Netscape和Mozilla Firefox浏览器浏览器使用;
Trident:微软开发,被IE4~IE11浏览器使用,但是Edge浏览器已经转向Blink;
Webkit:苹果基于KHTML开发、开源的,用于Safari,Google Chrome之前也在使用;
Blink:是Webkit的一个分支,Google开发,目前应用于Google Chrome、Edge、Opera等;
等等…
2. 事实上,我们经常说的浏览器内核指的是浏览器的排版引擎:

排版引擎(layout engine),也称为浏览器引擎(browser engine)、页面渲染引擎(rendering engine) 或样版引擎。
三、浏览器渲染过程
在这里插入图片描述

浏览器内核的 HTML Parse 将 HTML 转化为DOM树(DOM Tree),DOM 的 JavaScript 代码可以对DOM树(DOM Tree)进行操作(JavaScript代码是由JavaScript引擎执行的)。CSS Parse 将css转化为CSS规则(Style Rules)。然后 DOM树(DOM Tree)和CSS规则(Style Rules)通过附加(Attachment)生成渲染树(Render Tree),在 布局引擎(Layout)具体操作下,进行绘制(Painting),浏览器就可以进行展示(Dispaly)。之所以需要布局引擎(Layout),是因为浏览器在不同状态下布局有所不同。

四、认识JavaScript引擎

  1. 为什么需要JavaScript引擎呢?

我们前面说过,高级的编程语言都是需要转成最终的机器指令来执行的;
事实上我们编写的JavaScript无论你交给浏览器或者Node执行,最后都是需要被CPU执行的;
但是CPU只认识自己的指令集,实际上是机器语言,才能被CPU所执行;
所以我们需要JavaScript引擎帮助我们将JavaScript代码翻译成CPU指令来执行;
2. 比较常见的JavaScript引擎有哪些呢?

SpiderMonkey:第一款JavaScript引擎,由Brendan Eich开发(也就是JavaScript作者);
Chakra:微软开发,用于IT浏览器;
JavaScriptCore:WebKit中的JavaScript引擎,Apple公司开发;
V8:Google开发的强大JavaScript引擎,也帮助Chrome从众多浏览器中脱颖而出;
等等…
3. JavaScript是一门高级编程语言:

机械语言————>汇编语言————>高级语言
五、浏览器内核和JS引擎的关系
这里我们先以WebKit为例,WebKit事实上由两部分组成的:

WebCore:负责HTML解析、布局、渲染等等相关的工作;
JavaScriptCore:解析、执行JavaScript代码;
另外一个强大的JavaScript引擎就是V8引擎。

六、V8引擎原理

  1. 我们来看一下官方对V8引擎的定义:

V8是用C ++编写的Google开源高性能JavaScript和WebAssembly引擎,它用于Chrome和Node.js等。
它实现ECMAScript和WebAssembly,并在Windows 7或更高版本,macOS 10.12+和使用x64,IA-32, ARM或MIPS处理器的Linux系统上运行。
V8可以独立运行,也可以嵌入到任何C ++应用程序中。

在这里插入图片描述

  1. V8引擎架构

Parse模块会将JavaScript代码转换成AST(抽象语法树),这是因为解释器并不直接认识JavaScript代码
如果函数没有被调用,那么是不会被转换成AST的。PreParse(预解析),并不是一开始所有代码都需要执行,所以V8引擎就实现了Lazy Parsing(延迟解析)的方案,它的作用是将不必要的函数进行预解析,也就是只解析暂 时需要的内容,而对函数的全量解析是在函数被调用时才会进行;

Ignition是一个解释器,会将AST转换成ByteCode(字节码)
同时会收集TurboFan优化所需要的信息(比如函数参数的类型信息,有了类型才能进行真实的运算); 如果函数只调用一次,Ignition会执行解释执行ByteCode;

TurboFan是一个编译器,可以将字节码编译为CPU可以直接执行的机器码
如果一个函数被多次调用,那么就会被标记为热点函数,那么就会经过TurboFan转换成优化的机器码,提高代码的执行性能; 但是,机器码实际上也会被还原为ByteCode,这是因为如果后续执行函数的过程中,类型发生了变化(比如sum函数原来执行的是 number类型,后来执行变成了string类型),之前优化的机器码并不能正确的处理运算,就会逆向的转换成字节码。

七、执行上下文

<script>var name = 'why'foo(123)function foo (num) {console.log(m)var m = 10var n = 20function bar () {console.log(name)}bar()}
</script>
复制代码
  1. 全局代码执行前的解析(红色框内)
    在这里插入图片描述

  2. 全局代码执行和foo函数执行体执行前的解析(红色框内)
    在这里插入图片描述

  3. foo函数执行体执行(红色框内)
    在这里插入图片描述

  4. bar函数执行体执行前的解析
    在这里插入图片描述

  5. bar函数执行体执行
    在这里插入图片描述

因为bar函数内无name属性,所以向上到父级作用域中找 (看函数定义时的位置,其所在的上一层作用域为父级作用域,不时看调用位置)。如果在GO或之前找到,则输出name值,否则报出undefined。

bar函数执行体执行完后,则函数执行上下文(FEC)退出ECS执行上下文栈;foo函数执行体执行完后;函数执行上下文(FEC)一样退出ECS执行上下文栈。
基于早期ECMA的版本规范:
每一个执行上下文会被关联到一个变量对象(variable object,VO),在源代码中的变量和函数声明会被作为属性添加到VO中。对与函数来说,参数也会被添加到VO中。
在最新的ECMA的版本规范中,对于一些词汇进行了修改:
每一个执行上下文会被关联到一个变量环境(VariableEnvironment),在执行代码中的变量和函数声明会被作为环境记录(Environment Record)添加到变量环境中。对与函数来说,参数也会被环境记录添加到变量环境中。
八、作用域提升面试题
建议:要是像我一样这种基础薄弱的人来说,做题时还是建议画一下执行上下文来理解,这样更加加深印象和理解!!!

<script>var n = 100function foo () {n = 100}foo()console.log(n)//100
</script>
复制代码
<script>function foo () {console.log(n)//undefinedvar n = 200console.log(n)//200}var n = 100foo()
</script>

复制代码

<script>var n = 100function foo1 () {console.log(n)//100}function foo2 () {var n = 200console.log(n)//200foo1()}foo2()console.log(n)//100
</script>
复制代码
<script>var n = 100function foo () {console.log(n)returnvar n = 100//undefined}foo()
</script>
复制代码
<script>function foo () {var a = b = 100// b=100(该赋值语句在该函数作用域到全局作用域之中找不到,则添加到全局作用域中)// var a=100}foo()console.log(a)//报错 a is not definedconsole.log(b)//100
</script>

最后
如果你觉得此文对你有一丁点帮助,点个赞。或者可以加入我的开发交流群:1025263163相互学习,我们会有专业的技术答疑解惑

如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点star:http://github.crmeb.net/u/defu不胜感激 !

PHP学习手册:https://doc.crmeb.com
技术交流论坛:https://q.crmeb.com


http://chatgpt.dhexx.cn/article/2HMcpW2b.shtml

相关文章

V8引擎学习

计算机模型 寄存器 中央处理器的组成部分寄存器是有限存储容量额高速存储部件可以用来暂存指令&#xff0c;数据和地址存储器内的数据可以用来执行算术和逻辑运算。寄存器内的地址可用于指向内存的某个位置 内存 随机存取存储器也叫内存&#xff0c;英文缩写RAMRAM是与CPU直…

V8垃圾回收

来自李兵老师的《浏览器工作原理与实践》&#xff0c;太赞了 垃圾回收 内存空间栈空间和堆空间不同语言的垃圾回收策略调用栈中的数据是如何回收的堆中的数据是如何回收的副垃圾回收器主垃圾回收器总结 在我们说V8垃圾回收之前&#xff0c;先讲讲 数据是如何存储的&#xff1f;…

认识V8引擎

1、前言 编程语言一般分为两类&#xff0c;解释性语言和编译性语言。编译型语言在执行之前要先进行完全编译&#xff0c;而解释型语言一边编译一边执行&#xff0c;很明显编译型语言会比解释性语言快&#xff0c;而JavaScript就是一种解释型脚本语言&#xff0c;支持动态类型、…

V8引擎执行原理

v8是C编写的Google开源高性能JavaScript和WebAssembly引擎&#xff0c;它用于Chrome和Node.js等。 它实现ECMAScript和WebAssembly。 v8可独立运行&#xff0c;也可嵌入到任何C应用程序中。 parse模块 parse模块会将JavaScript代码转换成AST(抽象语法树)&#xff0c;因为…

Google V8引擎浅析

前端开发人员都会遇到一个流行词&#xff1a;V8。它的流行程度很大一部分是因为它将JavaScript的性能提升到了一个新的水平。是的&#xff0c;V8很快。但它是如何发挥它的魔力&#xff1f; 前言 源代码&#xff1a;https://source.chromium.org/chromium/chromium/src//master:…

js中v8引擎的详解-看的吐血

v8引擎出现的原因 这里先说一下什么是编译型语言和解释性语言&#xff1a; 编译型语言&#xff1a; 在程序执行之前必须进行专门的编译过程&#xff0c;有如下特点&#xff1a; 只须编译一次就可以把源代码编译成机器语言&#xff0c;后面的执行无须重新编译&#xff0c;直接…

Google V8 引擎

V8的前世今生 V8是JavaScript渲染引擎&#xff0c;第一个版本随着Chrome的发布而发布(具体时间为2008年9月2日)。在运行JavaScript之前&#xff0c;相比其它的JavaScript的引擎转换成字节码或解释执行&#xff0c;V8将其编译成原生机器码&#xff08;IA-32, x86-64, ARM, or M…

编译v8引擎

本机环境是win7vs2010(本来想用2012的&#xff0c;但是发现默认的项目是2010的) 1、首先下载V8的源码 安装好svn&#xff0c;并在cmd下能使用svn help&#xff1a; svn下载地址&#xff08;安装包&#xff09;&#xff1a;http://download.csdn.net/detail/zengraoli/5651551 …

JavaScript引擎—V8引擎

为什么需要Javascript引擎&#xff1f; 随着JS承担的工作越来越多&#xff0c;早就已超越创造出的初衷&#xff08;表单验证&#xff09;的范畴&#xff0c;因此需要快速的解析和执行JavaScript脚本 V8引擎由此而生 JavaScript引擎主要功能&#xff1a;结合JS语言特性 和 本质 …

LVGL V8

本文适用于LVGL V8版本 LVGL simulator vs2019 官方工程 lv_sim_visual_studio 使用注意事项&#xff1a; 1、将官方工程从github上下载下来&#xff0c;最好使用git 将整个工程clone下来&#xff0c;因为工程内部有依赖&#xff0c;如果只是将工程Download下来&#xff0c;无…

为什么V8引擎这么快?

转载请注明出处:http://blog.csdn.net/horkychen Google研发的V8 JavaScript引擎性能优异。我们请熟悉内部程序实现的作者依源代码来看看V8是如何加速的。 作者&#xff1a;Community Engine公司研发部研发工程师Hajime Morita Google的Chrome中的V8 JavaScript引擎&#xff0…

垃圾回收机制之v8引擎

v8的内存分配 &#xff08;栈&#xff08;执行环境&#xff09;跟堆&#xff09; 堆内存负责垃圾回收机制&#xff0c;只有新生代和老生代两部分 新生代&#xff1a;对等分的&#xff08;严格&#xff09; 老生代&#xff1a; 都是由新生代转变的&#xff08;连续的空间&…

V8 JavaScript引擎

简介 V8 (v8.dev)是 Google 的开源高性能 JavaScript 和 WebAssembly 引擎&#xff0c;用 C 编写。它用于 Chrome 和 Node.js 等。它实现了 ECMAScript 和 WebAssembly&#xff0c;并运行在 Windows 7 或更高版本、macOS 10.12 以及使用 x64、IA-32、ARM 或 MIPS 处理器的 Lin…

V8、JSCore、Hermes、QuickJS,hybrid开发JS引擎怎么选

&#x1f4cc; 如果你喜欢我写的文章&#xff0c;可以把我的公众号设为星标 &#x1f31f;&#xff0c;这样每次有更新就可以及时推送给你啦 在一般的移动端开发场景中&#xff0c;每次更新应用功能都是通过 Native 语言开发并通过应用市场版本分发来实现的。 但是市场瞬息万变…

v8引擎详解

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

Chrome V8引擎介绍

随着Web相关技术的发展&#xff0c;JavaScript所要承担的工作也越来越多&#xff0c;早就超越了“表单验证”的范畴&#xff0c;这就更需要快速的解析和执行JavaScript脚本。V8引擎就是为解决这一问题而生&#xff0c;在node中也是采用该引擎来解析JavaScript。V8是如何使得Jav…

V8引擎原理

V8引擎原理 V8是用C编写的Googl开源高性能JavaScript和WebAssembly引擎&#xff0c;它也用于Chrome和Node.js等 V8的解析js的流程 js直接放到cpu中无法执行&#xff0c;需要通过v8转换js先被转换成ast语法树&#xff0c;在此期间主要是进行词法分析和语法分析ast语法树通过…

聊聊V8引擎

V8 是什么 V8 是 Google 开源的 JavaScript 引擎。可以理解为&#xff1a;V8 将程序员写的代码&#xff0c;最终解析成机器码能够让计算机识别。其中的具体操作&#xff0c;就是 V8 干的事。我们把 V8 看成一个黑盒&#xff0c; 程序语言进去&#xff0c;通过黑盒子的处理&…

GNSS测量与数据处理第六周作业

1.简述GPS载波相位测量的基本原理 答&#xff1a;若卫星S发出一载波信号&#xff0c;该信号向各处传播。设某一瞬间&#xff0c;该信号在接收机R处的相位为φR&#xff0c;在卫星S处的相位为φS&#xff0c;φR、φS为从某一起点开始计算的包括整周数在内的载波相位&#xff0c…

三角测量计算三维坐标的代码_室内定位系统的三边测量与三角测量

三边测量依赖于信号强度作为距离的类比。三角测量依赖于标签信号接收的时间差。 室内资产跟踪非常流行。但是&#xff0c;当谈到整个室内资产跟踪时&#xff0c;请务必记住&#xff0c;它是由一组松散编织的技术组成的&#xff0c;每种技术都可以使用以下两种方法之一来计算位置…