V8引擎解析JavaScript原理

article/2025/11/10 6:18:39
  1. 为什么需要JavaScript引擎呢?

  • 高级的编程语言都是需要转成最终的机器指令执行的

  • 我们编写的JavaScript无论交给浏览器和Node执行,最后都是被CPU执行的

  • CPU只认识自己的指令集,实际上是机器语言,才可以被CPU所执行

  • 所以需要借助JavaScript引擎帮助我们将JavaScript代码翻译成CPU指令来执行

  1. V8引擎的原理

第一阶段:1--2

  • JavaScript源代码通过Parse将JavaScript转换成AST(抽象语法树) 如果函数没有运行就不会被转换成AST的

第二阶段:2--3

  • 然后利用Ignition解释器 会将AST转换成ByteCode字节码

  • 同时Ignition会收集TurboFan优化需要的信息(比如函数参数的类型信息,有了类型才能进行真实的运算)

  • 如果函数只调用一次 Ignition会执行解释ByteCode

  • TurboFan是一个编译器 将字节码编译为机器码

  • 如果一个函数多从被调用就会被标记为热点函数,那么就会经过TurnboFan直接转换成机器码 提高到代码执行性能

  • 但是也会被还原成ByteCode 这是因为函数执行过程中类型发生了变化 比如刚开始函数传参传递的的都是number型,后来执行变成了string型)不能做出正确的处理运算 就会再次转换成字节码

第三阶段 3--4

  • 执行代码

  1. 那么JavaScript源码是如何编译成AST树呢?(Parse过程)

  • BlinK将源码交给V8引擎 Stream获取到源码并且进行编码转换;

  • 词法分析:Scanner会进行词法分析 词法分析会将代码换成tokens

  • 语法分析:经过Parser和PreParser,接下来tokens就会被转换成AST树

  • Parser是直接将tokens转成AST树架构

  • PreParser称为预解析 为什么需要预解析呢?

  • 这是因为并不是所有的JavaScript代码 在一开始都会被解析,(因为当前函数不确定会不会被执行)如果对所有JavaScript代码进行解析必然会影响网页的运行效率

  • 所以V8引擎就实现了,延迟解析的方案,它的作用就是将不必要的函数进行预解析,也就是只解析暂时需要的内容,而对函数的全量解析会在函数被调用时才会及进行

  • 比如我们在一个函数内部定义了另外一个函数inner 那么inner函数就会进行预解析

  • 生成AST树后 (编译阶段结束),会被Ignitiom转成字节码,之后的过程就是代码的执行过程

假如我们有下面一段代码 他在JavaScript是如何执行的呢?

  • JS引擎在编译阶段的时候,会在堆内存中创建一个对象 :Global Object(GO)

  • 该对象所有作用域都可以访问

  • 里面会包含 Date Array String Number setTimeout setInterval 等

  • 还有一个window属性指向自己(window.window.window)

  • js引擎内部有一个执行上下文栈 简称ESC 它是用于执行代码的调用栈(开始执行代码

  • 全局的代码块执行会在执行栈中创建一个GEC(全局执行上下文包含两部分

  • 第一部分:存放编译阶段存放的GO对象,这个过程也称之为变量的作用域提升

  • 第二部分:在代码执行中,对变量进行赋值,或者执行其他函数

  • 此时代码就会一行一行的执行

  • 当我们先consloe.log(name) 由于name存在变量提升,会先读取GO对象中的name,而此刻的name就是默认的undefind

  • 遇到函数怎么解析

第一步 编译阶段会在全局对象GO中增加一个foo变量,会在堆内存中开辟一个新地址,该内存保存父级作用域和函数体,foo变量指向该内存地址 词法分析阶段已经确定了函数的作用域

第二步,在编译阶段会创建一个AO对象,该对象中包含形参,arguments ,定义的变量,该阶段还未手动赋值,默认就是undefind

第三步 在执行函数的时候会创建一个函数执行上下文对象叫做 FEC,FEC中包含三部分

第一部分:存放编译阶段生成的AO对象

第二部分:作用域链,由VO和父级VO组成,查找时会一层一层查找

第三部分:this绑定的值

第四步开始一行一行执行js代码


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

相关文章

V8引擎详解(一)——概述

背景 在现有的javascript引擎中,V8引擎绝对是其中的佼佼者,chrome和node底层都使用了V8引擎,其中chrome的市场占有率已经达到70%,而node更是前端工程化以及扩展边界的核心支柱,V8引擎对于一个前端开发工程师来说重要程…

浏览器工作原理和V8引擎

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

V8引擎学习

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

V8垃圾回收

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

认识V8引擎

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

V8引擎执行原理

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

Google V8引擎浅析

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

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

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

Google V8 引擎

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

编译v8引擎

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

JavaScript引擎—V8引擎

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

LVGL V8

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

为什么V8引擎这么快?

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

垃圾回收机制之v8引擎

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

V8 JavaScript引擎

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

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

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

v8引擎详解

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

Chrome V8引擎介绍

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

V8引擎原理

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

聊聊V8引擎

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