1.4.2 更倾向于使用库而不是扩展语言来实现特性

相比于语言核心功能的稳定,库则总是能随时为程序员提供快速上手的、方便易用的新功能。库的能量是巨大的,Boost[1]和一些公司私有的库(如Qt、POOMA)的快速成长就说明了这一点。而且库有一个很大的优势,就是其改动不需要编译器实现新特性(只要接口保持一致即可),当然,更重要的是库可以用于支持不同领域的编程。这样一来,通常读者不需要非常精通C++就能使用它们。

不过这些优点并不是被广泛认可的。狂热的语言爱好者总是觉得功能加入语言特性,由编译器实现了才是王道,而库只是第二选择。不过WG21的看法跟他们相反。事实上,如果可能,WG21会尽量将一个语言特性转为库特性来实现。比较典型的如C++11中的线程,它被实现为库特性的一部分:std::thread,而不是一个内置的“线程类型”。同样的,C++11中没有内置的关联数组(associative array)类型,而是将它们实现为如std::unorder_map这样的库。再者,C++11也没有像其他语言一样在语言核心部分加入正则表达式功能,而是实现为std::regex库。这样一来,C++语言可以尽量在保持较少的核心语言特性的同时,通过标准库扩大其功能。

从传统意义上讲,库可能是通过提供头文件来实现的。当然,有些时候库的提供者也会将一些实现隐藏在二进制代码库存档(archive)文件中。不过并非所有的库都是通过这样的方式提供的。事实上,库也有可能实现于编译器内部。比如C++11中的原子操作等许多内容,就通常不是在头文件或库存档中实现的。编译器会在内部就将原子操作实现为具体的机器指令,而无需在稍后去链接实实在在的库进行存档。而之所以将原子操作的内容放在库部分,也是为了满足将原子操作作为库实现的自由。从这个意义上讲,原子操作并非纯粹的“库”,因此也被我们选择性地纳入了本书的讲解中。

[1]在C++的众多开源库,最为出名的应该是Boost。Boost是一个无限制的开源库,在设计和审阅的时候,都常常有C++标准委员会的人参与。