GitHub Actions的YAML里塞了表达式语法,Terraform被逼着造了HCL,OpenAPI在JSON Schema上叠了十七层扩展。每个AI框架都有自己的JSON工具定义格式,互相之间差一个字段就报错。
这不是某个团队的失误,是整个行业在用螺丝刀敲钉子。JSON、YAML、TOML本身没问题,问题在于我们总让它们承载逻辑,等它们扛不住了再搭脚手架补救。
01 | 那个让作者想造新语言的瞬间
Stof的创造者展示了一段代码:文档启动时根本没有say_hello函数,它从外部拉取一段Stof代码,解析进自身,然后调用刚"长"出来的函数。输出是"Hello, Stof!"。
这看起来像动态加载,但关键是格式本身支持函数、类型、异步执行,而不是在数据格式外面再包一层DSL。Stof是JSON的超集,你现有的配置直接能用,但它内置了逻辑能力。
运行环境是Rust写的WASM沙箱。默认接触不到文件系统、网络、内存,除非你显式用doc.lib()桥接。这意味着一个服务可以把能力以Stof形式分享出去——不是描述文档,是可直接执行的逻辑。消费者解析完直接用,不需要客户端库,不需要SDK,不需要重新部署。
你的系统出厂带某些能力,运行时可以动态获得更多。
02 | 为什么"保持简单"总是翻车
故事开头总是相似的。新建配置或端点,想着"KISS原则",JSON多简单啊,键值对,顶多嵌套两层,这次一定保持干净。
六个月后的现实:在JSON海里捞$ref,写辅助工具,被 legacy 决策埋住,充满悔恨。
JSON Schema想解决验证问题,结果成了新的复杂度。YAML支持注释和引用,但缩进错误能调试一下午。TOML的数组语法让新手当场懵圈。每个格式都在自己的舒适区里很好,一旦越界就开始扭曲。
Stof的设计选择是:不取代现有交换格式,而是做胶水层。JSON、YAML、TOML、STOF随时能解析进同一个文档,补上该有的逻辑,再导出成目标格式。
03 | 运行时扩展的边界在哪
Stof的野心不止于配置。它想解决的是"能力共享"问题——服务A把自己的函数打包成Stof,服务B加载后直接在沙箱里执行。没有版本对齐,没有依赖地狱,没有"我这边跑的是v2.3你那边是v2.4"的噩梦。
这听起来像RPC,但RPC需要双方预先约定接口。Stof是直接把实现传过去,接收方决定给多少权限。doc.lib()就是权限阀门,你可以只暴露一个fetch,也可以完全隔离。
风险同样明显。动态加载代码的安全模型、沙箱逃逸的可能性、调试时的可见性——这些都没在示例里展开。WASM沙箱是底线,但业务逻辑的bug照样能让你凌晨三点起床。
格式能超集JSON,工程实践没法超集几十年的教训。
04 | 谁真的需要这个
如果你在做插件系统、低代码平台、或者AI Agent的工具调用,Stof的模型有吸引力。配置即代码,代码即能力,能力可热更新。这比"改配置→重启服务→祈祷"的循环轻快得多。
但如果你只是需要个API文档,OpenAPI 3.1够用了。如果你在写Terraform provider,HCL的生态搬不动。新格式的最大敌人从来不是旧格式,是旧格式周围的工具链、社区、和已经付过的学习成本。
Stof目前的状态是:能跑,有WASM沙箱,有超集JSON的语法,有异步函数。但有没有生产环境的压力测试?有没有大规模迁移的案例?作者没提。
这很合理。项目刚公开,先让人看懂想解决什么问题,比吹嘘解决了什么问题更重要。
最后一个细节:示例代码里的内存单位写法是"500GiB",Stof内置了单位转换。不是字符串"500GiB",是带类型的数值,能自动换算成字节。
这种小地方见心思——它真的在把自己当成编程语言设计,而不是JSON加个补丁。
你会愿意把运行时逻辑交给一个文档格式吗,还是宁可守着YAML里的那堆${{ github.expression }}?
热门跟贴