EdgeSpec 这门语言为什么故意做小:禁掉递归、指针与无界循环的取舍

作者:

在

结论:EdgeSpec 是一门故意做小的语言。它禁掉了递归、动态代码加载、任意指针、无界字符串、无界循环和未声明 I/O 这六样能力——不是为了省字节,而是为了让每一条规则在编译期就能被证明「跑得完、算得准、不越权」。MCU 侧因此不需要预处理器、汇编器和链接器,只做一次受限翻译。

为什么把「编译」拆成两段

把完整工具链塞进 MCU 是个看起来更省事、实际更贵的选择。ESP32-S3 的片内 SRAM 只有 512 KB,勉强跑 Clang 或 GCC 会带来编译延迟、RAM 峰值、ABI 兼容、恶意代码与崩溃恢复这一连串问题。更根本的是:通用编译器给用户的自由度远超车载仪表的需要。

EdgeForge 的拆法是让重活留在性能充足的 Studio 侧——语法、类型、量纲、越界、权限推导;MCU 只负责把平台无关中间表示(EFIR)翻译成 EdgeVM 字节码,并逐字节核对。这样「能力边界」就在编译期被写死,而不是等到运行时才发现。

受限语言禁掉的是哪六样

被禁止的能力 禁它的直接原因 替代做法
递归 栈深不可静态判定,无法给出确定的内存上限 用有限状态机或固定层数的表达式
动态代码加载 绕过签名与权限检查,信任根失效 功能包走签名安装通道
任意指针 越界访问无法在编译期证明 信号按命名空间索引访问
无界字符串 长度不可预算,缓冲区不可确定 定长字段与枚举值
无界循环 无法保证在墙钟预算内结束 固定迭代次数或窗口统计原语
未声明 I/O 插件可触达未授权设备 在设备能力清单内显式声明

这六条的共同点是:它们都让「这段代码要花多少资源」变成一个无法提前回答的问题。而在车载环境下,无法预算就等于无法承诺。

预算是语言的一部分,不是运行时的运气

EdgeVM 的每条 pipeline 都带三重预算:指令预算、墙钟预算与输出预算。触发非法 opcode、越界跳转或栈溢出时,当前插件会被立即停止,而不是降级继续跑。

这也是它与「在 MCU 上跑 Lua」的关键差别:Lua 提供通用语言能力,很难在编译期证明指令预算、栈深与资源占用;EdgeVM 把这三项做成了代码结构本身的属性。语法检查、类型检查、单位与权限检查、资源检查依次通过之后,才允许生成字节码。

36 字节是怎么压出来的

EFIR 使用定长头部与任务表,表达式只允许有限 opcode,事件动作走索引表。ESP32、STM32 与 RP2040 的 C99 编译器都在调用者提供的固定缓冲区内完成转换,全程不申请堆内存——没有堆分配,就没有分配失败这条故障路径。

产物 输入体积 输出体积 适用条件
基础示例应用 88 字节 EFIR 36 字节 EdgeVM 常量、信号读取与本地事件
8 样本平均窗口规则 58 字节 EFIR 20 字节 EdgeVM 最少 4 样本有效,Host API 1.3.0
Studio 四规则草稿 212 字节 EFIR 132 字节 EdgeVM 草稿态,尚未签名发布

体积的意义在于更新成本:一次页面布局或阈值调整,从「重新编译并烧录整机固件」降到「传输几百字节并验签」。代价就是上面那六条限制。

确定性怎么验证

同一份 EFIR 在三个目标平台上生成完全一致的字节码,这意味着编译结果可以作为制品被审计。基础示例的 88 字节 IR 生成 36 字节字节码,已与 Node 参考编译器逐字节一致;这类比对让「翻译器对不对」从主观判断变成可回归的断言。

需要区分的是:编译成功只代表确定性校验通过,不代表获得发布许可。AI 生成、开发者编译、维护方签名是三个独立角色,不能互相替代。

AI 在这套语言里能做什么

AI 只能输出 EdgeSpec 提案,不产出可运行代码。它可以做需求理解、信号选择、布局组合、规则生成、适配器模板与测试用例;不能扩展 Host API、绕过签名、直接发送总线帧,也不能修改信任根,更不能把猜测的协议发布成正式信号。

这条边界对产品线的意义是具体的:AI 可以在 SR-RaceBox 车载数据采集器 采集到的信号上组合出新的告警规则,但不能替我们宣称某款车型的私有 PID 已获验证;SR-ECU 赛车 ECU 标定工具 的写入动作属于受控能力,不在插件可自行申请的权限集合内。以 Toyota GR86 这类 200 PS 的后驱入门车为例,车主真正需要的往往是一组「转速阈值 + 水温上限 + 单圈计时」的组合规则,完全落在功能包可覆盖的范围内,不需要触碰任何车辆控制权限。

FAQ

EdgeSpec 和直接在 MCU 上跑 Lua 有什么区别?

区别在于可静态验证。EdgeVM 每条 pipeline 都有指令预算、墙钟预算和输出预算,非法 opcode、越界跳转与栈溢出会立即停止当前插件;Lua 难以在编译期证明这些。

禁掉递归和循环,还能写出有用的规则吗?

能。窗口统计、阈值与迟滞、有限状态机、单位显示、记录策略这类车载常用能力都不需要递归或无界循环,用固定迭代次数与窗口原语即可表达。

有了功能包机制,固件还需要 OTA 吗?

需要。新外设驱动、新无线协议栈、底层 CAN/USB/显示驱动、VM 漏洞修复与加密库更新都必须走固件通道,功能包降低的是更新频率。

88 字节与 36 字节是典型值还是保证值?

是当前原型的实测值,且已验证与 Node 参考编译器逐字节一致;体积随规则复杂度变化,例如 8 样本窗口规则为 58 字节 EFIR、20 字节字节码。

ESP32-S3 上能顺便跑对话模型吗?

不适合。S3 只运行规则与显示,通用对话模型应放在手机或 Linux/手机级设备,并按内存、上下文、发热与时延评估量化模型。

参考资料

  • 项目 05 EdgeForge 开发板侧端框架 —— D:/Backup/Documents/开发板侧端模型/EdgeForge自编译软件框架方案.md(V1.4,2026-09-21)
  • 项目 05 —— LINK端侧传感器软件设计说明.md(V0.1,2026-09-13,设备能力清单)
  • 项目 05 —— OBD_AI插件化平台方案书.md(V1.0,2026-09-13,权限与签名边界)

更新记录

首次发布 2026-10-11 最近核对:2026-10-11

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注