V8引擎解析JavaScript原理
为什么需要JavaScript引擎呢?
高级的编程语言都是需要转成最终的机器指令执行的
我们编写的JavaScript无论交给浏览器和Node执行,最后都是被CPU执行的
CPU只认识自己的指令集,实际上是机器语言,才可以被CPU所执行
所以需要借助JavaScript引擎帮助我们将JavaScript代码翻译成CPU指令来执行
V8引擎的原理
第一阶段:1--2
JavaScript源代码通过Parse将JavaScript转换成AST(抽象语法树) 如果函数没有运行就不会被转换成AST的
第二阶段:2--3
然后利用Ignition解释器 会将AST转换成ByteCode字节码
同时Ignition会收集TurboFan优化需要的信息(比如函数参数的类型信息,有了类型才能进行真实的运算)
如果函数只调用一次 Ignition会执行解释ByteCode
TurboFan是一个编译器 将字节码编译为机器码
如果一个函数多从被调用就会被标记为热点函数,那么就会经过TurnboFan直接转换成机器码 提高到代码执行性能
但是也会被还原成ByteCode 这是因为函数执行过程中类型发生了变化 (比如刚开始函数传参传递的的都是number型,后来执行变成了string型)不能做出正确的处理运算 就会再次转换成字节码
第三阶段 3--4
执行代码
那么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代码
V8引擎解析JavaScript原理相关推荐
- 《十》浏览器基础及渲染引擎解析一个网页的过程、JavaScript 引擎解析 JavaScript 代码的过程
浏览器:是安装在电脑里面的一个软件,能够将页面内容渲染出来呈现给用户查看,并让用户与网页进行交互. 服务器其实就是性能比较高的计算机,这些计算机 24 小时不断电. 不关机. 开发者在本地开发出 HT ...
- 浏览器原理-v8引擎-js执行原理
浏览器原理-v8引擎-js执行原理 js简介 js应用: js的应用很广泛 可以应用于web,移动端,小程序,桌面应用,后端开发等 web开发包括(原生js,react,vue,angular等) 移 ...
- 浏览器解析JavaScript原理
1.浏览器解析JavaScript原理特点: 1.跨平台 2.弱类型 javascript 定义的时候不需要定义数据类型,数据类型是根据变量值来确定的. var a = 10; 数字类型 ...
- V8引擎-js执行原理
前言: 今天小编给大家讲解一下小伙伴们心中一直存在的问题,那就是我们在使用node环境或者浏览器的时候为什么可以执行js代码? 我们定义了很多的变量和函数内部是如何处理的? 以及我们常常说的作用域 ...
- JavaScript怎么安装_几句话说清楚JavaScript、V8引擎、NodeJS、NMP,到底是什么东东...
小程序开发如火如荼,如果你是程序员,你还不懂小程序的开发,恐怕会被同行认为太LOW了吧!不过,新入行小程序开发者确实会被新的名词搞得一头雾水. 比如JavaScript不是在浏览器端运行吗,怎么还可以 ...
- JavaScript 工作原理(二)-如何在 V8 引擎中书写最优代码的 5 条小技巧(译)
From:https://segmentfault.com/a/1190000014770145 原文请查阅这里,略有删减. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScrip ...
- JavaScript 工作原理之二-如何在 V8 引擎中书写最优代码的 5 条小技巧(译)
原文请查阅这里,略有删减. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第二章. 本章将会深入谷歌 V8 引擎的内部结构.我们也会为如何书写更好的 Java ...
- V8引擎:编译器和解析器是如何执行一段javascript代码的?
前言 前面我已经说完了js引擎是如何存储数据,如何回收垃圾的,但这只是基础罢了,并不是v8引擎的最主要任务,接下来我要讲v8引擎的核心:如何执行js代码,为什么要学习这些东西呢? 前端工具和框架的自身 ...
- JavaScript工作原理(二):V8引擎和5招高效代码
本系列的第一篇文章重点介绍了引擎,运行时和调用栈的概述.第二篇文章将深入V8的JavaScript引擎的内部.我们还会提供一些关于如何编写更好的JavaScript代码的技巧. 概述 JavaScri ...
最新文章
- 怎么用python画个电脑_python语言还是java如何用python画爱心
- [译] 如何写一篇杀手级的软件工程师简历
- redhat及deban系列linux软件管理的一些问题
- linux字符设备led驱动源码,字符设备驱动控制LED灯
- 初中数学503个必考知识点_初中数学无非就这146个必考知识点,全摸透,轻松应对考试!...
- JS基础--函数与BOM、DOM操作、JS中的事件以及内置对象
- Project Honolulu 正式版发布为 Windows Admin Center
- 2019.4.26今日任务
- Apache常见配置及问题
- 【转】Google Chrome浏览器调试
- 计算机二级教程第十章答案,2012年计算机二级VFP考试第十章课后练习题及答案...
- 没有加载jawt导致java.lang.UnsatisfiedLinkError
- python 参数一样结果不一样_优化Keras的超参数:相同参数的结果不同
- 小米笔记本pro充电测试软件,小米笔记本 Pro 评测:高端已成,性价比不变
- python文件加减法_python生成PDF文件20以内加减法,给上小学的宝宝
- Pytorch学习——池化层
- 垃圾小白羊leetcode刷题记录1
- 接收信号强度值dbm分析
- Redis学习、缓存、持久化、哨兵模式
- BEA助中国一汽构建核心ERP系统
热门文章
- 计算机打80000音乐,抖音emm想你想我bgm是什么 80000完整歌词介绍
- [HIHO1560] H国的身份证号码II(dp,计数,矩阵快速幂)
- Java调用百度API实现文本与图像审核功能
- 学习笔记12--环境感知传感器技术之激光雷达
- 如何成为安卓软件开发工程师?
- 全国中小学教师计算机水平考试,全国中小学教师教育技术水平考试网
- 「数字电子技术基础」3.逻辑代数基础
- 12万游戏账号一夜被封杀
- python socket使用UDP控制继电器进行硬件产品循环开关机测试
- Excel VBA:打开与关闭工作簿——Workbooks对象