落地映像读写:72 字节头、段布局、FNV-1a、.stb 与 sidecar。

- 指令与映像.md 冻结:头字段表、常量表/函数表行、段序、数据段对齐、sidecar 格式
- Types.h 补 TypeTag;Image.h/cpp:ImageView 校验、write_ret_main、文件与 sidecar
- isa CMake 改 target_include_directories PUBLIC
This commit is contained in:
2026-08-19 14:40:38 +08:00
parent eba48f852e
commit c378411637
8 changed files with 509 additions and 13 deletions
+54 -10
View File
@@ -130,19 +130,51 @@ FB 实例固定布局,字段偏移编译期算死。
## 映像
魔数 `STSC`,版本 `1`
魔数 `STSC`,版本 `1`全部整数小端。文件 = 头 + 五个段,段序:常量表 → 函数表 → 字节码 → FB 布局 → 数据。偏移记在头里,段必须连续、偏移单调不减,末段终点不超过文件长度。
头:
### 头(72 字节)
- `cycle_limit``dt_ms`
- 工程哈希
- 全局槽数、I/Q/M 槽数
- 常量表 / 函数表 / 字节码 / FB 布局的偏移
- 入口 `MAIN``fn_id`
| 偏移 | 宽 | 字段 |
|---|---|---|
| 0 | 4 | 魔数 `STSC` |
| 4 | 4 | 版本 `1` |
| 8 | 4 | `cycle_limit` |
| 12 | 4 | `dt_ms` |
| 16 | 8 | 工程哈希(FNV-1a 64 |
| 24 | 4 | 入口 `entry_fn_id` |
| 28 | 4 | 全局槽数 `n_globals` |
| 32 | 4 | I 槽数 `n_i` |
| 36 | 4 | Q 槽数 `n_q` |
| 40 | 4 | M 槽数 `n_m` |
| 44 | 4 | 常量数 `n_consts` |
| 48 | 4 | 函数数 `n_funcs` |
| 52 | 4 | `offset_const` |
| 56 | 4 | `offset_funcs` |
| 60 | 4 | `offset_code` |
| 64 | 4 | `offset_fb` |
| 68 | 4 | `offset_data` |
函数表一行:`fn_id``nregs`、字节码偏移与长度。
### 常量表一行(12 字节)
工程哈希:收录源文件路径排序后对内容做 **FNV-1a 64**,只保证回放槽位一致,不是密码学哈希
`[tag:u32][value:u64]``tag`0=BOOL、1=INT、2=TIME。`value` 按 tag 解释,未用高位为 0
### 函数表一行(12 字节)
`[nregs:u32][code_offset:u32][code_len:u32]`;行下标即 `fn_id``code_offset` 相对字节码段起点,`code_len` 为指令条数。
### 字节码段
指令按 `u32` 连续排;`CALL``fn_id` 是函数表行下标。
### FB 布局段
第一版为空;每类型一行 `[field_count:u32][field_count × (tag:u32, offset:u32)]`offset 相对实例基址,12.8 落地 codegen 时冻精确表。
### 数据段
槽初值按序排:全局(`n_globals`)→ I → Q → M。槽宽与对齐:`BOOL` 1 字节 / `INT` 2 字节 / `TIME` 8 字节,每个槽起点对齐到自身宽度(需要时插 padding)。
工程哈希:收录源文件路径排序后对内容做 **FNV-1a 64**,只保证回放槽位一致,不是密码学哈希。FNV-1a 64basis `0xcbf29ce484222325`prime `0x100000001b3`
`[[io.input]]` / `[[io.output]]` 不进映像。
@@ -153,7 +185,19 @@ FB 实例固定布局,字段偏移编译期算死。
编译产物是单文件 `<name>.stb`:映像头 + 各段按本文布局连续排,魔数 `STSC`、版本 `1`、小端。`STCompiler` 写,`BytecodeExecutor` 读。
- `dt_ms` / `cycle_limit` 在映像头,执行器只认映像,不重复配置。
- I/O 绑定不进映像:`STCompiler` 另写 sidecar `<name>.runtime.toml`内容是 `var`(已解析槽号)→ `channel` / `bit``BytecodeExecutor` 读 sidecar 做采样与写回,不创造变量。
- I/O 绑定不进映像:`STCompiler` 另写 sidecar `<name>.runtime.toml``BytecodeExecutor` 读 sidecar 做采样与写回,不创造变量。
sidecar 格式(TOML 子集,冻结):
```toml
[[io.input]] # 或 [[io.output]]
var = "I0_0" # 已在 GVL 声明的名字
slot = 1 # 全局槽号(编译期已解析)
channel = 0
bit = 0
```
每行一个绑定;`var` 顺序不要求与映像槽序一致(`slot` 为准)。
---