[WebKit] JavaScriptCore解析--基础篇(三)从脚本代码到JIT编译的代码实现

前面说了一些解析、生成ByteCode直至JIT的基本概念,下面是对照JavaScriptCore源代码来大致了解它的实现。

从JS Script到Byte Code

首先说明Lexer, Parser和ByteCode的生成都是由ProgramExecutable初始化过程完成的。先在JSC的API evaluate()中会创建ProgramExecutable并指定脚本代码。然后传入Interpreter时,再透过CodeCache获取的UnlinkedProgramCodeBlock就是已经生成ByteCode后的Code Block了。

下图是CodeCache调用Parser和ByteCodeGenerator的序列图:

而Lexer则是在Parser过程中调用的,如下图:

再从类图来观察所涉及的几个类之间的关系:

关于CodeBlock、UnlinkedCodeBlock和ScriptExecutable

CodeBlock可以理解为代码管理的类,按类型分为GlobalCodeBlock, ProgramCodeBlock, FunctionCodeBlock及EvalCodeBlock, 与之对应的UnlinkedCodeBlock和ScriptExecutable也有相似的继承体系,如下所示:

UnlinkedCodeBlock存储的是编译后的ByteCode,而CodeBlock则会用于LLint和JIT。

ProgramExecutable则可以理解为当前所执行脚本的大总管,从其名字上可以看出来是代表一个可执行程序。

它们的作用也很容易理解。

关于LLint的slow path

前面说过了LLint是基于offlineasm的汇编语言,这里只是介绍一下它的slow path. 为了处理一些操作,需要在LLint执行指令时调用一些C函数进行扩展处理,比如后面要说明的JIT统计功能,LLint提供一个调用C函数的接口,并将所有会被调用的C函数称为slow path,如下图所示:

代码可以在LowLevelInterpreterXXX.asm中看到。所以可以C函数声明看到带有SLOW_PATH的宏。

关于JIT优化的触发

首先JSC使用的是基于计数器的热点探测方法。前面提到函数或循环体被执行若干次后会触发JIT, 首先这个次数是可以通过JSC::Options中的thresholdForOptimizeSoon来设定的。然后在LLint在执行循环的ByteCode指令loop_hint和函数返回指令ret时会调用slow
path中的C函数,进行次数统计和判断,过程如下:

  其中会根据checkIfJITThresholdReached()返回结果来决定是否进行jitCompile.一旦要进行JIT编译时,也是根据当前CodeBlock的类型,而执行针对不同函数或代码段的优化。下面显示的是对一个频繁使用的函数进行JIT编译的操作:

其中计数的功能并非由CodeBlock直接实现,而是通过ExecutionCounter来管理的。主要关系如下:

     

转载请注明出处:http://blog.csdn.net/horkychen

参考:WebKit研究

相关的UML图可以到这里下载 :WebKit Documentation on GitHub

系列索引:

基础篇 (一)JSC与WebCore

基础篇(二)解释器基础与JSC核心组件

基础篇(三)从脚本代码到JIT编译的代码实现

基础篇(四) 页面解析与JavaScript元素的执行

高级篇(一) SSA (static single assignment)

高级篇(二) 类型推导(Type Inference)

高级篇(三) Register Allocation & Trampoline

时间: 2024-09-17 03:34:46

[WebKit] JavaScriptCore解析--基础篇(三)从脚本代码到JIT编译的代码实现的相关文章

[WebKit] JavaScriptCore解析--基础篇(四) 页面解析与JavaScript元素的执行

很多地方都已经介绍了JavaScript在浏览器是如何被执行的,这里介绍一下WebKit是如何实现的.主要涉及JS的async,defer及普通脚本的解析与执行过程的代码实现. 1. 概要说明 先概要说明一下浏览器如何执行JavaScript的. 首先浏览器的页面解析器(Document Parser)遇到<script>就会发起下载(脚本内容在页面内的就不用下载了).然后针对不同情况执行的方式有所不同:   . async (在script标签中启用了async属性)       这是异步执

[WebKit] JavaScriptCore解析--基础篇 (一)JSC与WebCore

先看一下官方的基本介绍,短短几句就塞满了关键字. SquirrelFish,正式名称是JavaScriptCore,包括register-based(基于寄存器的虚拟机), direct-threaded, high-level bytecode engine(字节码引擎).它使用基于内置copy propagation(复制性传播算法)的一次性编译器(one-pass compiler),能够延迟从语法树(Syntax Tree)上生成字节码(Bytecodes). 由此可见JavaScrip

