CHICKEN Scheme 团队发布了 6.0.0 版本。这是核心库层面改动最大的一次更新:R7RS small 标准规定的模块全部补齐,字符串内部表示从字节序列换成了 UTF-8。同时,一批旧模块、进程接口和读法语法被移除或重命名。
这不是常规的功能迭代,而是一次面向标准兼容和长期可维护性的基础改造。收益是长期的:CHICKEN 以后更容易对齐其他 Scheme 实现,处理多语言文本也更省心。代价是眼前的:跑在 5.x 上的老程序,升级后有一部分会直接报错。
从“部分实现”到“补齐核心”,标准层面动了真格
CHICKEN 之前只实现了 R7RS small 的部分模块。6.0.0 把剩下的模块全部补上,case-lambda、call/cc、define-record-type 等原语从 (chicken base) 挪进了对应的 (scheme ...) 模块。
字符串内部表示换成 UTF-8,是这次改动里最基础的一层。旧版本按字节序列存字符串,遇到多字节字符容易出岔子;换成 UTF-8 之后,这类问题少了一大截,但发布说明没给出具体的性能对比数字。
跟上一个版本比,变化的重心完全不同。5.4.0 主要是修命令注入漏洞、改进 chicken-install 工具;6.0.0 的改动集中在语言标准、数据表示和 API 兼容性上。这个区分很关键——5.4.0 基本是无痛更新,6.0.0 不是。
真正花时间的是兼容层:这五处接口变了
对多数用户,这些改动看起来只是接口重排。但对维护 5.x 程序或 egg 扩展的开发者,几乎每一条都要动手改。
| 旧写法 | 新写法 | 谁会受影响 |
|---|---|---|
(chicken blob) | (chicken bytevector) | 用 blob 类型存二进制数据的代码 |
#${...} 读法语法 | 已移除,改用构造函数 | 直接写过 blob 字面量的代码 |
process-fork 返回 PID | 返回 process-object,需记录访问器 | 调用系统进程的脚本工具类 egg |
-r5rs-syntax | -r7rs-syntax | 用命令行选项切换语法的构建脚本 |
srfi-0/srfi-9/srfi-39 等别名 | 已删除,功能并入 R7RS 模块 | import 过这些别名的旧代码 |
FFI 那层还有一处容易被忽略的变化。传给 C 代码的字符串和符号,以前会被复制一份,现在直接传递。外部代码改了内存,Scheme 一侧也会跟着变——这对性能是好事,但对默认“传参就是安全拷贝”写代码的项目,是一处隐藏的坑。
建议很直接:先在测试环境把现有依赖的 egg 跑一遍。重点找用了 blob 字面量、按 PID 处理进程返回值,或者调用 file-read 之类接口传字符串参数的地方。改完确认没问题,才轮到生产环境。
该升级的和该先等等的
Windows 用户要留意工具链变化。纯 mingw-msys 的最小构建方式不再支持,官方现在推荐用 w64devkit 这套完整环境编译。如果构建脚本还锁定在旧 mingw 配置上,升级前得先换工具链,不是换完 CHICKEN 就能编译过。
编译器新增的两个闭包合并选项在优化等级 1、2 下自动开启,理论上能减少内存分配,但官方没给对比数据,不能说这版“全面更快”。R7RS small 全量可用,指的是核心模块补齐了,不代表 CHICKEN 现在等价于所有 R7RS 实现,别处的 R7RS 代码搬过来也不一定能直接跑。
接下来最值得盯的变量,是主流 egg 跟进适配的速度。如果依赖 blob 或旧进程 API 的核心库长期没人更新,不少项目会选择留在 5.x 分支,而不是硬着头皮迁移。
