V8引擎解析JavaScript原理

  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代码

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值