当前位置: 首页 > 科技观察

GCC:优化Linux、Internet和一切

时间:2023-03-19 19:15:24 科技观察

软件如果不能在计算机上运行是没有用的。在处理运行时性能时,即使是最有才华的开发人员也会受制于编译器——因为没有可靠的编译器工具链,就无法构建任何重要的东西。GNUCompilerCollection(GCC)提供了一套强大、成熟和高性能的工具,可帮助您充分发挥代码的潜力。经过数千人几十年的发展,GCC是世界上最受尊敬的编译器之一。如果您在构建应用程序时没有使用GCC,那么您可能会错过最佳解决方案。根据LLVM.org,GCC是“当今事实上的标准开源编译器”[1]以及构建完整系统的基础——从内核开始。GCC支持ARM、Intel、AMD、IBMPOWER、SPARC、HPPA-RISC、IBMZ等60多种硬件平台,支持GNU、Linux、Windows、macOS、FreeBSD、NetBSD、OpenBSD、DragonFly等多种运行环境BSD、Solaris、AIX、HP-UX和RTEMS。它提供高度兼容的C/C++编译器,支持流行的C库,如GNUC库(glibc)、Newlib、musl和各种BSD操作系统中的C库,以及Fortran、Ada和GO语言。前端。GCC还可以充当交叉编译器,为运行编译器的平台以外的平台创建可执行代码。GCC是紧密集成的GNU工具链的核心组件,由GNU项目生成,其中包括glibc、Binutils和GNU调试器(GDB)。“我一直以来最喜欢的GNU工具是GCC,即GNU编译器集合。在那个开发工具非常昂贵的时代,GCC是第二个GNU工具,也是让社区能够编写和构建所有其他工具的工具。这个工具单枪匹马改变了行业并导致了自由软件运动的诞生,因为一个好的、免费的编译器是社区软件的先决条件。”-DaveNeary,红帽开源和标准团队。[2]针对Linux优化作为Linux内核源代码的默认编译器,GCC提供可靠、稳定的性能以及正确构建内核所需的额外扩展。GCC是ArchLinux、CentOS、Debian、Fedora、openSUSE和Ubuntu等流行Linux发行版的标准组件。在这些发行版中,GCC通常用于编译支持系统的组件。这包括Linux使用的默认库(例如libc、libm、libintl、libssh、libssl、libcrypto、libexpat、libpthread和ncurses),它们依赖于GCC提供可靠性和高性能,并使Linux内核特性。该发行版中包含的许多应用程序包也是使用GCC构建的,例如Python、Perl、Ruby、nginx、ApacheHTTP服务器、OpenStack、Docker和OpenShift。每个Linux发行版使用GCC构建的大部分代码构成了内核、库和应用程序软件。对于openSUSE发行版,几乎100%的本机代码都是使用GCC构建的,包括6135个源代码包、5705个共享库和38927个可执行文件。这相当于每周编译24540个源代码包。[3]Linux发行版中包含的GCC基础版本用于创建定义系统应用程序二进制接口(ABI)的内核和库。用户空间开发人员可以选择下载GCC的最新稳定版本以获得高级功能、性能优化和可用性改进。Linux发行版提供安装说明或预构建工具链,用于部署最新版本的GCC以及其他有助于提高开发人员工作效率和缩短部署时间的GNU工具。为互联网优化GCC是嵌入式系统中广泛采用的核心编译器之一,支持为越来越多的物联网设备开发软件。GCC提供了许多扩展,使其成为嵌入式系统软件开发的理想选择,包括使用编译器的内置函数、#语法、内联汇编和以应用程序为中心的命令行选项进行细粒度控制。GCC支持广泛的嵌入式架构,包括ARM、AMCC、AVR、Blackfin、MIPS、RISC-V、RenesasElectronicsV850、NXP和FreescalePower处理器,可以生成高效、高质量的代码。GCC提供的交叉编译功能对这个社区至关重要,而预构建的交叉编译工具链[4]是一个主要需求。例如,GNUARM嵌入式工具链是一个经过验证的集成包,其中包括ARM嵌入式GCC编译器、库和裸机软件开发所需的其他工具。这些工具链可用于在Windows、Linux和macOS主机操作系统上交叉编译流行的ARMCortex-R和Cortex-M处理器,这些处理器安装在数百亿个支持互联网的设备中。[5]GCC赋能云计算,为需要直接管理计算资源的软件,如数据库和Web服务引擎,以及备份和安全软件提供可靠的开发平台。GCC完全兼容C++11和C++14,提供对C++17和C++2a的实验性支持[6](LCTT译注:本文原文发表于2018年),可以创建高性能的目标代码,并提供可靠的调试信息。使用GCC的一些应用示例包括:MySQL数据库管理系统,它需要GCCforLinux[7];ApacheHTTP服务器,推荐GCC[8];和Bacula,一个企业级网络备份工具,需要GCC。[9]优化一切对于用于高性能计算(HPC)的科学代码的研发,GCC提供了成熟的C、C++和Fortran前端,以及对基于指令的并行编程的OpenMP和OpenACCAPI的支持。由于GCC提供了跨计算环境的可移植性,因此可以更轻松地在各种新旧客户端和服务器平台上测试代码。GCC为C、C++和Fortran编译器提供完整的OpenMP4.0支持,并为C和C++编译器提供OpenMP4.5完整支持。对于OpenACC,GCC支持大部分2.5规范和性能优化,是唯一提供OpenACC支持的非商业、非学术编译器。代码性能是这个社区的一个重要参数,而GCC提供了坚实的性能基础。2017年11月发表的ColfaxResearch论文评估了C++编译器在使用OpenMP4.x指令并行化编译代码时的速度以及编译代码的运行速度。图1描述了使用不同编译器编译并使用单线程运行时计算内核的相对性能。性能值标准化为G++的性能1.0。图1显示了使用不同编译器编译的每个内核的相对性能。(单线程,越高越好)。他的论文总结道:“GNU编译器在我们的测试中也表现出色。G++在六个案例中的三个案例中生成了第二快的代码,并且编译时间最快。[10]谁在使用GCC?在JetBrains的2018年开发者生态系统中调查显示,在被调查的6000名开发人员中,66%的C++程序员和73%的C程序员大量使用GCC。[11]下面简要介绍一下GCC使其在开发人员社区如此受欢迎的优点。需要为各种新的和遗留的计算平台和操作环境编写代码,GCC提供了对最广泛的硬件和操作环境的支持。硬件供应商提供的编译器主要侧重于对他们产品的支持,而其他开源编译器非常限于它们支持的硬件和操作系统。[12]?有各种基于GCC的预构建工具链,对嵌入式系统开发人员特别有吸引力。这包括GNUARMEmbedded工具链和Bootlin网站上提供的138个预编译交叉编译器工具链。[13]虽然Clang/LLVM等其他开源编译器可以替代现有交叉编译工具链中的GCC,但这些工具集需要开发人员完全重建。[14]?GCC通过成熟的编译器平台为应用开发者提供可靠稳定的性能。《在 AMD EPYC 平台上用 GCC 8/9 与 LLVM Clang 6/7 编译器基准测试》这篇文章展示了在三个优化级别运行的编译器的49个基准测试的结果。具有-O3-march=native级别的GCC8.2RC1在34%的时间内排在第一位,而处于相同优化级别的LLVMClang6.0在20%的时间内获得第二名。[15]?GCC为编译和调试提供改进的诊断方法[16],并为运行时调试提供准确有用的信息。GCC与GDB紧密集成,GDB是一种成熟且功能齐全的工具,可提供“不间断”调试,可在断点处停止各个线程。?GCC是一个得到良好支持的平台,拥有活跃和负责任的社区,支持当前版本和前两个版本。对于年度发布计划,这为发布提供了两年的支持。GCC:仍在继续优化GCC作为世界级编译器继续向前发展。GCC最新版本为8.2,于2018年7月发布(LCTT译注:本文最初发表于2018年),增加了对即将推出的IntelCPU、更多ARMCPU的硬件支持,并提高了AMD的ZENCPU的性能。表现。添加了对C17的初步支持,同时也在C++2A上完成了初步工作。诊断继续得到增强,包括更好的启动诊断、改进的目标、目标范围和修复提示,尤其是在C++前端。RedHat的DavidMalcolm于2018年3月在博客中概述了GCC8的可用性改进。[17]新的硬件平台继续依赖GCC工具链进行软件开发,例如RISC-V,这是一种免费开放的ISA机器学习、人工智能(AI)和物联网细分市场。GCC仍然是Linux系统持续发展的关键组成部分。面向Intel架构的ClearLinux项目是为云、客户端和物联网用例构建的新兴发行版,它提供了一个很好的示例,说明如何使用和改进GCC编译器技术来提高基于Linux的系统的性能和安全性。GCC还用于MicrosoftAzureSphere的应用程序开发,MicrosoftAzureSphere是一种基于Linux的物联网应用操作系统,最初支持基于ARM的MediaTekMT3620处理器。在培养下一代程序员方面,GCC还是RaspberryPi的Windows工具链的核心组件,RaspberryPi是一种运行基于Debian的GNU/Linux的低成本嵌入式板,可促进学校和发展中国家的教育。基础计算机科学教学。GCC于1987年3月22日由GNU项目的创始人RichardStallman首次发布,被认为是一个重大突破。GCC由来自世界各地的程序员社区在指导委员会的指导下维护,以确保对项目进行广泛、有代表性的监督。GCC的社区方法是其优势之一,它形成了一个庞大而多样化的开发人员和用户社区,他们为该项目做出贡献并提供支持。根据OpenHub的说法,“GCC是世界上最大的开源团队之一,在OpenHub上的所有项目团队中排名前2%。”[18]已经有很多关于GCC许可的讨论,包括大多数令人困惑而不是启发。GCC根据GNU通用公共许可证(GPL)第3版或更高版本发布,但运行时库除外。这是一个copyleft许可证,这意味着衍生作品只能在相同的许可条款下分发。GPLv3旨在保护GCC免于成为专有软件,并要求对GCC代码的更改是自由和公开的。对于“最终用户”来说,这个编译器与任何其他编译器完全一样;使用GCC对您为自己的代码选择的任何许可证都没有影响。[19]