v8
第一章v8之整体流程
第二章v8之全局环境配置及初始化
2.1全局模板
2.2库函数
2.3初始化
第三章v8之前端建立语法树
3.1v8编译中重要的类
3.2compile之前的查
3.3建立语法树
第四章v8之后端全代码生成(full codegenerator)第五章v8之后端优化代码生成(crankshaft)5.1调用crankshaft的条件
javascript高级语法5.2Hydrogen
5.3Lithium
5.4寄存器分配
第六章v8之运行时监听(runtime profile)
第七章v8之LazyCompiler
第八章v8之inline cache
8.1前提条件及实现方式
8.2stubs函数
第九章v8之性能分析(各流程所占时间比)
第一章v8之整体流程
1.)v8在进入main函数之后首先做的就是参数分析,根据参数设置Flags。
2.)然后创建一个基于栈分配的HandleScope(在这里须得说明在v8中任何一个对象都是需要handle来指向的,如果没有则这个对象将很快被垃圾回收器回收掉。对象的释放意味做handle将没有用,因此在每一个v8逻辑层次中都有一个HandleScope来管理该层次中的所有handle。释放一个scope,则这个scope中的所以handle就被释放掉了)。
3.)创建一个新的执行环境(即为v8执行js的环境,在创建该全局执行环境的同时,创建全局的对象模板,函数模板,编译built_in function(详细情况请见第二章v8之环境配置及初始化)。进入该新建的全局执行环境中(所谓进入该环境变量就是设置当前isolate中执行的环境变量)。
4.)然后就是编译执行*.js用户代码。
a)首先进行语法分析,建立语法树。
b)首次执行采用fullCodegenerator编译最外层框架代码,并开始
执行。
c)运行遇到还没有编译的function代码采用
RuntimeLazyCompile,并用inline cache技术将其他同名的对
象指向该编译的代码。
d)若在运行到该同名对象时发生CacheMiss(调用不匹配),则
采用ICMissLazyCompile对调用的对象或函数进行编译(当然这里还有其他IC处理情况出现,比如ICCompare等等stubs function的处理)。
e)在整个代码运行处理的过程中,v8还会创建一个监听线程
(profile thread),该线程监听function的运行情况,收集类型信息,记录运行次数,记录function编译后的代码量等等,判断该function是否为hot function。(运行次数>2,类型信息收集比例>15%,代码量是否有<5*144,是否发生IC_changed),达到要求后标记该函数为可优化,下次运行的时候采用RuntimeLazyRecompile,利用Crankshaft优化代码,并替换原来的代码。同时还有监听优化过的代码判断其是否优化过头,是否需要deoptimal。
f)在产生的优化代码中常常还要用到on-stack replacement(该技
术为不中断程序继续进行的情况下,进行代码替换)。
g)在Crankshaft生成优化代码的过程中,需要先建立语法树,进
行一次全代码生成,模拟该代码运行,判断分析哪些数据分配到栈上,哪些变量分配到堆上,变量类型绑定等等,利用同一个语法树生成静态单赋值表示的中间表示代码Hydrogen(构建图),同时将function可能调用的代码进行inline(有充足类型信息的被调函数),然后优化图(循环不变量外移,公共子表达式消除)。遍历图生成三地址形式的中间表示Lithium,进行寄存
器分配,最后生成本地代码。
5.)在整个过程中垃圾回收器都紧紧的追踪v8中所有的对象,参看其是否still alive,将其分类进行处理。在进行垃圾回收的时候要中断程序的进行,每次只处理要回收的一部分。
第二章v8之全局环境配置及初始化
2.1全局模板
v8在运行时创建对象,函数都需要调用具体的模板方法来实现。在v8中有2个非常重要和常用的模板,分别是objectTemplate和functionTemplate。
objectTemplate用来在运行时创建对象,向一个objectTemplate中添加properties,就是向所有以该对象模板创建的对象中添加这些属性。继承自Template(继承自data)。Frend class functionTemplate。
functionTemplate用来在运行时创建函数,在一个context中一个functionTemplate只能创建一个函数,该函数的生存周期和context的生存周期相同。每个函数模板可以有属性,并且这些属性会在创建函数的时候添加到该函数中。每个函数模板都有一个对应的实例模板,用来以该函数为构造器创建对象实例。每个函数模板还有一个prototype模板,用来创建函数的原型对象。functionTemplate的具体使用请参见include/v8.h line2109。另外functionTemplate还可以继
承自另外一个函数模板,子函数模板继承父模板的属性,并且通过__proto__可以访问父模板的原型对象。functionTemplate继承自Template,friend class ObjectTemplate。
2.2库函数
在v8中库函数时用javaScript实现的,这样使得库函数的更新,修改更加方便。在runtime.js中,若调用这些库函数将会采用lazyCompile的方式进行编译。
2.3初始化
v8的初始化代码也是使用*.js实现的,在apinatives.js中调用Instantiates函数,对函数,模板,模板实例进行初始化工作。这些js 代码将会在isolate->bootstrpper()->CreateEnvironment(...)中的Gensis 函数中进行编译成本地代码。这些初始化的作用就是实现函数模板,对象模板。当然在初始化的过程中会调用到库函数,调用时将采用lazycompile的方式进行编译。
初始化的作用其实是构造一个运行环境,在这个环境中一切为javascript所需的基本框架将会得到建立,包括库函数,js的模板,对象等。而这些*.js处理的方式和整个v8对待用户的js程序是基本一致的,这些built_in js函数都过Genesis::ConfigureApiObject再调用Execution::Call函数实现编译执行的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论