指令集优化:B1/B2/B4 定案(1 CAL+fb_id:16、领域指令不进指令集)、C1..C6 未定项记录

This commit is contained in:
2026-08-24 11:57:38 +08:00
parent 5e6f2b45fc
commit 8f7140be64
+24 -5
View File
@@ -126,6 +126,8 @@
- **LOADF 取消**:结构体/FB 字段访问统一用 LOAD/STORE 16B 变体(基槽 + 偏移) - **LOADF 取消**:结构体/FB 字段访问统一用 LOAD/STORE 16B 变体(基槽 + 偏移)
- **FB 共享体实施**:16B 变体即基址寻址指令,FB 体编译一次消除内联膨胀 - **FB 共享体实施**:16B 变体即基址寻址指令,FB 体编译一次消除内联膨胀
- 结构体语法 v1 **不实现**,只留编码路径(16B 变体 + 元数据段) - 结构体语法 v1 **不实现**,只留编码路径(16B 变体 + 元数据段)
- **FB 编码定案(B1/B2****1 条 CAL**SLOT 形态,8B:头 2 + fb_id:16 + slot32+ **fb_id 16 位**(查 machine.toml `[[fb]]` 表);新增内建 FB 只改配置 + VM 实现,指令格式零变化。V1 的 CAL_TON..CAL_F_TRIG 8 个 opcode 作废
- **领域指令不进指令集(B4 定案)**:运动控制 / 通信等**全部走 FB 库**ST 层 FB + CALL + 共享体),V2 **不设 EXT 服务指令**——op 位段只承载基础指令
### 2.7 调用与内联策略(V1 现状 + V2 方向) ### 2.7 调用与内联策略(V1 现状 + V2 方向)
@@ -167,17 +169,28 @@
|---|---|---| |---|---|---|
| A1 | 元数据段格式 | 结构体/字符串的表 schema——v1 预留但格式未定(待定) | | A1 | 元数据段格式 | 结构体/字符串的表 schema——v1 预留但格式未定(待定) |
| ~~A2~~ | ~~常量内嵌 vs 常量表~~ | **已定案**:常量表(8B LOADK 查表);LOADK 用 type 位段解释;条目 8B 无 tagIMM64 预留不发射 | | ~~A2~~ | ~~常量内嵌 vs 常量表~~ | **已定案**:常量表(8B LOADK 查表);LOADK 用 type 位段解释;条目 8B 无 tagIMM64 预留不发射 |
| A3 | 内建 FB 字段类型化 | **已定案**:字段类型化(TON: in/pt/q/et = BOOL/TIME/BOOL/TIMER_TRIG: clk/q = BOOL/BOOL);**计数器 pv/cv 需单字(INT)与双字(DINT)两种计数**——具体编码形式(op 变体 vs 实例类型参数化)随 A10 一并定 | | A3 | 内建 FB 字段类型化 | **已定案**:字段类型化(TON: in/pt/q/et = BOOL/TIME/BOOL/TIMER_TRIG: clk/q = BOOL/BOOL);计数器单/双字(INT/DINT**编码形式 = CAL 的 type 位段给计数宽度**(B3,说明中待确认) |
| A4 | DATE/TOD/DT 字面量 | **已定案**v1 **不支持**(类型存在,仅声明/存取/比较,无 `D#/TOD#/DT#` 字面量语法) | | A4 | DATE/TOD/DT 字面量 | **已定案**v1 **不支持**(类型存在,仅声明/存取/比较,无 `D#/TOD#/DT#` 字面量语法) |
| A5 | 算术语义细化 | **已定案**:饱和模板化到各宽度(SINT/DINT/LINT);TIME+TIME / TIME-TIME / TIME 比较;浮点 IEEE 常规(溢出→±inf、0 除→±inf、NaN 传播,无特判);DATE/TOD/DT **不做运算**(仅存取/比较) | | A5 | 算术语义细化 | **已定案**:饱和模板化到各宽度(SINT/DINT/LINT);TIME+TIME / TIME-TIME / TIME 比较;浮点 IEEE 常规(溢出→±inf、0 除→±inf、NaN 传播,无特判);DATE/TOD/DT **不做运算**(仅存取/比较) |
| A6 | sidecar/I/O 绑定 | **已定案**:与现状一致——绑定粒度仍 `slot = 槽号`(指向槽表条目),channel/bit 语义不变 | | A6 | sidecar/I/O 绑定 | **已定案**:与现状一致——绑定粒度仍 `slot = 槽号`(指向槽表条目),channel/bit 语义不变 |
| A7 | disasm 文本格式 | **已定案****类型后缀**形式:`LOAD.I16 r5, s3``STORE.U32 s1, r7``ADD.F64 r1, r2, r3` | | A7 | disasm 文本格式 | **已定案****类型后缀**形式:`LOAD.I16 r5, s3``STORE.U32 s1, r7``ADD.F64 r1, r2, r3` |
| A8 | machine.toml V2 schema | **已定案**type 表 = **编译器内建基元别名**bit/int8/int16/int32/int64/uint8/uint16/uint32/uint64/float32/float64):REAL→base float32=C float)、LREAL→base float64=C double),其余按位宽/符号映射;op 表 {name, op(0..63), fmt} + fmt/type 位段互锁校验 | | A8 | machine.toml V2 schema | **已定案**type 表 = **编译器内建基元别名**bit/int8/int16/int32/int64/uint8/uint16/uint32/uint64/float32/float64):REAL→base float32=C float)、LREAL→base float64=C double),其余按位宽/符号映射;op 表 {name, op(0..63), fmt} + fmt/type 位段互锁校验 |
| ~~A9~~ | ~~字面量类型推断~~ | **已定案**:按上下文适配;默认 DINT 仅作兜底语义(上下文恒存在,正常程序不触发) | | ~~A9~~ | ~~字面量类型推断~~ | **已定案**:按上下文适配;默认 DINT 仅作兜底语义(上下文恒存在,正常程序不触发) |
| A10 | FB 编码 | **反问待答**:为什么 FB 要 8 个 opCAL_TON..CAL_F_TRIG)?可收敛为 1 个 CAL + FB 类型 id(立即数,查 machine.toml fb 表)——op 位段省 7 个、新增 FB 不加 opcode(见 §8 | | ~~A10~~ | ~~FB 编码~~ | **已定案(B1/B2**1 CAL + fb_id **16 位**(查 [[fb]] 表);新增 FB 只改配置 + VM 实现 |
另:CALL 的 V2 确认(随 A10)——ret_pc 字节化(随跳转已定);CALL(IMM 形态)rd 恒 0;帧/寄存器约定不变(r0..r7 复制)。 另:CALL 的 V2 确认(随 A10)——ret_pc 字节化(随跳转已定);CALL(IMM 形态)rd 恒 0;帧/寄存器约定不变(r0..r7 复制)。
### 未定 / 待细化(C1..C6
| # | 项 | 说明 |
|---|---|---|
| C1 | 元数据段格式(原 A1) | 结构体/字符串表 schema——v1 预留但格式未定;建议 v1 定「0 长度占位段,schema 延后」 |
| C2 | 头 128B 布局终稿 | §2.5 字段表(64/68 改义、n_slots/n_values)需与 A8 schema 最终核对 |
| C3 | machine.toml `[[fb]]` 表 schema | fb_id/name/字段类型(含单/双字计数 width 列)细则——随 B3 定 |
| C4 | CALL/CAL 的 rd 字段约定成文 | 已定「恒 0」,待写入规范文档 |
| C5 | line1 推演重算 | 实施阶段(阶段 5)才需要 |
| C6 | CTU/CTD/CTUD 字段表终稿 | pv/cv 定 INT/DINT 后,字段宽度/对齐/偏移终稿(随 B3 定) |
## 8. 待讨论(用户反问) ## 8. 待讨论(用户反问)
### A9:什么情况下会没有上下文?(已定案) ### A9:什么情况下会没有上下文?(已定案)
@@ -187,7 +200,7 @@ ST 中字面量只能出现在表达式/赋值里(`x := 5`、`y + 5`、`IF 16#
因此"默认 DINT"只是防御性兜底(编译器内部缺类型时的报错路径), 因此"默认 DINT"只是防御性兜底(编译器内部缺类型时的报错路径),
正常程序不触发。结论:按上下文适配即可,默认 DINT 保留为兜底语义。**已确认(2026-08-24**。 正常程序不触发。结论:按上下文适配即可,默认 DINT 保留为兜底语义。**已确认(2026-08-24**。
### A10FB 为什么会有 8 种? ### A10FB 为什么会有 8 种?(已定案)
V1 的 CAL_TON..CAL_F_TRIG 是 8 个 opcode24..31),因为 V1 opcode 充足、无位段压力。 V1 的 CAL_TON..CAL_F_TRIG 是 8 个 opcode24..31),因为 V1 opcode 充足、无位段压力。
V2 的 op 位段仅 6 位(64 个),FB 占 8 个不划算,且 machine.toml 已有 `[[fb]]` V2 的 op 位段仅 6 位(64 个),FB 占 8 个不划算,且 machine.toml 已有 `[[fb]]`
@@ -195,7 +208,10 @@ V2 的 op 位段仅 6 位(64 个),FB 占 8 个不划算,且 machine.toml
- 收益:op 位段省 7 个;新增 FB(如自定义内建)不加 opcode、只加配置 - 收益:op 位段省 7 个;新增 FB(如自定义内建)不加 opcode、只加配置
- 代价:VM 按 id 分派(一次查表,可接受);disasm 需查 fb 表打印名称 - 代价:VM 按 id 分派(一次查表,可接受);disasm 需查 fb 表打印名称
- 关联:A3 的单字/双字计数变体编码也随此定(fb 表加 width/type 列即可) - 关联:A3 的单字/双字计数变体编码也随此定(fb 表加 width/type 列即可)
待用户拍板:FB 类型 id 用立即数(推荐)还是保留 8 op **已定案(B1/B2**1 CAL + fb_id 16 位
后续扩展讨论(B4/B5):领域指令(运动控制/通信)**不进指令集**——PLCopen 运动控制本
是 FB 库;V2 不设 EXT 服务指令,一切领域功能走 FB 库(CALL + 共享体)。op 位段预算见 B5。
## 5. 影响面清单 ## 5. 影响面清单
@@ -235,4 +251,7 @@ V2 的 op 位段仅 6 位(64 个),FB 占 8 个不划算,且 machine.toml
- A2 定案:LOADK 用 type 位段解释常量值(与 LOAD 语义统一);常量表条目 8B 无 tag;IMM64 预留不发射 - A2 定案:LOADK 用 type 位段解释常量值(与 LOAD 语义统一);常量表条目 8B 无 tag;IMM64 预留不发射
- A3..A8 定案(2026-08-24):计数器单/双字两种;DATE 字面量不支持;TIME/浮点运算按推荐;sidecar 一致;disasm 类型后缀;type 表=基元别名(REAL→float32、LREAL→float64 - A3..A8 定案(2026-08-24):计数器单/双字两种;DATE 字面量不支持;TIME/浮点运算按推荐;sidecar 一致;disasm 类型后缀;type 表=基元别名(REAL→float32、LREAL→float64
- A9 定案:按上下文适配、默认 DINT 兜底(用户确认) - A9 定案:按上下文适配、默认 DINT 兜底(用户确认)
- A10 提出反问待讨论:FB 8 op 可收敛为 1 CAL + fb 类型 id - A10 定案(B1/B2):1 CAL + fb_id 16 位(查 [[fb]] 表);V1 的 8 个 CAL_* opcode 作废
- B4 定案:领域指令(运动控制/通信)不进指令集,一律 FB 库;无 EXT 服务指令
- B3/B5 说明中待确认:单/双字计数编码(CAL type 位段)、op 位段预算
- 未定项记录:C1 元数据段 / C2 头终稿 / C3 fb 表 schema / C4 rd 约定成文 / C5 line1 推演 / C6 计数器字段表