二进制打包其实很好玩:从 JSON 到一门自制 schema 语言
来源: hereticpleb.vercel.app — 2026-09-28
概述
作者看到有人在社交媒体上嘲讽用 JSON 存数据不算「真正的开发者」,于是一时兴起写了套自己的二进制格式,结果一路做出了完整的 schema 语言、编译器前端与多语言代码生成器,最后把一份 401 字节的 JSON 压到 80 字节,体积减少 80%。
核心要点
- 最朴素的起点是 [TYPE][LENGTH][DATA] 三段式:用类型字节区分整数与字符串,用长度字节告诉解码器数据到哪里结束。
- 为了不浪费字节,作者用最高位当续接位把多字节头压成 varint,同时解决了长度超过 127 的问题;不用最低位是因为那样只能表示偶数。
- 关键洞察来自 protobuf:类型交给 schema 描述就不必随每个值携带类型标签,于是字段号左移两位、把 4 种编码类型(varint、f32、f64、delimited)塞进同一个 varint 里。
- 因为不想每次手动指定「这是定长、长度多少、然后给字节」,作者干脆设计了一门 schema 语言,包含 message、enum、union、map、list、package 与 import,坚持缩进不敏感、不用分号。
- C++ 实现走了词法分析、解析、AST、语义分析与动态打包的完整前端,再通过访问者模式生成 C 与 Python 代码,生成的 C 结构体零依赖,还附带打包解包函数。
- 实测一个 MMO 角色数据从 401 字节降到 80 字节,作者反复强调:本来只是出于赌气想省掉一点 JSON。
金句
我本来只是出于赌气想省掉一点 JSON,结果顺手写出了词法分析器、解析器、AST、语义分析器、动态二进制打包器和多语言代码生成器。
👍 0
👎 0
← 返回 Lobsters 首页