指令集优化:V2 核心决策全部定案(type:5/格式合并/19 类型/禁隐式转换/进制前缀)

- §2.1 字节布局 [len:2|op:6]+[type:5|fmt:3];格式 9→7 形态(CALL→IMM、CAL→SLOT)
- §2.4 19 IEC 基础类型(+DATE/TOD/DT)+13 预留;浮点/进制前缀/禁隐式转换+字面量适配
- §2.6 LOADF 取消、FB 共享体定案(16B 变体=基址寻址)
- §4 改为 A1..A10 尚未确定细节(元数据段/常量内嵌/FB 字段类型化/日期字面量/
  算术语义/sidecar/disasm/machine.toml schema/字面量推断/CALL 确认)
- 编译器优化.md 同步定案状态
This commit is contained in:
2026-08-24 11:19:40 +08:00
parent 109f9a7619
commit 6e8b9896f2
2 changed files with 119 additions and 99 deletions
+24 -22
View File
@@ -36,9 +36,8 @@
### 3.1 FB 共享体(基址寻址)——消除内联膨胀
- **现状问题**:FB 每调用一次复制一份体,字节码膨胀
- **V2 案**槽表模型下引入**基址寻址指令**`LOAD/STORE rd, base_slot, field_off`,base 槽取自寄存器/立即数,16B 长度组已预留)→ FB 体编译**一次**,运行时按实例基址定位字段
- 收益:字节码不再随调用点膨胀;代价:每次字段访问多一个基址操作数
- **待确认**:见指令集优化.md §4 项 9(推荐实施)
- **V2 案**`LOAD/STORE rd, slot, off32`16B 长度组,SLOT+off 形态)即基址寻址——结构体字段与 FB 共享体字段**同一指令**(LOADF 已取消);FB 体编译**一次**,运行时按实例槽 + 编译期算死的字段偏移定位
- 收益:字节码不再随调用点膨胀;代价:每次字段访问多一个偏移操作数
### 3.2 类型驱动语义(type 位段红利)
@@ -60,39 +59,42 @@
### 3.5 类型系统扩展(ST 层)
- 12 个 IEC 整数类型 + REAL/LREAL 进关键字(全量支持:声明即可用)
- 类型检查:**隐式升宽**允许(SINT→INT→DINT→LINT、BYTE→WORD→…)、降宽禁止
- 浮点字面量`1.5``-2.5e3`v1 是否支持——待确认
- **19 个 IEC 基础类型**(BOOL + 位串 4 + 有符号 4 + 无符号 4 + TIME + REAL/LREAL + DATE/TOD/DT)全量进关键字(声明即可用)
- **进制前缀**`2#`/`8#`/`16#` 字面量 + 浮点十进制字面量(`1.5``-2.5e3`
- 类型检查:**禁止隐式变量转换**(赋值/比较/算术类型严格一致,编译期报错);**字面量按上下文适配**`5` 可赋 INT/REAL/DINT,编译期解释);显式转换函数 v1 不做
- 进制字面量默认类型归属与适配细则 → 指令集优化.md §4 项 A9
## 4. 待确认(引用指令集优化.md §4 中编译器相关
## 4. 已定案(编译器相关)
| 项 | 问题 | 推荐 |
|---|---|---|
| 4 | I/Q/M 六条 LOAD/STORE 合并为两条 | 合并 |
| 5 | 结构体 v1 只留编码不实现语法 | 预留 |
| 6 | ST 层类型全量支持(12 类型名进关键字 | 全量 |
| 7 | 隐式升宽允许、降宽禁止 | 按此 |
| 8 | 字面量:十进制 only(含浮点字面量) | 十进制 |
| 9 | FB 共享体:基址寻址指令实施 | 实施 |
| 10 | REAL/LREAL 引入后 type:4 满编 | 满编(结构体走元数据) |
| 项 | 定案 |
|---|---|
| I/Q/M | 六条合并为 LOAD/STORE 两条(单一值区,语义标签交给 sidecar) |
| 结构体 | v1 只留编码LOAD/STORE 16B 变体 + 元数据段),语法不实现 |
| ST 层类型 | 19 类型名全量进关键字 |
| 类型转换 | 禁止隐式变量转换;字面量按上下文适配 |
| 字面量 | 进制前缀 2#/8#/16# + 浮点十进制 |
| FB 共享体 | 实施16B 变体 = 基址寻址) |
仍待闭合的细节见指令集优化.md §4(A1..A10,编译器相关:A5 算术语义 / A6 sidecar / A8 machine.toml schema / A9 字面量类型推断)。
## 5. 影响面(编译器侧)
| 子模块 | 改动 |
|---|---|
| Lexer | 类型关键字扩展(14 → 16+)、浮点字面量(若确认) |
| Lexer | 类型关键字扩展(19)、进制前缀 + 浮点字面量 |
| Parser | 类型引用、字面量 AST |
| Typecheck | 隐式升宽规则、16 类型元数据 |
| Typecheck | 隐式转换(严格一致)+ 字面量上下文适配、19 类型元数据 |
| Linker | 槽表条目分配(addr:u32)、FB 实例字段偏移 |
| Codegen | E_* 变长发射、字节化回填、槽表+值区 layout、FB 共享体(若实施)、基址寻址 |
| MachineConfig / machine.toml | type 表 16 条(base/width/signed/tag)、fmt/type 位段互锁校验 |
| Codegen | E_* 变长发射、字节化回填、槽表+值区 layout、FB 共享体(16B 变体) |
| MachineConfig / machine.toml | type 表 19 条(base/width/signed/tag)、fmt/type 位段互锁校验 |
## 6. 实施阶段(合并进指令集优化.md §6)
- 阶段 2isa)后接**阶段 3compiler 侧)**machine.toml V2 → MachineConfig → Codec → Codegen(槽表/值区/变长发射)→ Stb → 对应测试
- FB 共享体(§3.1若确认实施,并入阶段 3 的 Codegen 子步骤
- FB 共享体(§3.1 已定案)并入阶段 3 的 Codegen 子步骤
## 7. 决策历史
- V1 定案(12.8):用户 FB 内联 / FUNCTION CALL / 内建 FB CAL_*;短路必须跳转;固定寄存器分配
- V2 讨论:用户确认 V1 内联现状;提出 V2 用基址寻址消除内联膨胀(写入 §2.7/§4 项 9
- V2 讨论:用户确认 V1 内联现状;提出 V2 用基址寻址消除内联膨胀(已定案
- 类型扩展:19 IEC 基础类型(type:5);禁隐式转换 + 字面量适配;进制前缀定案