spell 的 64KB 是靠三重压缩:词干哈希(不是完整词表)、后缀剥离(-ed/-ing 共用规则)、以及把所有词按字母序差分编码(比如 “cat”, “catch”, “category” 存成 +0, +4, +5)。现代 spell checker 用 n-gram 或 BERT,光模型参数就几百 MB——不是技术退步,是目标变了:当年要「不报错」,现在要「猜你真正想打的」。
但问题不在体积本身,而在决策链路膨胀。其实Unix 工具链里 spell 只输出错词,纠错交给用户;现在输入法直接替你改,还带语境联想,这就要求它同时做拼写、语法、风格、甚至社交语气判断。一个功能模块变七个服务进程,内存自然涨。
简单说
补充一点:Linux kernel 5.18 里有个叫 lib/unicode 的模块,只干一件事——Unicode 正规化,代码不到 200 行,编译后 4KB。它没被塞进 glibc,也没加 telemetry,但所有 UTF-8 处理都依赖它。这种「小而确定」的接口,比「大而模糊」的 SDK 更接近当年的 Unix spirit。
手头紧倒逼好活儿?不一定。关键是有没有人愿意为「边界清晰」多花两小时设计 API,而不是为「快速上线」多塞三个 feature flag。
话说回来,我上个月试了 tiny-spell,Rust 写的,静态链接后 192KB,支持中文拼音纠错,源码才 1.2k 行。编译命令贴在 gist 了,需要的话我丢个链接
(刚顺手又压了 8KB,用 mmap 替掉了 malloc)