U10 定案:寄存器/调用约定维持 + 栈方案 C(预分配栈区 + max_stack 编译期算 + 双检查 + 递归编译期报错)

- §2.2 修正:256 = 寻址上限(非每帧分配数);帧按 nregs 动态分配
- 新增调用栈设计:max_stack@116(调用图最坏路径)、预分配零分配、
  字节/深度双检查、MAIN 帧常驻
- 递归 = 链接层环检测编译期报错(link error: recursive call)
- 编译器优化.md:max_stack 计算职责 + Linker 环检测
- §9.2 U10 闭合;影响面/决策历史同步
This commit is contained in:
2026-08-24 16:00:45 +08:00
parent 44370c448e
commit 6869624f09
2 changed files with 26 additions and 8 deletions
+7 -1
View File
@@ -51,6 +51,12 @@
- **值段**:紧凑变宽布局,对齐规则 1/2/8 字节(BOOL 1 / INT 2 / TIME·LREAL·LWORD·ULINT·LINT 8 / REAL·DWORD·UDINT·DINT 4),**对齐由编译器保证**,VM 从 type 位段已知宽度
- 初值写值段(编译期 layout);结构体 = 值区连续字段块(元数据段字段表,v1 预留)
### 3.3b 调用栈与递归(U10 方案 C)
- **递归 = 编译期错误**:链接层对 FUNCTION 调用图做环检测(自调用/循环调用)→ `link error: recursive call`(V1 用例 19 已是负例,V2 明确为编译期错误)
- **max_stack 计算**(链接层/Codegen 职责):无环调用图 → 最坏调用路径 Σ(帧头 12B + 各函数 nregs×8),写入映像头 @116
- VM 按 max_stack 预分配栈区(运行期零分配);溢出双检查(字节 + 深度 64)
### 3.4 变长指令对 codegen 的影响
- **跳转回填改字节单位**`patch_jump` 按字节(off32,相对下一条),pc/code_offset/code_len 全字节化
@@ -84,7 +90,7 @@
| Lexer | 类型关键字扩展(19)、进制前缀 + 浮点字面量 |
| Parser | 类型引用、字面量 AST |
| Typecheck | 禁隐式转换(严格一致)+ 字面量上下文适配、19 类型元数据 |
| Linker | 槽表条目分配(addr:u32)、FB 实例字段偏移 |
| Linker | 槽表条目分配(addr:u32)、FB 实例字段偏移、**调用图环检测(递归报错)+ max_stack 计算** |
| Codegen | E_* 变长发射、字节化回填、槽表+值区 layout、FB 共享体(16B 变体) |
| MachineConfig / machine.toml | type 表 19 条(base/width/signed/tag)、前缀分区/func 位段校验 |