From 9e2a6e95f121ce017f9b5b187f11e628474bcae2 Mon Sep 17 00:00:00 2001 From: chentianya Date: Mon, 24 Aug 2026 11:40:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=87=E4=BB=A4=E9=9B=86=E4=BC=98=E5=8C=96?= =?UTF-8?q?=EF=BC=9AA3..A8=20=E5=AE=9A=E6=A1=88=E8=AE=B0=E5=BD=95=20+=20A9?= =?UTF-8?q?/A10=20=E5=8F=8D=E9=97=AE=E5=BE=85=E8=AE=A8=E8=AE=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - A3 计数器单字(INT)/双字(DINT)两种;A4 日期字面量 v1 不支持 - A5 TIME 运算/浮点 IEEE 按推荐;A6 sidecar 绑定一致;A7 disasm 类型后缀 - A8 type 表=基元别名(REAL→float32、LREAL→float64) - §8 新增待讨论:A9 字面量上下文恒存在(默认 DINT 仅兜底); A10 FB 8 op 可收敛为 1 CAL + fb 类型 id(op 位段省 7 个) --- Doc/isa/指令集优化.md | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/Doc/isa/指令集优化.md b/Doc/isa/指令集优化.md index 22acad4..dfd6e5e 100644 --- a/Doc/isa/指令集优化.md +++ b/Doc/isa/指令集优化.md @@ -163,18 +163,39 @@ 核心决策已全部定案,以下为进入实现前需闭合的设计细节: -| # | 项 | 说明 | +| # | 项 | 状态 | |---|---|---| -| A1 | 元数据段格式 | 结构体/字符串的表 schema(类型描述、字段表条目)——v1 预留但格式未定 | +| A1 | 元数据段格式 | 结构体/字符串的表 schema——v1 预留但格式未定(待定) | | ~~A2~~ | ~~常量内嵌 vs 常量表~~ | **已定案**:常量表(8B LOADK 查表);LOADK 用 type 位段解释;条目 8B 无 tag;IMM64 预留不发射 | -| A3 | 内建 FB 字段类型化 | CAL_* 的实例字段在 V2 值区是类型化布局(TON.et=TIME、q=BOOL 等),字段宽度/偏移怎么定 | -| A4 | DATE/TOD/DT 字面量 | IEC 语法 `D#2026-8-24`、`TOD#12:30:00`、`DT#2026-8-24-12:30:00` 是否 v1 支持 | -| A5 | 算术语义细化 | 各宽度饱和规则(SINT/DINT/LINT 模板)、TIME/DATE 运算(TIME+TIME、TIME 比较)、浮点比较(NaN/±inf 语义) | -| A6 | sidecar/I/O 绑定 | V2 下绑定粒度(槽号不变?绑定到槽表引用)、channel/bit 语义 | -| A7 | disasm 文本格式 | V2 指令文本(含 type/off 的打印形式) | -| A8 | machine.toml V2 schema | type 表 19 条字段(base/width/signed/tag)、op 表字段(fmt/type 位段互锁) | -| A9 | 字面量类型推断细则 | 进制字面量默认类型归属(`16#FF` 是 BYTE/WORD/DINT?)、赋不同目标类型的适配规则 | -| A10 | CALL 在 V2 的确认 | 帧/寄存器约定不变(r0..r7 复制),但变长指令下 ret_pc 字节化;CALL 的 IMM 形态 rd 字段约定 | +| A3 | 内建 FB 字段类型化 | **已定案**:字段类型化(TON: in/pt/q/et = BOOL/TIME/BOOL/TIME;R_TRIG: clk/q = BOOL/BOOL);**计数器 pv/cv 需单字(INT)与双字(DINT)两种计数**——具体编码形式(op 变体 vs 实例类型参数化)随 A10 一并定 | +| 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 **不做运算**(仅存取/比较) | +| A6 | sidecar/I/O 绑定 | **已定案**:与现状一致——绑定粒度仍 `slot = 槽号`(指向槽表条目),channel/bit 语义不变 | +| 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 位段互锁校验 | +| A9 | 字面量类型推断 | **基本消解**:ST 字面量恒在表达式/赋值中,上下文(目标类型或运算类型)恒存在,v1 无"裸字面量"位置;进制字面量按上下文适配,默认 DINT 仅作兜底——**反问待答**(见 §8) | +| A10 | FB 编码 | **反问待答**:为什么 FB 要 8 个 op(CAL_TON..CAL_F_TRIG)?可收敛为 1 个 CAL + FB 类型 id(立即数,查 machine.toml fb 表)——op 位段省 7 个、新增 FB 不加 opcode(见 §8) | + +另:CALL 的 V2 确认(随 A10)——ret_pc 字节化(随跳转已定);CALL(IMM 形态)rd 恒 0;帧/寄存器约定不变(r0..r7 复制)。 + +## 8. 待讨论(用户反问) + +### A9:什么情况下会没有上下文? + +ST 中字面量只能出现在表达式/赋值里(`x := 5`、`y + 5`、`IF 16#FF > t THEN`), +目标类型或运算操作数类型恒在,v1 无"裸字面量"位置——**上下文恒存在**。 +因此"默认 DINT"只是防御性兜底(编译器内部缺类型时的报错路径), +正常程序不触发。结论:按上下文适配即可,默认 DINT 保留为兜底语义。 + +### A10:FB 为什么会有 8 种? + +V1 的 CAL_TON..CAL_F_TRIG 是 8 个 opcode(24..31),因为 V1 opcode 充足、无位段压力。 +V2 的 op 位段仅 6 位(64 个),FB 占 8 个不划算,且 machine.toml 已有 `[[fb]]` 表 +(8 条,含 opcode 字段)——**可收敛为 1 个 CAL(SLOT 形态)+ FB 类型 id(立即数/查 fb 表)**: +- 收益:op 位段省 7 个;新增 FB(如自定义内建)不加 opcode、只加配置 +- 代价:VM 按 id 分派(一次查表,可接受);disasm 需查 fb 表打印名称 +- 关联:A3 的单字/双字计数变体编码也随此定(fb 表加 width/type 列即可) +待用户拍板:FB 类型 id 用立即数(推荐)还是保留 8 op。 ## 5. 影响面清单 @@ -212,3 +233,5 @@ - 类型转换:用户定「禁止隐式变换,编译阶段检查」+ 字面量按上下文适配 - 字面量:用户定支持 IEC 进制前缀(2#/8#/16#) - A2 定案:LOADK 用 type 位段解释常量值(与 LOAD 语义统一);常量表条目 8B 无 tag;IMM64 预留不发射 +- A3..A8 定案(2026-08-24):计数器单/双字两种;DATE 字面量不支持;TIME/浮点运算按推荐;sidecar 一致;disasm 类型后缀;type 表=基元别名(REAL→float32、LREAL→float64) +- A9/A10 提出反问待讨论:字面量上下文恒存在;FB 8 op 可收敛为 1 CAL + fb 类型 id