[WebKit] JavaScriptCore解析--基础篇(二)解释器基础与JSC核心组件

这一篇主要说明解释器的基本工作过程和JSC的核心组件的实现. 作为一个语言,就像人在的平时交流时一样,当接收到信息后,包含两个过程:先理解再行动.理解的过程就是语言解析的过程,行动就是根据解析的结果执行对应的行为.在计算机领域,理解就是编译或解释,这个已经被研究的很透彻了,并且有了工具来辅助.而执行则千变万化,也是性能优化的重心.下面就来看看JSC是如何来理解.执行JavaScript脚本的. 解释器工作过程 JavaScriptCore基本的工作过程如下: 对于一个解释器,首先必须要明确所支持

[WebKit] JavaScriptCore解析--高级篇(三) Register Allocation &amp;amp; Trampoline

Register Allocation 对于一个JIT而言,寄存器分配对系统的消耗通常是一个瓶径.之前有Graph Coloring Allocators, Chaitin style等分配方式,现在要介绍的是DFG JIT使用的Linear Scan算法.其基本工作方式是将占用寄存器的变量根据生命周期长短排列出来,在使用时查看可以回收哪些寄存器加以利用. 先看一些定义: •Live interval:是某个变量可以存活的一个指令序列,也可以称为了连续性.这个也依赖于算法使用的是深度优先还是广度

[WebKit] JavaScriptCore解析--高级篇(二) 类型推导(Type Inference)

类型推导是DFG JIT最重要的一个基础,WebKit官网对此做了一点解释,翻译如下做为学习参考. Type inference通过profiling values来做到的,先是预测对哪些类型操作进行分析,再添加类型检查,最后基于类型检查的结果建立类型统计数据. 用下面的例子来说明这个过程: o.x * o.x + o.y * o.y 其中o是一个对象,x和y是它的属性,它们不是访问器(accessor),只是一般的属性.我们也可以说这两个属性值会返回double类型数值,但也有时会返回整型数据

[WebKit] JavaScriptCore解析--高级篇(一) SSA (static single assignment)

在编译器优化领域,数据结构的选择会直接影响程序优化的有效性.SSA是一种编译器使用的中间语言(intermediate language), 作为编译优化的基础(也是DFG JIT的基础),它和Control Dependence Graph一起被用来表示程序的数据流和控制流. 大家都知道编译器是这样工作的:解析.优化,最后生成代码.中间会使用到一个中间语言的进行过度,好的中间语言一定要      1. 简单,这样优化工作就可以变得简单.      2. 很好的表达能力,这样就可以很容易从源代码

WF4.0 基础篇(三十 完) 对学习WF的一点建议

从09年10月份 NET4.0 Bata 2发布后,我就开始写[WF4.0 基础篇]这个系列,经历了5个多月终于在NET4.0正式发布前将这个系列完成了. 这段时间与一些对WF4.0感兴趣的公司与开发人员有过一些交流. 先说一下对WF感兴趣的公司,有些公司已经开始用WF4.0开发业务流程管理类软件了,这些公司与我交流的问题多是在开发中遇到的现实问题,在交流中我发现这些公司对WF4.0技术的掌握成度还欠缺些火候,但这不是太大的问题,真正让我担忧的是这些公司基本上没有业务流程管理类软件(俗称工作流)

dojo 之基础篇(三)之向服务器发送数据_dojo

向服务器发送数据有get和post两种. 首先,要将body中的html代码替换为 <button dojoType="Button" widgetId="helloButton">Hello World!</button> <br> 请输入名称: <input type="text" id="name"> 不输入数据,怎么提交数据呢. get我们只要将基础篇(二)中的: fun

WF4.0基础篇(三) 流程实例WorkflowApplication与设计WF程序的基本原则

通过本节,可以初步了解WF程序的特性,为以后的WF类应用开发提供一个初步的感性认识 本文的两个例子 http://files.cnblogs.com/foundation/LoadXamlSample.rar http://files.cnblogs.com/foundation/WorkflowApplicationSample.rar 流程实例WorkflowApplication与设计WF程序的基本原则 流程实例WorkflowApplication 我在[开始使用WF4.0.]中创建一个