放松被认为是有害的?· 小步前进

主要观点:近期认为应弃用panic=unwind,多数生产用户已使用panic=abort或有限使用 unwind 用于清理而非真正恢复,弃用多数情况下的 unwind 有诸多益处,如可扩展类型系统等,但不应完全移除,因其涉及稳定性及与其他语言系统的集成。
关键信息:

  • unwind 使所有代码需能在各点停止并重启,但并非总能做到,会引入难以理解的隐式控制流。
  • 最初限制 unwind 范围的不变量已不可行,如添加共享可变类型和catch_unwind等。
  • unwind 增加二进制大小,限制优化,使借用检查更保守,函数不能依赖运行至结束,导致不安全代码难写且使“必须移动类型”不可行。
  • unwind 虽有用,如在事件驱动过程中恢复等,但多数网络服务已使用panic=abort,且 salsa 框架虽用 unwind 但可找到替代方案。
  • 不应完全移除 unwind,应将其作为窄范围需求支持,如在代码库中需转换为Result的部分。
    重要细节:
  • 插入“着陆垫”会增加二进制大小,编译器需考虑更多控制流路径影响优化。
  • 借用检查器不接受某些移动操作是因为 unwind,担心函数返回前未填充“洞”。
  • 写不安全代码时需考虑 unwind 可能出现的多处位置,如调用闭包等。
  • 弃用 unwind 可使其成为 ABI 的一部分,在无 unwind 的函数中借用检查器可更宽松且支持“必须移动类型”。
阅读 14
0 条评论