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

简介: Register Allocation对于一个JIT而言,寄存器分配对系统的消耗通常是一个瓶径。之前有Graph Coloring Allocators, Chaitin style等分配方式,现在要介绍的是DFG JIT使用的Linear Scan算法。

Register Allocation

对于一个JIT而言,寄存器分配对系统的消耗通常是一个瓶径。之前有Graph Coloring Allocators, Chaitin style等分配方式,现在要介绍的是DFG JIT使用的Linear Scan算法。其基本工作方式是将占用寄存器的变量根据生命周期长短排列出来,在使用时查看可以回收哪些寄存器加以利用。


先看一些定义:

Live interval:是某个变量可以存活的一个指令序列,也可以称为了连续性。这个也依赖于算法使用的是深度优先还是广度优先。如下图,B1~B4代表的是四个Basic Blocks,w/r代表的是读和写.

Spilling:当变量存储到堆栈时就称为溢出。

Interference: 当两个活动区间共同存在于一个程序中时,称他们之间会有干扰。

  

算法的执行过程简述如下:

 1. 计算变量的live interval.

 2. 遍历:

   2.1 如果live interval已经过期就扔掉。

   2.2 分配新的live interval和寄存器。

   2.3 如果无法分配(所需的interval过长等),则spill出去,再选择较低成本的变量。


复杂度:O(V logR) (V是变量数,R寄存器数)


下面是示意图:






Trampoline


再介绍一下JIT中应用的Trampoline,蹦床或者弹簧技术,可以达到延迟编译的效果(其它领域的效果不同,比如编译器里的PLT)。一个“弹簧床”就是一个函数存根,它能在被调用的时候,触发JIT执行。一旦JIT编译这个函数成为机器码,那么“弹簧床”的指针就会被替换为真实函数的指针。


在JSC中,相关代码查看JITStubs.cpp中的实现,如ctiTrampoline等。下面是一个调用堆栈:



然后再跳转到具体的操作(可能会调回到LLInt对应的slow path进行处理):



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


参考:

 Massimilliano Poletto, Linear Scan Register Allocation

 CS 380C Lecture 14, Register Allocation

 Mono:Runtime:Documentation:Trampoline

 ctiTrampoline

 Trampoline on Wikipedia


系列索引:

基础篇 (一)JSC与WebCore

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

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

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

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

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

高级篇(三) Register Allocation & Trampoline



目录
相关文章
|
1月前
|
Shell Linux 开发工具
【Shell 命令集合 文件管理】Linux 高级的文件管理器 mc 命令解析
【Shell 命令集合 文件管理】Linux 高级的文件管理器 mc 命令解析
39 0
|
1月前
|
JSON JavaScript 前端开发
C++ 智能指针与 JSON 处理:高级编程技巧与常见问题解析
C++ 智能指针与 JSON 处理:高级编程技巧与常见问题解析
265 0
|
2天前
|
JavaScript 前端开发 编译器
TypeScript中的高级类型:联合类型、交叉类型与条件类型深入解析
【4月更文挑战第23天】探索TypeScript的高级类型。这些特性增强类型系统的灵活性,提升代码质量和维护性。
|
8天前
|
机器学习/深度学习 API TensorFlow
TensorFlow的高级API:tf.keras深度解析
【4月更文挑战第17天】本文深入解析了TensorFlow的高级API `tf.keras`,包括顺序模型和函数式API的模型构建,以及模型编译、训练、评估和预测的步骤。`tf.keras`结合了Keras的易用性和TensorFlow的性能,支持回调函数、模型保存与加载等高级特性,助力提升深度学习开发效率。
|
13天前
|
Java 关系型数据库 MySQL
高级对象装配:解析Spring创建复杂对象的秘诀
高级对象装配:解析Spring创建复杂对象的秘诀
27 0
高级对象装配:解析Spring创建复杂对象的秘诀
|
1月前
|
设计模式 算法 编译器
【C++ 泛型编程 高级篇】 C++ 17 解析std::apply 的多种应用场景(三)
【C++ 泛型编程 高级篇】 C++ 17 解析std::apply 的多种应用场景
29 0
|
1月前
|
设计模式 存储 程序员
【C++ 泛型编程 高级篇】 C++ 17 解析std::apply 的多种应用场景(二)
【C++ 泛型编程 高级篇】 C++ 17 解析std::apply 的多种应用场景
40 0
|
1月前
|
存储 设计模式 算法
【C++ 泛型编程 高级篇】 C++ 17 解析std::apply 的多种应用场景(一)
【C++ 泛型编程 高级篇】 C++ 17 解析std::apply 的多种应用场景
52 0
|
1月前
|
存储 算法 安全
【C++ 泛型编程 高级篇】 C++编译时函数调用技术深度解析
【C++ 泛型编程 高级篇】 C++编译时函数调用技术深度解析
36 1
|
1月前
|
前端开发 JavaScript UED
深度解析Qt背景设计:从基础到高级,从Widget到Quick(三)
深度解析Qt背景设计:从基础到高级,从Widget到Quick
72 0

推荐镜像

更多