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));