← 返回目录

第九章:字节码与虚拟机

生成 Instruction,并在基于操作数栈、CallFrame 和 VM 的虚拟机中运行。

1. 栈式虚拟机

字节码把 IR 转成紧凑的 Instruction。操作数栈 保存临时值,CallFrame 保存函数调用现场,VM.run() 按 LOAD_CONST、JUMP_IF_FALSE、CALL 等指令推进程序。

type Instruction =
  | { op: "LOAD_CONST"; value: unknown }
  | { op: "JUMP_IF_FALSE"; offset: number }
  | { op: "CALL"; name: string; arity: number };

type CallFrame = { name: string; ip: number; locals: unknown[] };

class VM {
  private stack: unknown[] = [];
  private frames: CallFrame[] = [];

  run(instructions: Instruction[]): void {
    for (let ip = 0; ip < instructions.length; ip += 1) {
      this.execute(instructions[ip]);
    }
  }
}

2. 调用示例

MiniLang 的 print(add(1, 2)); 会先 CALL add,再把返回值交给内置 print。虚拟机只看字节码,不需要知道 Parser 或 TypeChecker 的存在。

print(add(1, 2));
上一章:基础优化 返回目录 下一章:诊断、运行时与下一步