从字节码到 SSA:核心只有几十行
来源:bernsteinbear.com — 2026-11-12
📋 概述
ZJIT 里把 CRuby 的栈式 YARV 字节码转成 SSA 形式的那个函数有一千九百行,但核心很小。作者用 push 3 / push 4 / add 举例:每条指令的栈入口与出口数量是静态已知的,所以栈可以在编译期求值,只需记住每个栈位来自哪条指令,于是 push 变成 const,add 直接引用 v0 与 v1。文章把具体解释器和抽象解释器并排给出,差别只在于栈里存的是值还是指令名。
🔑 核心要点
- 字节码的输入输出是隐式的,全靠栈传递;除少数变长指令外,每条指令最多一个输出
- 因为入出数量静态可知,编译期就能「跑」一遍栈,只跟踪值从哪条指令来
- 同一栈位先放 v0 后放 v2,正是他说「ish」的原因:SSA 相当于把时间压进 IR
- 具体解释器压值,抽象解释器压指令名,两段代码结构几乎一模一样
- 那一千九百行之所以长,是因为要处理大量 opcode 的具体怪癖,核心逻辑并不长
- 这个转换是 ZJIT 优化的第一道关,把栈机语义变成可直接引用操作数的 SSA
💡 金句
我把 SSA 描述成「把时间压进 IR」。
← 返回 Lobsters 首页
👍 0
👎 0