机器定义文件(machine.toml V2)
指令集与类型的唯一事实来源,只给编译器(STCompiler/compiler)使用。执行器(vm)不读本文件——它是下位机程序,内建全部指令。
V2 规格(STATOR2,阶段 1 定稿;N5 闭合)。schema 变更:opcode → 前缀分区 + op;class/format → fmt;CAL_* 8 op → 1 CAL + fb 表 15 条。
架构
| 模块 |
职责 |
compiler |
配置驱动编译;自带 .stb 写实现;--disasm 用配置参数名/形态自格式化 |
vm |
内建全指令集(执行 switch 在 vm);自带 .stb 读实现 + 型号/SHA-256 校验;不读配置 |
isa |
归执行器侧(vm 依赖),只管指令定义:前缀分区/Op/Instr/Encode/形态/类型/饱和/disasm |
machine.toml |
编译器唯一知识来源(V2 schema,本文) |
决策清单(V2 定案)
- 指令编码:变长 4/8/16/32B;前缀分区表达长度与形态(
11/10/011/010 xxx/0010/0011/0001)
- op 表:
prefix + op(分区内编号)替代 V1 的单一 opcode;fmt 与前缀互锁;func 类别表达数据语义
- 类型:19 种 IEC 类型(编译器内建基元别名 + kind 语义 + func 显式映射)
- FB:15 条内建(fb_id 0..14),
[[fb]] 表承载字段类型;CAL 指令 + fb_id16(V1 的 CAL_* 8 op 作废)
- 新增指令/类型/FB:只改配置 + 对应实现,指令格式零变化(N2/N3 预留位已留)
配置文件格式(TOML V2)
全属性必填,不可省略:
类型系统(19 条,func 互锁)
| 类型 |
base 基元 |
kind |
func |
宽度/符号 |
| BOOL |
uint8 |
bool |
0 |
1B — |
| BYTE |
uint8 |
bit |
0 |
1B 无 |
| WORD |
uint16 |
bit |
2 |
2B 无 |
| DWORD |
uint32 |
bit |
4 |
4B 无 |
| LWORD |
uint64 |
bit |
6 |
8B 无 |
| SINT |
int8 |
int |
1 |
1B 有 |
| INT |
int16 |
int |
3 |
2B 有 |
| DINT |
int32 |
int |
5 |
4B 有 |
| LINT |
int64 |
int |
7 |
8B 有 |
| USINT |
uint8 |
uint |
0 |
1B 无 |
| UINT |
uint16 |
uint |
2 |
2B 无 |
| UDINT |
uint32 |
uint |
4 |
4B 无 |
| ULINT |
uint64 |
uint |
6 |
8B 无 |
| TIME |
int64 |
time |
7 |
8B 有(ms) |
| REAL |
float32 |
float |
8 |
4B IEEE754 |
| LREAL |
float64 |
float |
9 |
8B IEEE754 |
| DATE |
uint32 |
date |
4 |
4B 无(天) |
| TOD |
uint32 |
date |
4 |
4B 无(当日 ms) |
| DT |
uint64 |
date |
6 |
8B 无 |
- func 互锁规则:
(width, signed) 组合必须与 func 匹配(1B无=0、1B有=1、2B无=2、2B有=3、4B无=4、4B有=5、8B无=6、8B有=7、F32=8、F64=9)
- kind 语义:bool(编译器强制 0/1)、bit(位串,逻辑/移位运算)、uint(无符号整数算术)、int(有符号整数算术)、float(浮点)、time(TIME 毫秒)、date(DATE/TOD/DT,v1 不运算)
- 语言层 19 类型名全量进关键字;禁隐式变量转换;字面量按上下文适配;进制前缀 2#/8#/16#
强校验清单(加载时,任一不符 → 报错退出)
- meta:
name 非空、version = 2
- type:19 条必填全集(BOOL..DT);
base 命中内建基元;kind 合法;func ∈ 0..9 且与 base 的 (width, signed) 互锁
- op:
prefix 合法(11/10/011/010000..010101/0010/0011/0001);prefix 与 fmt 互锁(11↔RR、10↔NONE、011↔RRR、010000↔IMM、010001↔SLOT、010010↔JMP、010011↔JC、010100↔CALL、010101↔CAL、0010↔SLOT+off、0011↔IMM64);op 分区内唯一;func 类别合法(none/width/full/float/dst);params 数量与 fmt 互锁(RR=2、NONE=0、RRR=3、IMM=2、SLOT=2、JMP=1、JC=2、CALL=1、CAL=2、SLOT+off=3、IMM64=2);enabled 布尔
- fb:15 条必填全集(fb_id 0..14);
fb_id 唯一;字段名唯一;字段类型命中 [[type]] 表
- op-fb 互锁:
CAL(010101)的 fb_id 由 [[fb]] 表提供——CAL 指令存在当且仅当 fb 表非空
加东西的流程
| 加什么 |
改配置 |
改代码 |
| 新指令(RR/RRR 等已有形态) |
op 表加一行(分区内空闲 op) |
编译器发射 + vm 执行 switch |
| 新形态(fmt 11..15) |
— |
指令编码 + 两端实现(预留位) |
| 新类型(标量) |
type 表加行 + func 空位 |
编译器类型层 + vm func 表 |
| 新内建 FB |
fb 表加行 |
vm do_cal 分派 + 编译器实例布局 |
| 字符串/数组/跳转表 |
— |
32B 组(0001)实现(N2/N4,延后) |
与 V1 schema 的差异
| 项 |
V1 |
V2 |
| meta.version |
1 |
2 |
| op 标识 |
opcode(0..33 全局) |
prefix + op(分区内) |
| 分类 |
class(plain/instance)+ format |
fmt(与 prefix 互锁) |
| 数据语义 |
tag(0/1/2) |
func 类别(none/width/full/float/dst) |
| 类型 |
3 条(BOOL/INT/TIME) |
19 条(base/kind/func) |
| FB |
8 条(opcode 对应 CAL_*) |
15 条(fb_id 0..14) |