1.2 标准模板库 (STL:Standard Template Library) 和 C++ 标准库
Dave Musser 于 1971 年使用泛型编程完成了泛型库的初稿。Dave Musser 和 Alexander Stepanov 在中创造了“泛型编程”一词。Alexander Stepanov 继续研究 Musser 的泛型库思想,并于 1987 年开发了第一个使用 Ada 编程语言的库。Stepanov 和 Lee 在惠普 (HP) 工作期间将他们的库命名为标准模板库 (STL)。后来,STL 以开源形式发布。STL 是第一个用于 C++ 数据结构和算法的泛型库。STL 的设计围绕四个理念:泛型编程、抽象性、值语义和冯·诺依曼计算模型。如今,STL 已不再维护。然而,Stepanov 和 Lee 于 1993 年联系了 C++ 标准化委员会,并提交了他们的库,希望将其纳入 C++ 标准。经过反复讨论,该提案于 1994 年 7 月在 ANSI/ISO 委员会会议上获得批准。这三位研究人员为 C++ 标准中定义的 C++ 标准库的规范奠定了基础。此外,Stepanov 和 McJones 还基于坚实的数学基础撰写了《Elements of programming》一书,供实际编程使用。
请注意,标准模板库和 C++ 标准库是两个不同的东西。C++ 标准库是由 C++ 标准指定的。C++ 标准指定的 C++ 标准库有许多可用的实现。下表 2.1 列出了最常见的活跃实现。C++ 标准库有一个由 Cray® 开发的商业实现,即 Cray® C++ 标准库。所有其他实现均可作为开源软件获取。 Microsoft® 发布了用于 MSVC 工具集和 Visual Studio IDE 的 Microsoft® C++ 标准库。这是 Windows 操作系统最常用的实现。第二个 C++ 标准库由是 NVIDIA® C++ 标准库。该库的特殊之处在于其算法和数据结构可以在 CPU 和 NVIDIA® GPU 上使用。所有其他库都只能在 CPU 上运行。Linux 操作系统上最常见的 C++ 标准库是 GNU C++ 标准库。另一个 C++ 标准库是 LLVM C++ 标准库。C++ 标准库的最新实现是 HPX,即 C++ 并行和并发标准库。本书将使用 GNU C++ 标准库和 Microsoft C++ 标准库作为示例。对于分布式示例,我们将使用 C++ 并行和并发标准库 (HPX)。有关更多详细信息以及每个 C++ 标准库中可用的库特性,请参阅表 2.1。表 3 列出了 C++ 标准库的各种实现。除一个库外,所有库均采用开源许可证。
1.3 C++ 编译器
以下是可用的 C++ 编译器。请注意,可用的编译器还有很多,但我们只讨论那些最知名且在超级计算机上最常用的编译器。首先,我们考虑各公司提供的编译器。在 Cray® 超级计算机上,尤其是在使用消息传递接口 (MPI) 进行分布式计算时,会使用 HPE® Cray® 编译器。英特尔® 的 icc 编译器针对英特尔® CPU 进行了特殊优化。同样,IBM® XL 编译器针对 IBM® Power™ 架构进行了特殊优化,AMD® 的 AOCC 编译器针对 AMD® CPU 进行了特殊优化,富士通® 的 fcc 编译器针对 A64FX™ 架构进行了特殊优化,Arm® 的 armclang++ 编译器针对 Arm® 架构进行了特殊优化。微软® 为 Windows 操作系统提供了 Visual C++。最后,NVIDIA® 提供了 pgc++ 编译器,它是 NVIDIA® HPC SDK 的一部分。
以下是可用的社区驱动编译器。首先是 GNU 项目的 g++。该编译器在 Linux 上被广泛用作默认的 C++ 编译器。另一个编译器是 LLVM 项目的 clang++。
本书中的示例已使用 Visual C++、clang++ 和 g++ 编译器测试。有关推荐编译器和版本的更多详细信息,请参阅附录 C。但是,由于 C++ 已实现 ISO 标准化,所有支持 C++ 17 或 C++ 20 的编译器都应该能够正常工作。