← 返回目录

第八章:基础优化

实现常量折叠、死代码删除和简单跳转清理,并坚持语义正确先于速度。

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;
上一章:中间表示 IR 返回目录 下一章:字节码与虚拟机