From b86a9eaf07acf1aace3e8497e1920dfc3f1ba0fd Mon Sep 17 00:00:00 2001 From: chentianya Date: Fri, 21 Aug 2026 20:58:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=84=E5=88=92=E6=8C=87=E4=BB=A4=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=EF=BC=88ops.txt=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E7=99=BB=E8=AE=B0=E5=94=AF=E4=B8=80=E4=BA=8B=E5=AE=9E=E6=9D=A5?= =?UTF-8?q?=E6=BA=90=20+=20=E5=BC=BA=E6=A0=A1=E9=AA=8C=20+=20=E5=B1=8F?= =?UTF-8?q?=E8=94=BD=E6=9C=BA=E5=88=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Doc/isa/指令配置.md:格式(全属性必填)、OpTable(解析+与枚举强校验)、 各端接线(STCompiler --ops 编译路径必填/屏蔽传导;BytecodeExecutor 可选加载/Disabled 故障)、 加指令/屏蔽流程、7 步执行计划 - FB 注册并入 ops.txt 列为待讨论(未定案) - 索引登记 --- Doc/isa/指令配置.md | 94 +++++++++++++++++++++++++++++++++++++++++++++ Doc/索引.md | 2 + 2 files changed, 96 insertions(+) create mode 100644 Doc/isa/指令配置.md diff --git a/Doc/isa/指令配置.md b/Doc/isa/指令配置.md new file mode 100644 index 0000000..9033a70 --- /dev/null +++ b/Doc/isa/指令配置.md @@ -0,0 +1,94 @@ +# 指令配置文件(ops.txt) + +指令集的**唯一事实来源**:name / opcode / format / 参数名 / enabled。代码实现与配置文件在启动时**强校验**一致,防止两处漂移。 + +## 目标 + +- 加指令/屏蔽指令的登记集中在一处(配置文件),不再散落在代码各处手改 +- 执行器(VM):**语义实现必须在代码里**,不能纯从文件加载;配置文件用于**屏蔽**(`enabled=false` 的指令执行到 → 故障) +- 编译器(STCompiler):**启动时从文件加载**(校验 + 屏蔽传导) +- `.stb` ABI 不变:opcode 数值仍是冻结契约;屏蔽是编译期/运行期策略,不改数值 + +## 配置文件格式(`isa/ops.txt`) + +**全属性必填,不可省略**;`#` 注释、空行忽略: + +```text +# 格式:op <参数名...> enabled +op MOVE 0 RR rd rs enabled +op LOADK 1 IMM rd const_id enabled +op NOT 2 RR rd rs enabled +op AND 3 RRR rd ra rb enabled +op ADD 5 RRR rd ra rb enabled +op CMP_EQ 9 RRR rd ra rb enabled +op JMP 15 JMP off enabled +op JT 16 JC r off enabled +op LOAD_I 18 SLOT rd slot enabled +op CAL_TON 24 CAL instance enabled +op CALL 32 CALL fn_id enabled +op RET 33 NONE enabled +``` + +- 参数个数由 format 决定,解析时校验字段数: + +| format | 参数 | 现有指令 | +|---|---|---| +| `RR` | 2(rd rs) | MOVE / NOT | +| `RRR` | 3(rd ra rb) | AND/OR/ADD/SUB/MUL/DIV/CMP_xx | +| `IMM` | 2(rd const_id) | LOADK | +| `SLOT` | 2(rd slot) | LOAD_I/STORE_Q/LOAD_M/STORE_M/LOAD_GLOBAL/STORE_GLOBAL | +| `JMP` | 1(off) | JMP | +| `JC` | 2(r off) | JT / JF | +| `CALL` | 1(fn_id) | CALL | +| `CAL` | 1(instance) | CAL_*(8 个) | +| `NONE` | 0 | RET | + +## isa 层:`OpTable` + +```cpp +class OpTable { + bool load(const char* path, std::string* err); // 解析 + 强校验 + bool enabled(uint8_t op) const; + // name / format / 参数名查询(后续 FB 注册也走这里) +}; +``` + +**强校验(load 时)**: + +- 语法:字段数符合 format、enabled 必须出现 +- 操作码唯一、0..255 +- **与编译期枚举一致**:文件里每条指令的 name/opcode/format 必须与代码(`Op` 枚举 + 助记符 + `OpFormat`)逐条一致,任一不符 → 报错列出差异 +- 任一失败 → `load` 返回 false,调用方报错退出 + +前置改造:**OpFormat 显式化**——现有隐式"形态"(disasm 的 case)变成枚举 `RR/RRR/IMM/SLOT/JMP/JC/CALL/CAL/NONE`;`disasm` 改表驱动(输出文本不变,现有断言兼容)。 + +## 各端接线 + +| 端 | 参数 | 行为 | +|---|---|---| +| STCompiler | `STCompiler [-o out.stb] --ops ` | **仅 `-o` 编译路径要求**;加载/校验失败 → 报错退出;codegen 生成被屏蔽指令 → 编译错误(屏蔽传导) | +| BytecodeExecutor | `--ops `(**可选**) | 不传 = 全部启用(兼容现有用法);传入 → 加载 + 校验,执行到 disabled 指令 → `Fault::Disabled`,周期中止退出码 1 | +| 语义实现 | — | 仍在 VM 代码里(每指令一个 case,不可省) | + +## 加东西的流程(改造后) + +```text +加普通指令:ops.txt 加一行(op name opcode format 参数 enabled) + + Op.h 枚举加一项 + VM 一个语义 case → 重建 isa/VM +屏蔽指令:ops.txt 把 enabled 改 disabled + → 编译器拒绝生成、执行器运行时报 Disabled 故障(零代码改动) +``` + +## 执行计划(单步确认) + +1. **OpFormat 显式化**:新增 `OpFormat` 枚举;`disasm` 改表驱动(输出不变,11 个 ctest 全绿) +2. **`ops.txt` 落地**:34 条指令,全属性必填 +3. **`OpTable`**:`isa/include/isa/OpTable.h` + `isa/src/OpTable.cpp`(解析 + 强校验 + 查询) +4. **STCompiler `--ops`**:加载/校验/屏蔽传导 +5. **BytecodeExecutor `--ops`**:可选加载 / `Fault::Disabled` +6. **测试**:`ops_test`(正例 + 缺属性/字段数错/重号/与枚举不一致负例)、屏蔽传导用例、11 个 ctest 回归 +7. **文档 + 提交** + +## 待讨论(未定案) + +- 内建 FB 注册是否并入 `ops.txt`(关键字/字段布局/CAL 操作码一行登记)——若并入,加 FB = 配置文件一行 + VM 一个语义 case,编译器免重建。讨论定案后另行实施,本次只做指令表。 diff --git a/Doc/索引.md b/Doc/索引.md index a02bd95..5b30e71 100644 --- a/Doc/索引.md +++ b/Doc/索引.md @@ -8,6 +8,7 @@ doc/ 初步计划.md isa/指令与映像.md isa/stb文件格式.md + isa/指令配置.md compiler/编译管线.md compiler/STCompiler使用说明.md compiler/词法.md @@ -25,6 +26,7 @@ doc/ | [`初步计划.md`](初步计划.md) | 全工程定案:子集 ST、toml、执行模型、第 12 节阶段 | | [`isa/指令与映像.md`](isa/指令与映像.md) | 指令、映像、定宽类型、饱和;**规范以此为准** | | [`isa/stb文件格式.md`](isa/stb文件格式.md) | `.stb` 结构说明(用 line1 真实字节拆解) | +| [`isa/指令配置.md`](isa/指令配置.md) | ops.txt:指令登记唯一事实来源、OpTable、屏蔽机制 | | [`compiler/编译管线.md`](compiler/编译管线.md) | 编译器边界与管线 | | [`compiler/STCompiler使用说明.md`](compiler/STCompiler使用说明.md) | 构建、用法、工程文件、ST 子集、错误类别 | | [`compiler/词法.md`](compiler/词法.md) | 12.4 词法:关键字表、token、大小写、TIME 字面量 |