主要观点:推动从内存不安全语言向安全语言迁移,提出通过改进 Rust 互操作性来加速这一进程,将 C++塑造成支持 Rust 所有词汇类型以增加语言间互操作性。
关键信息:
- 迁移压力:公司软件存在安全漏洞,70%可通过内存安全语言解决,美国政府要求供应商制定向内存安全语言迁移的路线图,截止日期为 2026 年 1 月 1 日。
- 安全路径:提出Safe C++扩展,以内存安全能力彻底改革标准 C++,或通过改进 Rust 互操作性实现安全,如直接在 C++端构建使用 Rust 标准库的基础设施。
- 两类互操作性:分为覆盖(支持语言特性)和智能(提供语言数据和语义)两类,通过语言服务器实现,Rust 和 C++编译器可相互作为语言服务器访问数据和语义。
- Rust 互操作性扩展:在 C++中扩展对 Rust 标准库的直接使用,包括多种 Rust 类型的支持,如借用类型、枚举等,C++编译器需新的中间级 IR 子系统;Rust 需为高质量 C++互操作性增加一些特性,如左值和右值引用类型、非平凡重定位函数等。
- 单向互操作性:通过扩展 C++覆盖所有 Rust 类型,可编写通过 Rust 原生类型和 trait 访问 C++功能的惯用法包装器。
- 参数析构:C++标准未规定参数传递约定,Unix 平台上调用者负责调用函数参数的析构函数,Rust 中接收者负责销毁参数对象,Safe C++草案提出
__relocate调用约定。 - std::string 问题:libstdc++版本的
std::string不是简单可重定位的,其小字符串优化导致实现浪费,C++稳定的 ABI 使得非平凡重定位成为 Rust 支持许多 C++类型移动语义的必要条件。 - Swift 互操作性权衡:Swift 团队多年来一直在改进 C++互操作性,但其在 C++覆盖方面存在一些限制,如不支持某些函数和模板,作者认为应扩展 C++以支持 Swift 的枚举等特性。
- 异常处理:Rust 在支持 C++异常方面已接近完成,函数调用在 MIR 和 LLVM 中处理异常,与 C++类似,Rust 的个性函数可与 C++兼容,可解决 C++异常在 Rust 帧中传播的问题。
- RTTI:C++使用 RTTI 类型信息数据识别抛出异常的类型,Rust 不完全符合此约定,可通过在 Rust 中添加 RTTI 支持或在 C++端处理来解决互操作性问题。
重要细节:
- C 互操作性:操作系统通过 C API 暴露功能,标准库基于系统 API 构建,C 的 ABI 是程序目标平台的参数传递约定,语言可通过定义 C 布局结构和编译器实现参数传递来实现 C 互操作性。
- C++互操作性挑战:C++函数重载、模板、参数绑定、名称修饰等因素使得 C++互操作性成为巨大挑战,每个语言特征相互关联,难以单独解决。
- 使用 Rust 从 C++:通过扩展语言覆盖和访问跨语言智能,实现直接在 C++中使用 Rust 声明,包括导入 Rust 模块、定义函数、处理函数调用等,C++编译器需新的中间级 IR 子系统来支持 Rust 对象模型。
- 使用 C++从 Rust:Rust 导入 C++头文件,通过语言服务器获取声明,使用 C++类型和函数,处理函数调用和重载解析,需要覆盖 C++函数调用 ABI 和支持非平凡重定位。
- C++异常处理细节:在 C++中,具有非平凡析构函数的作用域内对象由清理块销毁,
landingpad指令用于表示清理意图,与 Rust 类似,Rust 中的清理代码更多,包括处理潜在的析构函数抛出。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。