Swift 与 C++ 互操作性讨论
swift GitHub repo 更新的一份文档讨论了 Swift 与 C++ 之间 API 层面互操作性的设计和权衡。
讨论前提
假设会对 Swift 的语言特性和标准库进行修改:
所提出的修改必须符合 Swift 的目标和理念。也就是说提出的修改必须有合理的理由被 Swift 社区接受。例如,在 Apple 平台上对 ABI 进行破坏兼容性的变更不可能被接受
对 Swift 语言或标准库进行 fork,或在没有 fork 的情况下创建一门方言(并因此导致改变 Swift 的目标、理念、安全性和工效设计)同样不会被考虑或讨论
假设会对 C++ 代码、工具链、标准库实现以及 runtime 环境进行有限的修改:
必须要考虑此类修改的成本。对于需要控制完整工具链的用户而言,为 C++ 进行 ABI 兼容方面的变更也许会被接受。但对于整个社区来说这不是必需,因此这种改动只会被视为优化
目标
对于 API 用户来说,互操作性应该在各方面最大限度的透明化:API 设计和效率提升、编辑器集成和工具,以及性能。对于 API 开发商来说,互操作性不应成为重大的额外负担,并允许 API 开发商对导入的 API 进行组织。
API 设计和效率提升主要是指使用 Swift 的开发者不会感受到原生 Swift API 和导入的 C++ API 之间具有差异。
例如,虽然在 Swift 中可以编写自定义哈希表,但很少这样做,大多数代码都使用Set
和 Dictionary
。因此,当把使用std::unordered_map
或 flat_hash_map
类型的 C++ API 导入 Swift 时,如果继续使用这些 C++ map 类型,这样的写法在 Swift 中看起来就会很怪异。
编辑器集成和工具方面的设计会参考 Swift 与 Objective-C 互操作性的机制。即在可能的范围内,所有的编辑器操作对互操作都应有良好的支持,例如如果调用"rename function"函数进行重构,就应该在 Swift 和 C++ 代码中重命名所有定义、声明和用法。
性能方面,当在 Swift 中使用 C++ API 时,理想情况下和在 C++ 中使用保持一致的性能特征。
事实上,上面提到的目标存在某方面的冲突。例如 API 工效设计和性能之间的冲突。如果在 API 边界自动将 C++ 类型桥接到相应的 Swift 类型,则可以提供更符合工效设计理念的 API,不过这样的类型转换会造成较大的 CPU 开销。
文档还详细阐述了许多暂定的设计方案
▼ 往期精彩回顾 ▼
觉得不错,请点个在看呀