ABI 稳定性的十八年

18 年前的今天,即 2006 年 10 月 30 日,发布了curl 7.16.0,此版本将 libcurl 的 SONAME 编号从 3 提升到 4,带来了新功能和 bug 修复。

  • ABI 破坏:意味着 7.16.0 版本与之前的版本不兼容,用户不能简单地从之前的版本升级,需检查使用的 libcurl 并在某些情况下调整源代码,这不是 curl 项目中第一次 ABI 破坏,但此次影响较大,引发了用户的抱怨。
  • 移除 FTP 功能:7.16.0 版本移除了一些与 FTP 相关的功能和选项,此前可通过 curl 进行“第三方”FTP 传输,此版本后不再支持,该功能在 curl 中实现不佳且测试不足,几乎没有 FTP 服务器支持,实际使用的用户也少,因此被移除。
  • 近乎尖锐的情况:因使用被移除功能的人少,很少有人注意到 ABI 破坏,这让用户更不满 SONAME 提升,Debian 项目甚至决定覆盖决定,降低 SONAME 编号,这种提升带来的明显摩擦对作者影响很大,促使他决定将 ABI 兼容性置于首位。
  • 永不破坏的 ABI:最初是为避免提升带来的负面影响,后来作者更意识到其好处,如应用作者可随时升级到最新版本,示例、文档等可持续更新,但也有小例外,如偶尔有 bug 和回归,会让用户考虑降级或等待下一个修复版本,如今代码量已从 2006 年的不到 50,000 行增加到近 180,000 行。
  • 永不破坏 ABI 的影响:一旦采用更改,将在未来几十年内保持,需谨慎接受新更改,接受并发布后需支持已移除的代码和功能,不能缩小支持的选项列表或重命名,主要通过手动代码审查和大量测试来维护。
  • 弃用:在条件合适时仍可移除功能,如某些功能已被移除但仍提供相关选项,一些第三方库的支持也会随时间变化而改变,实际上 libcurl 比大多数现有服务器和 URL 更稳定。
  • 判断标准:判断是否为 ABI 破坏的标准是如果没人能发现 ABI 变化,就不是 ABI 变化,很难提前知道是否有人会注意到,用户升级周期长也增加了判断难度,处理用户对多年前更改的不满也很困难。
  • 向前兼容:用户可随时升级到较新版本,但不一定能回退到旧版本,因为会添加新功能,使用新功能的应用在回退到添加该功能之前的版本时可能无法工作或编译。
  • 永远有多远:作者阐述了这是他们的计划和目标,已坚持 18 年且未来没有明显障碍,但不能排除未来可能遇到无法解决的问题而不得不破坏 ABI。
阅读 20
0 条评论