1. 三个保守优化
基础 优化 不应该改变程序含义。常量折叠 只处理确定表达式,死代码 删除只移除不可达块,simplifyJumps() 清理跳向下一块的冗余跳转。任何优化都要把 语义正确 放在速度之前。
function foldConstants(expr: Expr): Expr {
if (expr.kind !== "binary") return expr;
return canEvaluate(expr) ? evaluate(expr) : expr;
}
function eliminateDeadCode(blocks: BasicBlock[]): BasicBlock[] {
const reachable = markReachable(blocks);
return blocks.filter((block) => reachable.has(block.label));
}
function simplifyJumps(blocks: BasicBlock[]): BasicBlock[] {
return blocks.map(removeFallthroughJump);
}
2. 折叠示例
MiniLang 的 let folded: number = (2 + 3) * 4; 可以在编译期折叠为 20。这个变化不会改变运行时语义,却能减少虚拟机执行的 Instruction 数量。
let folded: number = (2 + 3) * 4;