步骤E:文档收尾——基址寻址落地同步(编译器优化/寄存器码/用例对照/指令与映像/指令集清单/指令执行)

This commit is contained in:
2026-08-27 09:23:12 +08:00
parent 766e3a39b2
commit c53e84f180
6 changed files with 40 additions and 28 deletions
+14 -10
View File
@@ -8,8 +8,8 @@ compiler 模块的代码生成。输入:`Project` + `Unit`AST+ `LinkResu
- 寄存器分配:局部/变量固定寄存器,表达式临时值往后编号,`nregs` 写进函数头
- 跳转先留洞、后回填(字节单位,相对下一条);`AND` / `OR` **必须编成跳转**(短路),禁止两边都算
- 常量表(`LOADK`8B 原始值无 tag,按 func 解释)、全局/实例槽(`LOAD` / `STORE` / `LOAD_OFF` / `STORE_OFF`
- `CALL fn_id` 有界帧;用户 FB 调用**内联展开**;内建 `CAL fb_id, 实例槽`
- 常量表(`LOADK`8B 原始值无 tag,按 func 解释)、全局/实例槽(`LOAD` / `STORE` / `LOAD_OFF` / `STORE_OFF`、FB 共享体基址访问(`LOAD_PTR` / `STORE_PTR`
- `CALL fn_id` 有界帧;用户 FB **共享体函数化**r1 = 实例指针);内建 `CAL fb_id, 实例槽`
- 拼装映像:V2 头 128B / 函数表 / 常量表 / 字节码 / 槽表 / 值段 + SHA-256 尾部
- `max_stack`MAIN + FUNCTION 调用图 DAG 最坏路径 Σ(12 + nregs×8);递归 = 编译期报错
@@ -27,7 +27,7 @@ compiler 模块的代码生成。输入:`Project` + `Unit`AST+ `LinkResu
- **槽表两级**:指令操作数 = **槽号**(u32)→ 槽表条目 → 值区字节偏移;`slot_addr(slot)` 由 VM/Image 提供
- 全局按 GVL 声明序编槽;**FB 实例 = 1 个槽表条目**,字段在实例基址上按偏移访问(字段偏移编译期按 1/2/4/8 对齐计算,字段类型 = machine.toml `[[fb]]` 表)
- 字段访问 `fb.Q``LOAD_OFF rd, <实例槽>, <偏移>` / `STORE_OFF <实例槽>, <偏移>, rs`16B SLOT+off 指令);I/Q/M 同普通槽(`LOAD` / `STORE`
- 字段访问 `fb.Q``LOAD_OFF rd, <实例槽>, <偏移>` / `STORE_OFF <实例槽>, <偏移>, rs`16B SLOT+off 指令,调用点/输出读用);FB 共享体函数体内:`LOAD_PTR` / `STORE_PTR rd, r1, <偏移>`16B RS+off,基址寄存器 r1 = 实例指针);I/Q/M 同普通槽(`LOAD` / `STORE`
- 函数帧寄存器:`FUNCTION` 结果固定 **r0**`VAR_INPUT` 从 r1 起按声明序,`VAR` 续后;PROGRAM / FB 变量从 r0 起按声明序
### 调用约定(v1 冻结,VM 12.9 按此实现)
@@ -73,22 +73,26 @@ IF <cond → t> JF t, L_else
L_end:
WHILE L_loop: <cond → t> JF t, L_end <body> JMP L_loop L_end:
FB 调用(用户,内联展开):
FB 调用(用户,共享体):
<每个实参求值 → 临时> STORE_OFF <实例槽>, <字段偏移>, 临时
<内联体:LOAD_OFF 读输入字段、算输出、STORE_OFF 写输出字段>
LOADK r1, <实例值区地址> CALL <fb_fn_id>
(FB 函数体内:字段访问 = LOAD_PTR/STORE_PTR rd, r1, <字段偏移>
内建 实参同左 → CAL <fb_id>, <实例槽>
```
- 常量统一进常量表(8B 原始值,位模式去重;BOOL / 整数 / 时间 / 浮点 / 日期),`const_id` = 首次出现序;`LOADK` 按 func 解释位模式
- 指令 func 位段 = 语言类型对应(`func_of_name`:宽度 × 符号 + F32/F64
## 用户 FB 调用内联(v1 定案
## 用户 FB 共享体(函数化,2026-08-26 实施
FB 体共享会与「绝对字段地址」冲突(不同实例基址不同),v1 选择**调用点内联展开**
FB 体共享会与「绝对字段地址」冲突(不同实例基址不同),V1 内联;V2 改为**共享体函数化**
- 调用点:实参写入该实例字段 → 内联该 FB 的函数体(字段地址按本实例基址算死)→ 字段读取自然可用
- 代价:字节码随调用点数膨胀;v1 规模可接受;以后可升级为「基址寄存器寻址」指令
- FB 无递归、无动态实例,内联安全
- FB 编译为**独立共享函数**(fn_id 收集序):`r1` = 实例指针(值区地址,隐藏参数/this),字段访问 `LOAD_PTR/STORE_PTR rd, r1, 字段偏移`
- 调用点:实参 `STORE_OFF`(绝对槽)→ `LOADK r1, c(实例addr)``CALL fb_fn_id`2 条指令替代整个展开体)
- 嵌套(FB 函数内调 FUNCTION):实参区 r1..r7 会覆盖实例指针 → 调用点自动 `MOVE t, r1` / 调用后 `MOVE r1, t` 保护
- `VAR_TEMP` 落 FB 帧寄存器,帧每周期重建 → 天然每次调用重置(内联期的寄存器隔离 hack 退役)
- 多实例共享同一函数体,状态经 r1 指针隔离(`count``VAR` 仍在实例字段)
- FB 无递归、无动态实例(链接层保证),函数化安全
## 映像拼装(V2