V8 内联缓存与去优化机制与 SSA 与数据流分析基础

共 18 题
#

1. V8 内联缓存(IC)如何加速属性访问,monomorphic/polymorphic/megamorphic 状态如何转换?

A 从 monomorphic 到 polymorphic 再到 megamorphic,形状种类越多 IC 命中率越低 ✓ 正确答案
B 只有两种状态,没有中间态
C megamorphic 是最快状态
D IC 与对象形状无关
#

2. 栈上替换(OSR)如何让长循环在运行中从低层代码切换到优化代码,触发条件是什么?

A OSR 只在函数返回后生效
B OSR 不需要状态映射
C OSR 只能用于解释器
D OSR 让正在执行的循环在运行中被切到优化代码,触发条件是循环热度达到阈值 ✓ 正确答案
#

3. Sparkplug、Maglev、TurboFan 分层编译各自的编译开销与峰值性能如何权衡?

A 三个编译器编译开销相同
B 只有 Sparkplug 能做优化
C Maglev 是最高级编译器
D Sparkplug 编译最快但性能最低,TurboFan 编译最慢但峰值性能最高 ✓ 正确答案
#

4. 隐藏类(hidden class / map)与内联缓存如何配合,对象形状频繁变化为何导致 IC 退化?

A map 与 IC 无关
B IC 以 map 为 key 缓存属性偏移,对象形状频繁变化会使 IC 失配而退化 ✓ 正确答案
C 形状变化使 IC 更快
D 隐藏类只在运行时创建
#

5. 去优化后回退到的解释执行或基线代码如何恢复正确的程序状态与寄存器映射?

A 去优化会丢失所有变量状态
B 优化代码记录 deopt 元数据,把 SSA 值映射回解释器/基线帧以恢复正确状态 ✓ 正确答案
C 去优化后程序语义改变
D 去优化只发生在解释器
#

6. V8 的逃逸分析(escape analysis)如何做标量替换,把堆对象拆成标量字段,什么情况下分析会失败?

A 逃逸分析只影响代码大小
B 未逃逸对象可被拆成标量字段从而消除分配,对象逃逸则分析失败 ✓ 正确答案
C 逃逸对象也能被标量替换
D 标量替换与 GC 无关
#

7. 构造 SSA 时 φ 节点的插入位置由支配边界(dominance frontier)决定,为什么恰好插在那里?

A φ 节点可插在任意基本块
B φ 节点只插在函数入口
C φ 节点插在支配边界处,因为那里是多个定义路径汇聚的精确位置 ✓ 正确答案
D 支配边界与 φ 无关
#

8. 活跃变量分析如何刻画某程序点之后仍会被用到的变量集合?它为何是寄存器分配的基础?

A 它是前向分析,计算到达定义
B 它是后向分析,计算之后仍会用到的变量,是寄存器分配的基础 ✓ 正确答案
C 活跃分析与寄存器无关
D 活跃变量在所有点都相同
#

9. 稀疏条件常量传播(SCCP)如何把 SSA 的 φ 结构与常量传播结合,做到比朴素分析更精确?

A 它比朴素分析更不精确
B 它只做寄存器分配
C 它不处理 φ 节点
D 它沿 def-use 链传播,φ 合并常量且结合分支可达性,比朴素分析更精确高效 ✓ 正确答案
#

10. 数据流分析的格(lattice)与 meet 算子如何刻画信息的保守合并?为什么迭代到不动点必然收敛?

A meet 取最激进的信息
B 格与 meet 无关
C 数据流分析可能永不终止
D meet 保守合并多路径信息,单调递减(格高度有限)保证迭代到不动点收敛 ✓ 正确答案
#

11. 到达定义、活跃变量、可用表达式三种经典分析分别是前向还是后向传播?

A 三者都是前向
B 到达定义与可用表达式是前向,活跃变量是后向 ✓ 正确答案
C 三者都是后向
D 活跃变量是前向,到达定义是后向
#

12. 死代码删除如何结合活跃变量分析判断赋值无用?为什么需要迭代到不动点?

A 只需删除一次即可
B 结合活跃变量判断赋值是否被使用,删除可能引发级联死代码,需迭代到不动点 ✓ 正确答案
C 死代码删除与活跃分析无关
D 活跃变量只用于寄存器分配
#

13. TurboFan 基于哪些类型与形状假设做优化,何种运行期事件会触发去优化(deopt)?

A 基于类型/形状假设优化,假设被违反(如类型或 map 不符)时触发去优化 ✓ 正确答案
B TurboFan 不做任何类型假设
C deopt 只在程序结束时发生
D 假设永远成立,不需 deopt
#

14. V8 的指针压缩(pointer compression)如何把 64 位堆指针压成 32 位,为什么要求 4GB 对齐的堆基址?

A 指针压缩不需要任何对齐
B 通过 4GB 对齐的堆基址 + 32 位偏移表示指针,需保证对象在基址 4GB 范围内 ✓ 正确答案
C 指针压缩只影响启动
D 压缩后无法访问堆
#

15. JIT 优化代码如何记录 GC safepoint 的寄存器与栈槽映射,垃圾回收器扫描优化帧时依赖什么元数据?

A GC 不依赖任何元数据
B safepoint 只用于性能统计
C 优化帧无需扫描
D safepoint 处记录寄存器/栈槽中哪些是对象指针、哪些是标量,GC 据此扫描优化帧 ✓ 正确答案
#

16. 软去优化(soft deopt)与硬去优化(eager/lazy deopt)分别在什么时机被触发?

A 软去优化可延后处理,硬去优化(eager/lazy)在必须恢复正确语义的关键时点触发 ✓ 正确答案
B 软去优化在关键假设违反时立即触发
C 两者触发时机完全相同
D 去优化只在解释器发生
#

17. 常量传播在格上用顶(未定)、常量值、底(冲突)表示,为什么两个不同常量 meet 后会落到底?

A 因为不同路径给出不同常量,无法同时确定为同一常量,只能记为非常量 ✓ 正确答案
B 因为 meet 取某个常量
C 因为底表示未定
D 因为常量不参与 meet
#

18. 全局公共子表达式消除依赖可用表达式分析,它如何避免对同一表达式的重复计算?

A 依赖可用表达式分析确认表达式仍有效,然后复用先前计算结果消除重复计算 ✓ 正确答案
B GVN 不依赖任何分析
C GVN 只复制表达式
D GVN 增加计算次数