大纲:js语言和内存空间;V8基本介绍;V8解释器执行代码的流程;V8做的性能优化措施;V8垃圾回收;JS语法和数据结构在V8中的实现;
一.预备知识:JS语言和内存空间
1.静态语言就是强类型?
静态、动态语言,强类型、弱类型语言的关系(1)静态语言,使用前要确定数据类型(2)动态语言,运行中检查数据类型;(3)弱类型语言,支持隐式类型转换(4)强类型,不支持隐式转换;C是静态语言,但是它支持隐式转换,是弱类型;
2.JS的内存空间
(1)分为三类,代码空间,栈stack空间,堆heap空间;为什么不放在一起?因为放在一起,会影响执行上下文切换和执行效率;(2)堆(heap)和栈(stack)的区别:1)栈:空间较小;先进后出;动态分配的空间一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。2)堆:空间较大;队列优先,先进先出;由操作系统自动分配释放,存放函数的参数值,局部变量的值等。(3)原始类型的数据值都是直接保存在“栈”中的,引用类型的值是存放在“堆”中?其实并没有那么简单,在V8源码中(1)字符串:存在堆里,栈中为引用地址,如果存在相同字符串,则引用地址相同。(2)数字:小整数存在栈中,其他类型存在堆中。(3)其他类型:引擎初始化时分配唯一地址,栈中的变量存的是唯一的引用。(4)闭包的内存模型,Closure比如下面这题,foo中有个闭包对象,有两个属性值myName和test1,存到堆中;
执行到foo函数中“returninnerBar”的调用栈情况~
二.V8基本概念
1.浏览器内核、渲染引擎和JS引擎的区别
(1)浏览器内核又可以分成两部分:渲染引擎(layoutengineer或者RenderingEngine)和JS引擎。(2)渲染引擎:负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入CSS等),以及计算网页的显示方式,然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。所有网页浏览器、电子邮件客户端以及其它需要编辑、显示网络内容的应用程序都需要内核。种类:Tridend:IT浏览器Geoko:Firefox浏览器Webkit:safari、andriod、chrome(后来使用Blink渲染引擎)(3)JS引擎:解析和执行javascript来实现网页的动态效果。(4)区别最开始渲染引擎和JS引擎并没有区分的很明确,后来JS引擎越来越独立,内核就倾向于只指渲染引擎。渲染引擎使用JS引擎的接口来处理逻辑代码并获取结果。JS引擎通过桥接接口访问渲染引擎中的DOM及CSSOM
2.主流JS引擎
V8(Google)
SpiderMonkey(Mozilla)
JavaScriptCore(Apple)JavaScriptCore引擎是WebKit中默认的JavaScript引擎,也是苹果开源的一个项目,应用较为广泛。最初,性能不是很好,从年开始了一系列的优化,重新实现了编译器和字节码解释器,使得引擎的性能有较大的提升。随后内嵌缓存、基于正则表达式的JIT、简单的JIT及字节码解释器等技术引入进来,JavaScriptCore引擎也在不断的迭代和发展。JavaScriptCore与V8有一些不同之处,其中最大的不同就是新增了字节码的中间表示,并加入了多层JIT编译器(如:简单JIT编译器、DFGJIT编译器、LLVM等)优化性能,不停的对本地代码进行优化。
Chakra(Microsoft)
duktape(IOT)
JerryScript(IOT)
QuickJS
Hermes(Facebook-ReactNative)
3.V8基本介绍
V8是一个由Google开源的采用C++编写的高性能JavaScript和WebAssembly引擎,应用在Chrome和Node.js等中。它实现了ECMAScript和WebAssembly,运行在Windows7及以上、macOS10.12+以及使用x64、IA-32、ARM或MIPS处理器的Linux系统上。V8可以独立运行,也可以嵌入到任何C++应用程序中。
(1)V8由来
V8最初是由LarsBak团队开发的,以汽车的V8发动机(有八个气缸的V型发动机)进行命名,预示着这将是一款性能极高的JavaScript引擎,在年9月2号同chrome一同开源发布。
(2)为什么需要V8
我们写的JavaScript代码最终是要在机器中被执行的,但机器无法直接识别这些高级语言。需要经过一系列的处理,将高级语言转换成机器可以识别的的指令,也就是二进制码,交给机器执行。这中间的转换过程就是V8的具体工作。
(3)V8组成
首先来看一下V8的内部组成。V8的内部有很多模块,其中最重要的4个如下:
Parser:解析器,负责将源代码解析成AST
Ignition:解释器,负责将AST转换成字节码并执行,同时会标记热点代码
TurboFan:编译器,负责将热点代码编译成机器码并执行
Orinoco:垃圾回收器,负责进行内存空间回收
(4)V8工作流程
以下是V8中几个重要模块的具体工作流程图。下面详细分析。
三.V8解释执行JS代码的工作流程
1.编译器Compiler和解释器Interpreter
按语言的执行流程,可以把语言划分为编译型语言和解释型语言。
1-1.编译型语言
在程序执行之前,需要经过编译器的编译过程,并且编译之后会直接保留机器能读懂的二进制文件,这样每次运行程序时,都可以直接运行该二进制文件,而不需要再次重新编译了。比如C/C++、GO等都是编译型语言。
1-2.解释型语言
在每次运行时都需要通过解释器对程序进行动态解释和执行。比如Python、JavaScript等都属于解释型语言。
2.V8执行一段代码流程图
2-1.生成抽象语法树(AST)和执行上下文
2-1-1.AST
(1)编译器或解释器,他们不理解高级语言,只可以理解AST;(2)可以把AST看成代码的结构化表示;在线AST网站
转载请注明:http://www.aideyishus.com/lkyy/3642.html