CHICKEN Scheme 团队发布了 6.0.0 版本。这是核心库层面改动最大的一次更新:R7RS small 标准规定的模块全部补齐,字符串内部表示从字节序列换成了 UTF-8。同时,一批旧模块、进程接口和读法语法被移除或重命名。

这不是常规的功能迭代,而是一次面向标准兼容和长期可维护性的基础改造。收益是长期的:CHICKEN 以后更容易对齐其他 Scheme 实现,处理多语言文本也更省心。代价是眼前的:跑在 5.x 上的老程序,升级后有一部分会直接报错。

从“部分实现”到“补齐核心”,标准层面动了真格

CHICKEN 之前只实现了 R7RS small 的部分模块。6.0.0 把剩下的模块全部补上,case-lambdacall/ccdefine-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.4.0 安全修复为主 命令注入CVE修复 移除不安全REPL选项 chicken-install工具改进 弱引用对象加入核心 6.0.0 标准与编码重构 R7RS small全量补齐 字符串内部改为UTF-8 blob模块换成bytevector 进程API改用process-object

真正花时间的是兼容层:这五处接口变了

对多数用户,这些改动看起来只是接口重排。但对维护 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 一侧也会跟着变——这对性能是好事,但对默认“传参就是安全拷贝”写代码的项目,是一处隐藏的坑。

升级前该检查的四件事 字符串/编码 是否依赖字节级API blob/bytevector #$语法已移除 进程调用 返回process-object Windows工具链 需w64devkit

建议很直接:先在测试环境把现有依赖的 egg 跑一遍。重点找用了 blob 字面量、按 PID 处理进程返回值,或者调用 file-read 之类接口传字符串参数的地方。改完确认没问题,才轮到生产环境。

该升级的和该先等等的

Windows 用户要留意工具链变化。纯 mingw-msys 的最小构建方式不再支持,官方现在推荐用 w64devkit 这套完整环境编译。如果构建脚本还锁定在旧 mingw 配置上,升级前得先换工具链,不是换完 CHICKEN 就能编译过。

编译器新增的两个闭包合并选项在优化等级 1、2 下自动开启,理论上能减少内存分配,但官方没给对比数据,不能说这版“全面更快”。R7RS small 全量可用,指的是核心模块补齐了,不代表 CHICKEN 现在等价于所有 R7RS 实现,别处的 R7RS 代码搬过来也不一定能直接跑。

接下来最值得盯的变量,是主流 egg 跟进适配的速度。如果依赖 blob 或旧进程 API 的核心库长期没人更新,不少项目会选择留在 5.x 分支,而不是硬着头皮迁移。