[论文推荐]将大型C++数学软件包迁移至C++20模块系统的实践与思考
thinkindev • 2025-07-01
3487 views
数学软件传统上以相互依赖的"包"形式构建,其中大量采用C++编写,其接口通过头文件(#include)方式暴露给下游用户。这种从C语言继承的接口导出方式存在笨拙、不可靠且效率低下的问题。为此,C++20引入了"模块"系统,允许显式导出声明和代码,编译器将其以机器可读形式存储,下游用户可通过"导入"使用——这一机制与数十年来其他编程语言的模块系统理念一致。 本文以包含约80万行代码的deal.II有限元库为例,探讨了将大型C++数学软件包迁移至该系统的实践。作者提出了一种允许代码库同时支持基于头文件和模块的接口方案,并详细阐述了迁移过程中遇到的技术挑战,以及模块系统在实际应用中的技术指标和人文因素影响。结果显示,虽然迁移需要一定工作量,但并非不可实现,转换后的库自身编译时间有所减少;然而对于下游项目,编译时间尚未呈现明确优化趋势。文章最后展望了未来数十年内逐步迁移整个数学软件生态系统的长期策略。
核心要点
- C++20模块系统通过显式导出机制解决了传统头文件接口的固有缺陷
- 以80万行代码的deal.II库为例,验证了模块化迁移的可行性及技术方案
- 模块化改造虽能减少库自身编译时间,但对下游项目影响尚不明确