什么样的编译器才算优秀?
在技术正在变化的软件开发世界中,市场上C++编译器的数量继续呈下降趋势。随着新的先进C++标准(C/17,C/C/20)的出现,新的指令集扩展,以及更高的代码优化标准,什么样的编译器是好的?
近年来,市场上C++编译器的数量有所下降。一些知名度较低的编译器已经退出市场,甚至一度非常受欢迎的Borland(Embarcadero)C++编译器也不再被维护。随着新的高级C++标准(C/17,C/20)的出现,新的指令集扩展(例如AVX 512有数百条新指令),以及更高的代码优化标准,编译器的构建变得更加复杂。
微软VisualStudio非常受欢迎,因为它拥有一个用户友好的集成开发环境(IDE),以及出色的调试和交叉引用功能。但VisualStudio在支持最新指令集方面落后,在代码优化方面也不是最好的编译器。
英特尔编译器曾是代码优化领域的领军人物,但现在已被GCC和Clang取代。此外,英特尔编译器在其隐藏的"致残的AMD"功能暴露后不再受欢迎。
开源编译器GCC和Clang现在领先。这两个编译器非常相似。它们都支持所有平台和最新的指令集扩展。
我的一位同事对不同的C++编译器进行了测试,并在他的C++手册中列出了测试结果。在代码优化方面,GCC和Clang编译器显然是最好的。在某些方面,clang优于GCC,但在某些方面它往往会出现过循环,这是对代码缓存的浪费。我不得不承认,当LLVM/族项目启动时,我对它非常怀疑,但当人们投入大量工作时,Clang编译器在多种指标上都优于所有其他编译器。
在Linux和Mac上工作的程序员发现Clang编译器没有任何问题。但在Windows上它有点复杂。Windows至少有两个现成版本的Clang编译器。Cygwin版本和VisualStudio插件版本。
Clang编译器的Cygwin版本已经存在多年了,但它并不是最新版本,而且它存在一些性能问题。默认情况下,Cygwin 64版本的Clang使用一个中等内存模型。这是相当浪费的,因为它为静态变量和常量使用64位绝对地址,而不是32位相对地址。通过指定mcmodel=size可以提高性能。只有在直接链接到外部DLL中的变量(在任何情况下,这是一个糟糕的编程实践)时,才需要使用中等内存模型。Cygwin版本的另一个缺点是,在分发执行器时必须包括CygwinDLL。
微软提供Cygwin版本作为VisualStudio的插件。同事们的测试表明,它生成了非常优化的代码。Cygwin插件尚未集成到MSBuild框架中。它现在只支持CMake框架,使用起来相当复杂,因为您必须手动指定Microsoft命令行选项和Clang选项的奇怪组合。实际上,我发现在没有VisualStudioCMake框架的情况下,使用Clang作为命令行工具更容易。
微软宣布,Clang和MSBuild框架的全面集成即将到来。我希望微软能够兑现这一承诺。我们预计,这种整合可能是优化编译器和用户友好的IDE框架的最佳方式,并将尽快实现。
我对英特尔编译器的未来命运更加不确定。随着越来越少的程序员实际使用它,英特尔会继续维护它吗?英特尔编译器提供了许多非常有用的函数库,可以用于许多特殊用途,但这些函数库的工作方式与其他编译器一样。
编译器是连接人类世界和机器世界的桥梁。它可以将程序员理解的高级语言转换成机器代码,以便有效地执行程序。对于一个合格的C/C+开发人员来说,良好的C/C+编译器是日常工作中不可或缺的辅助工具。