开源MSVC的STL(2019)

2020-06-10 19:00:40

今天在CppCon 2019上,我们(MSVC团队)宣布我们将以开源的形式发布C++标准库(也称为STL)的实现。

https://github.com/microsoft/STL是我们的新存储库,包含我们所有的产品源代码、一个新的Cmake构建系统和一个包含更多信息的自述文件。正如它解释的那样,我们仍在努力迁移到GitHub。虽然您现在就可以克隆和构建代码,但是在开始审查Pull请求之前,我们需要做几件事(比如添加我们的测试套件)。

答:有几个原因。在GitHub中处理STL将允许我们的客户跟踪我们的发展,尝试我们的最新更改,并通过审核来帮助改进我们的Pull请求。随着C++标准化的加速,每年都有更多的大型特性被投票选出,我们相信接受主要特性作为开放源码贡献将是重要的。(例如,C++20的计时库和格式库是潜在的候选。)。我们还希望通过实现我们的主要功能来回馈C++社区。(例如,C++17的charconv。)。

问:您使用的是什么许可证,这是否会直接影响Visual Studio的客户?

答:MSVC的STL是在Apache License v2.0下分发的,但有LLVM例外,这是最近由Clang/LLVM/libc++项目创建的。我们之所以选择这个开放源码许可,是因为拥有与libc++相同的许可将使我们的库之间更容易共享代码。需要明确的是,MSVC的STL没有与libc++合并;它们仍然是不同的库,使用不同的数据结构表示支持不同的平台。然而,如果libc++的维护人员有兴趣从MSVC的STL中获取特性实现(例如浮点charconv),或者希望在两个库中同时协作开发新特性,我们将能够提供帮助,而不必担心许可问题。

作为MSVC的STL的客户,您可能想知道这个新的许可证是否会给您带来新的义务。微软的立场是,带有LLVM例外的Apache License v2.0的文本(具体地说,LLVM例外的措辞)清楚地指出,当您使用MSVC的STL编译自己的源代码以生成目标代码或类似的输出(例如,静态库、动态库和可执行文件)时,在将编译后的产品交付给最终用户时不需要提供属性。这是我们选择这个许可证的另一个原因:为了避免扰乱我们客户的业务。

(出于完整性考虑,请另外注意:MSVC的STL包含派生自Boost.Math和Ryu的源代码,这些源代码是根据Boost软件许可证v1.0的条款使用的。这是另一个允许的开放源码许可证,也包含目标代码的显式例外。我们的派生源代码是在Apache License v2.0下分发的,但LLVM除外。)。

答:我们没有这样的计划。我们选择STL是因为它不同于其他MSVC库和编译器。具体地说,与其他MSVC库不同,STL是由C++标准化委员会快速发展和设计的。(由委员会设计是开源的一个优势!这意味着我们不需要在功能设计审查上花费任何时间和精力。实施战略和战术的约束要大得多,因此更容易审查。)。与编译器(通常情况下,一切都与其他一切交互)不同,STL也相对容易实现,并且有些松散耦合。

(有一个例外:我们将来可能会开放STL的支持库,但目前我们没有什么要宣布的。)。

答:一个相当小的问题:我们将花费一些时间检查我们的构建系统、测试基础设施和问题跟踪,这将推迟一些关于C++20库特性的工作。(我们刚刚完成了所有C++17库功能的实现,所以这应该不会有太大问题。)。这将允许我们更有效地处理STL,并最终更快地达到C++20的完备性。

MSVC团队要感谢Dinkumware和P.J.Plauger使这成为可能。