从零构建 Lua 虚拟机完全工程化:数据结构、栈式调用与执行循环实战脚本 VM 在游戏里几乎是标配:热更新、技能配置、关卡逻辑、Mod 系统,背后都是一台嵌入式虚拟机。它看起来高深,但拆开之后是四件很朴素的事:一套统一的值表示、一个全局状态、一叠调用帧、一个取指-解码-执行的循环。本文按"工程组织 → 基础数据结构 → 栈式调用约定 → 执行流程 → 字节码取舍"的顺序,把从零构建一台类 Lua 虚拟机(遵循 Lua 5.3 语义)讲清楚。1. 先谈工程组织:目录结构就是架构在写第一行代码之前,先决定"哪些部分归谁"。这一点在解释器项目上尤其重要,因为它天然分成两块互不依赖的东西:① 编译期(把脚本变成指令):Lexer → Parser → CodeGen ② 运行期(执行指令):虚拟机 + 基础库 两者共同依赖的:值表示、内存与错误处理、通用工具因此目录可以这样组织(这也是被大量实践验证过的划分):目录职责依赖规则3rd/第三方库(如用于测试的框架)谁都能用common/vm 与 compiler 共用的结构:值表示、类型定义、工具宏
