文章摘要
C++模块化功能若无法在多个现有开源代码库上实现5倍(最好10倍)的编译速度提升,则应被取消并从标准中移除。尽管模块化承诺带来显著改进,但若无法达到预期效果,继续投入资源将陷入沉没成本误区。文章呼吁对C++模块化进行深入分析,以确保其实际价值。
文章总结
标题:我们需要认真思考如何处理C++模块
主要内容:
C++模块作为C++20的一项特性,原本承诺能够显著提升编译速度,但目前的进展并不理想。文章作者认为,如果C++模块无法在多个现有开源代码库上实现5倍(最好是10倍)的编译速度提升,那么应该考虑将其从标准中移除。否则,继续投入资源只会陷入“沉没成本谬误”。
核心观点:
编译速度的提升是首要目标:C++模块的核心初衷是通过将“头文件”部分存储在预处理的二进制格式中,从而大幅提升编译速度。然而,随着时间的推移,开发重点逐渐转向“构建隔离”,即避免宏泄漏和命名空间查找等问题。虽然这些问题确实存在,但它们对大多数开发者来说并不常见,而编译速度慢则是每个C++开发者每天都要面对的痛点。
模块的实现难度:C++模块的实现需要编译器与构建系统之间的紧密集成,但由于ISO标准并未涉及源代码文件的管理,导致各个组织各自为政,缺乏统一的协调。这种分散的开发方式使得模块的实现进展缓慢,甚至出现了复杂的临时解决方案,如编译时生成额外的编译器标志并存储在临时文件中。
设计问题:C++模块的设计过于宏大,缺乏实际的原型或测试代码,导致开发过程中遇到了许多难以解决的问题。作者建议,应该采用迭代式开发,先实现一个简单的模块文件,逐步扩展到更大的项目,并在每一步进行性能测试和优化。
import std的潜力:目前,C++实现者正在探索通过import std来逐步引入模块。这种方法可以避免复杂的编译顺序问题,并且由于标准库的编译速度较慢,import std可能会带来一定的性能提升。然而,这种提升可能仅限于与预编译头文件相当的水平(10-20%)。模块的劣势:使用模块需要开发者重写或重构代码,失去可移植性,并且构建设置变得更加复杂。此外,模块二进制文件(除MSVC外)不可移植,因此仍然需要提供头文件。
结论:
C++模块目前未能实现其最初的承诺,反而带来了诸多复杂性和限制。作者认为,如果无法实现显著的编译速度提升,继续投入资源开发模块可能并不值得。
评论总结
评论主要围绕C++模块的优缺点展开,观点分为支持和反对两派。
支持模块的观点: 1. 模块提供更好的封装和隔离:StephenHerlihyy认为模块提供了明确的子单元封装,避免了前向声明和复杂的头文件依赖关系,从根本上改变了代码组织方式。 - "Explicit sub-unit encapsulation. True isolation. No more weird forward declarations, endlessly nested ifdef guards, or insane header dependency graphs." - "Modules probably need a revision, and yes, adoption has been slow, but once you start using modules you will never go back."
- 模块简化编译过程:WalterBright提到,模块设计可以借鉴D语言的经验,C++模块应取代预处理器,简化编译过程。
- "The semantic meaning of the module is completely independent of wherever it is imported from."
- "C++ would get modules that have 25 years of use, and are very satisfying."
反对模块的观点: 1. 模块复杂且难以推广:forrestthewoods和TylerGlaiel认为模块设计过于复杂,难以在现有项目中推广,且标准委员会的设计失败。 - "Modules are simply never going to work en masse. It is a failed idea." - "Instead they wanted to make an entirely new thing that's impossible to retrofit into existing projects so its basically DOA."
- 模块对小型项目不友好:ch33zer指出,模块设计更适合大型科技公司,小型公司和爱好者难以从中受益。
- "My belief is that modules were designed for big tech companies that do massive builds parallelized across thousands of machines."
- "I think smaller companies and hobbyists kinda got screwed."
其他观点: 1. 头文件和分离编译单元的优势:pizlonator认为,尽管预处理器和链接器被诟病,但它们允许软件规模扩展到极致,模块系统无法比拟。 - "The pre processor and linker, as derided as they are, allow for scaling of software size to extremes not possible with supposedly superior languages’ supposedly superior module systems." - "Want to build a >billion line of code OS? You can do that with headers and separate compilation units."
- 模块对构建时间的影响:emtel提到,模块会显著增加构建时间,尤其是修改实现时,重建的工作量巨大。
- "Modules are horrible for build times. If you change an implementation the amount of rebuilding that happens is crazy, compared to any C++ project that was set up with a minimal amount of care."
总结:C++模块在封装和编译优化方面有潜力,但其复杂性和难以推广的问题使其在现有项目中难以广泛应用,尤其是对小型项目不友好。头文件和分离编译单元在某些场景下仍具有优势。