Squeak 6.1 发布

查看原文 HN 讨论

文章摘要

在 Squeak 即将迎来三十周年之际,Squeak 团队发布了 6.1 版本,代号「Vanessa」——这个代号是为了纪念 2025 年去世的核心开发者 Vanessa Freudenberg(SqueakJS 的作者)。距离上一个版本已经过去了四年,这四年里项目合并了 1700 多个补丁、9000 多处方法改动,因此这份发布说明本身就是一份相当可观的文档。值得一提的是,这份 release notes 被设计成可以在 Squeak 镜像内部阅读,文中大量的「交互式示例」链接可以直接点开在 SqueakJS(浏览器里的 Smalltalk 虚拟机)中运行,所以它既是变更日志,也是一份动手探索新特性的导览。发布说明本身也从 GitHub 搬进了镜像内部,同时镜像到 squeak.org 上。

官方列出的几个重点:一是全新的树形浏览器(tree browser),用重构过的层级 morph 来导航类和分类,并集成了 Monticello 包管理,还附带五个新的外观配置项;二是Objectland 回归,这是对 2003 年那个著名的「Worlds of Squeak」的重建,里面收录了一批展示 Squeak 各种能力的彩色示例,经典的 Etoys 赛车示例被重新加回,还有「消失了 18 年」的 BlobMorph 也被复活并更新;三是对内核基础设施的大量修改与修复,涉及进程的模拟(simulation)、栈展开(unwinding)、调度以及类的 reshape;四是对检视、调试、性能分析和版本管理这一整套工具链与 UI 的杂项改进。

在 GUI 层面,Morphic 做了一轮相当彻底的树 morph 大修:改善配色与键鼠导航、重做「输入即过滤」并高亮搜索词、用 [TAB] 搜索单列、可配置的过滤模式(在当前选中项内 / 所有可见节点 / 整棵树中搜索)、递归的 find/find again([CMD]+F / [CMD]+G)、树的自动展开开关,以及拖放时悬停一秒自动展开节点。世界(world)里现在支持把类引用、系统与方法分类、检视器字段直接拖进来打开新窗口。文本编辑器给链接加了悬停下划线,选区加引号时会自动转义嵌套引号。此外还有大量高 DPI 支持的改进:按钮、滚动面板、滑块、菜单、多选列表、树、投影、便签、Etoys 图标、游戏、日历等等都在列。

工具链方面的改动尤其密集。检视器现在允许对象贡献自定义字段和菜单项,新增 shift 元菜单用于检视字段或浏览/调试其访问器,检视超大集合时可以关闭截断显示全部元素;对透明代理对象和不可哈希对象的检视变得更安全,因为工具会避免向它们发送任何消息。调试器新增了 “send until…” 命令用于在嵌套消息发送中精确定位条件,”run to here” 可以到达块内的表达式,栈列表菜单新增「select home」用于找到深层嵌套块的 home context,还新增了 byteCodes 模式可以逐条查看和单步执行方法的 VM 指令,以及一个「simulate」按钮,用来调试 Squeak 的元循环求值器(即上下文模拟器)是怎么解释下一条字节码的——这是相当典型的 Smalltalk 式「用系统调试系统自己」。

核心语言层面,Kernel 增加了 Complex>>logInteger>>bitInvert64Integer>>timesCollect:Number>>timesTwoPower: 等设施,修正了大整数与分数的 #sin/#cos/#tan 行为,修复了若干数字解析问题,并对整数位运算、整型-浮点混合运算、浮点转分数、三角函数做了优化;BlockClosure>>valueWithExitValue 支持带值的非局部退出。正则表达式引擎升级幅度不小:支持 Unicode 字面量(\x41\u{1F388})、字符类转义(\p{N}\P{Lu})、命名捕获组、非捕获组,允许可空闭包重复,新增 POSIX 风格的最左最长匹配开关,并修复了捕获组顺序问题(现在一致地按从左到右存储)。FFI 部分正在开发可在后台运行 primitive 与 callout 的多线程 OpenSmalltalk VM,新增了可配置的异常处理模式、C 声明的变长参数支持以及 ARM64 支持。版本控制方面 Monticello 与 Installer 全面转向 HTTPS,Squot 新版本支持 git revert、tag 和 co-author,Squeak Inbox Talk 发布了第一个稳定版,整合了邮件列表的 HyperKitty 归档。

发布说明也如实列出了已知问题:后台进程抛出的调试器通知可能出现「Proceed」按钮不可用(变通办法是先点 Debug 再点 Proceed);递归的 process-faithful 调试在某些步进下可能罕见地陷入死循环;lookbehind 内的贪婪模式处理不正确;SqueakSSL 在 Linux 和 macOS 上跑 HTTPS 服务器目前不工作;Linux 上镜像可能耗尽文件描述符(需要 ulimit -n 提高上限);Linux + Wayland 下文本 morph 可能每次点击都丢焦点。兼容性方面有若干破坏性变更,比如 Promise>>value 现在会等待接收者、DateAndTime>>offset: 修正为符合 ANSI 的语义、BrokenPromise 被弃用(promise 被拒绝时会重新抛出原始异常)。测试套件目前有超过 5800 个测试,在 CI 上三分钟内跑完。

HN 评论精华

这条帖子拿到 289 分,但讨论的重心几乎完全不在 6.1 的具体变更上,而是变成了一场关于 Smalltalk 这种编程范式本身的怀旧与辩论,其中夹着一条相当尖锐的「UI 十年没长进」的抱怨线。