GCC:優化 Linux、網際網路和一切 | Linux 中國

2021-02-15 Linux中國

軟體如果不能被電腦運行,那麼它就是無用的。而在處理運行時(run-time)性能的問題上,即使是最有才華的開發人員也會受編譯器的支配 —— 因為如果沒有可靠的編譯器工具鏈,就無法構建任何重要的東西。GNU 編譯器集合(GNU Compiler Collection)(GCC)提供了一個健壯、成熟和高性能的工具,以幫助你充分發揮你代碼的潛能。經過數十年成千上萬人的開發,GCC 成為了世界上最受尊敬的編譯器之一。如果你在構建應用程式是沒有使用 GCC,那麼你可能錯過了最佳解決方案。

根據 LLVM.org 的說法,GCC 是「如今事實上的標準開源編譯器」 [1],也是用來構建完整系統的基礎 —— 從內核開始。GCC 支持超過 60 種硬體平臺,包括 ARM、Intel、AMD、IBM POWER、SPARC、HP PA-RISC 和 IBM Z,以及各種操作環境,包括 GNU、Linux、Windows、macOS、FreeBSD、NetBSD、OpenBSD、DragonFly BSD、Solaris、AIX、HP-UX 和 RTEMS。它提供了高度兼容的 C/C++ 編譯器,並支持流行的 C 庫,如 GNU C Library(glibc)、Newlib、musl 和各種 BSD 作業系統中包含的 C 庫,以及 Fortran、Ada 和 GO 語言的前端。GCC 還可以作為一個交叉編譯器,可以為運行編譯器的平臺以外的其他平臺創建可執行代碼。GCC 是緊密集成的 GNU 工具鏈的核心組件,由 GNU 項目產生,它包括 glibc、Binutils 和 GNU 調試器(GDB)。

「一直以來我最喜歡的 GNU 工具是 GCC,即 GNU 編譯器集合(GNU Compiler Collection)。在開發工具非常昂貴的時候,GCC 是第二個 GNU 工具,也是使社區能夠編寫和構建所有其他工具的工具。這個工具一手改變了這個行業,導致了自由軟體運動的誕生,因為一個好的、自由的編譯器是一個社區軟體的先決條件。」—— Red Hat 開源和標準團隊的 Dave Neary。[2]

優化 Linux

作為 Linux 內核原始碼的默認編譯器,GCC 提供了可靠、穩定的性能以及正確構建內核所需的額外擴展。GCC 是流行的 Linux 發行版的標準組件,如 ArchLinux、CentOS、Debian、Fedora、openSUSE 和 Ubuntu 這些發行版中,GCC 通常用來編譯支持系統的組件。這包括 Linux 使用的默認庫(如 libc、libm、libintl、libssh、libssl、libcrypto、libexpat、libpthread 和 ncurses),這些庫依賴於 GCC 來提供可靠性和高性能,並且使應用程式和系統程序可以訪問 Linux 內核功能。發行版中包含的許多應用程式包也是用 GCC 構建的,例如 Python、Perl、Ruby、nginx、Apache HTTP 伺服器、OpenStack、Docker 和 OpenShift。各個 Linux 發行版使用 GCC 構建的大量代碼組成了內核、庫和應用程式軟體。對於 openSUSE 發行版,幾乎 100% 的原生代碼都是由 GCC 構建的,包括 6135 個源程序包、5705 個共享庫和 38927 個可執行文件。這相當於每周編譯 24540 個原始碼包。[3]

Linux 發行版中包含的 GCC 的基本版本用於創建定義系統應用程式二進位接口(Application Binary Interface)(ABI)的內核和庫。用戶空間(User space)開發者可以選擇下載 GCC 的最新穩定版本,以獲得高級功能、性能優化和可用性改進。Linux 發行版提供安裝說明或預構建的工具鏈,用於部署最新版本的 GCC 以及其他 GNU 工具,這些工具有助於提高開發人員的工作效率和縮短部署時間。

優化網際網路

GCC 是嵌入式系統中被廣泛採用的核心編譯器之一,支持為日益增長的物聯網設備開發軟體。GCC 提供了許多擴展功能,使其非常適合嵌入式系統軟體開發,包括使用編譯器的內建函數、#語法、內聯彙編和以應用程式為中心的命令行選項進行精細控制。GCC 支持廣泛的嵌入式體系結構,包括 ARM、AMCC、AVR、Blackfin、MIPS、RISC-V、Renesas Electronics V850、NXP 和 Freescale Power 處理器,可以生成高效、高質量的代碼。GCC提供的交叉編譯能力對這個社區至關重要,而預製的交叉編譯工具鏈 [4] 是一個主要需求。例如,GNU ARM 嵌入式工具鏈是經過集成和驗證的軟體包,其中包含 ARM 嵌入式 GCC 編譯器、庫和其它裸機軟體開發所需的工具。這些工具鏈可用於在 Windows、Linux 和 macOS 主機作業系統上對流行的 ARM Cortex-R 和 Cortex-M 處理器進行交叉編譯,這些處理器已裝載於數百億臺支持網際網路的設備中。[5]

GCC 為雲計算賦能,為需要直接管理計算資源的軟體提供了可靠的開發平臺,如資料庫和 Web 服務引擎以及備份和安全軟體。GCC 完全兼容 C++ 11 和 C++ 14,為 C++ 17 和 C++ 2a 提供實驗支持 [6](LCTT 譯註:本文原文發布於 2018 年),可以創建性能優異的對象代碼,並提供可靠的調試信息。使用 GCC 的應用程式的一些例子包括:MySQL 資料庫管理系統,它需要 Linux 的 GCC [7];Apache HTTP 伺服器,它建議使用 GCC [8];Bacula,一個企業級網絡備份工具,它需要 GCC。[9]

優化一切

對於高性能計算(High Performance Computing)(HPC)中使用的科學代碼的研究和開發,GCC 提供了成熟的 C、C++ 和 Fortran 前端,以及對 OpenMP 和 OpenACC API的支持,用於基於指令的並行編程。因為 GCC 提供了跨計算環境的可移植性,它使得代碼能夠更容易地在各種新的和傳統的客戶機和伺服器平臺上進行測試。GCC 為 C、C++ 和 Fortran 編譯器提供了 OpenMP 4.0 的完整支持,為 C 和 C++ 編譯器提供了 OpenMP 4.5 完整支持。對於 OpenACC、 GCC 支持大部分 2.5 規範和性能優化,並且是唯一提供 OpenACC 支持的非商業、非學術編譯器。

代碼性能是這個社區的一個重要參數,GCC 提供了一個堅實的性能基礎。Colfax Research 於 2017 年 11 月發表的一篇論文評估了 C++ 編譯器在使用 OpenMP 4.x 指令並行化編譯代碼的速度和編譯後代碼的運行速度。圖 1 描繪了不同編譯器編譯並使用單個線程運行時計算內核的相對性能。性能值經過了歸一化處理,以 G++ 的性能為 1.0。

圖 1 為由不同編譯器編譯的每個內核的相對性能。(單線程,越高越好)。

他的論文總結道:「GNU 編譯器在我們的測試中也做得很好。G++ 在六種情況中的三種情況下生成的代碼速度是第二快的,並且在編譯時間方面是最快的編譯器之一。」[10]

誰在用 GCC?

在 JetBrains 2018 年的開發者生態狀況調查中,在接受調查的 6000 名開發者中,66% 的 C++ 程式設計師和 73% 的 C 程式設計師經常使用 GCC。[11] 以下簡要介紹 GCC 的優點,正是這些優點使它在開發人員社區中如此受歡迎。

◈ 對於需要為各種新的和遺留的計算平臺和操作環境編寫代碼的開發人員,GCC 提供了對最廣泛的硬體和操作環境的支持。硬體供應商提供的編譯器主要側重於對其產品的支持,而其他開源編譯器在所支持的硬體和作業系統方面則受到很大限制。[12]◈ 有各種各樣的基於 GCC 的預構建工具鏈,這對嵌入式系統開發人員特別有吸引力。這包括 GNU ARM 嵌入式工具鏈和 Bootlin 網站上提供的 138 個預編譯交叉編譯器工具鏈。[13] 雖然其他開源編譯器(如 Clang/LLVM)可以取代現有交叉編譯工具鏈中的 GCC,但這些工具集需要開發者完全重新構建。[14]◈ GCC 通過成熟的編譯器平臺向應用程式開發人員提供可靠、穩定的性能。《在 AMD EPYC 平臺上用 GCC 8/9 與 LLVM Clang 6/7 編譯器基準測試》這篇文章提供了 49 個基準測試的結果,這些測試的編譯器在三個優化級別上運行。使用 -O3 -march=native 級別的 GCC 8.2 RC1 在 34% 的時間裡排在第一位,而在相同的優化級別 LLVM Clang 6.0 在 20% 的時間裡贏得了第二位。[15]◈ GCC 為編譯調試 [16] 提供了改進的診斷方法,並為運行時調試提供了準確而有用的信息。GCC 與 GDB 緊密集成,GDB 是一個成熟且功能齊全的工具,它提供「不間斷」調試,可以在斷點處停止單個線程。◈ GCC 是一個得到良好支持的平臺,它有一個活躍的、有責任感的社區,支持當前版本和以前的兩個版本。由於每年都有發布計劃,這為一個版本提供了兩年的支持。

GCC:仍然在繼續優化

GCC 作為一個世界級的編譯器繼續向前發展。GCC 的最新版本是 8.2,於 2018 年 7 月發布(LCTT 譯註:本文原文發表於 2018 年),增加了對即將推出的 Intel CPU、更多 ARM CPU 的硬體支持,並提高了 AMD 的 ZEN CPU 的性能。增加了對 C17 的初步支持,同時也對 C++2A 進行了初步工作。診斷功能繼續得到增強,包括更好的發射診斷,改進了定位、定位範圍和修復提示,特別是在 C++ 前端。Red Hat 的 David Malcolm 在 2018 年 3 月撰寫的博客概述了 GCC 8 中的可用性改進。[17]

新的硬體平臺繼續依賴 GCC 工具鏈進行軟體開發,例如 RISC-V,這是一種自由開放的 ISA,機器學習、人工智慧(AI)和物聯網細分市場都對其感興趣。GCC 仍然是 Linux 系統持續開發的關鍵組件。針對 Intel 架構的 Clear Linux 項目是一個為雲、客戶端和物聯網用例構建的新興發行版,它提供了一個很好的示例,說明如何使用和改進 GCC 編譯器技術來提高基於 Linux 的系統的性能和安全性。GCC 還被用於微軟 Azure Sphere 的應用程式開發,這是一個基於 Linux 的物聯網應用程式作業系統,最初支持基於 ARM 的聯發科 MT3620 處理器。在培養下一代程式設計師方面,GCC 也是樹莓派的 Windows 工具鏈的核心組件,樹莓派是一種運行基於 Debian 的 GNU/Linux 的低成本嵌入式板,用於促進學校和發展中國家的基礎計算機科學教學。

GCC 由 GNU 項目的創始人理察•斯託曼(Richard Stallman)首次發布 於 1987 年 3 月 22 日,由於它是第一個作為自由軟體發布的可移植的 ANSI C 優化編譯器,因此它被認為是一個重大突破。GCC 由來自世界各地的程式設計師組成的社區在指導委員會的指導下維護,以確保對項目進行廣泛的、有代表性的監督。GCC 的社區方法是它的優勢之一,它形成了一個由開發人員和用戶組成的龐大而多樣化的社區,他們為項目做出了貢獻並提供支持。根據 Open Hub 的說法,「GCC 是世界上最大的開源團隊之一,在 Open Hub 上的所有項目團隊中排名前 2%。」[18]

關於 GCC 的許可問題,人們進行了大量的討論,其中大多數是混淆而不是啟發。GCC 在 GNU 通用公共許可證(GPL)版本 3 或更高版本下發布,但運行時庫例外。這是一個左版許可,這意味著衍生作品只能在相同的許可條款下分發。GPLv3 旨在保護 GCC,防止其成為專有軟體,並要求對 GCC 代碼的更改可以自由公開地進行。對於「最終用戶」來說,這個編譯器與其他編譯器完全相同;使用 GCC 對你為自己的代碼所選擇的任何許可都沒有區別。[19]

 http://clang.llvm.org/features.html#gcccompat ↩︎

 ttps://opensource.com/article/18/9/happy-birthday-gnu ↩︎

由 SUSE 基於最近的構建統計提供的信息。在 openSUSE 中還有其他不生成可執行鏡像的源碼包,這些不包括在統計中。 ↩︎

 ttps://community.arm.com/tools/b/blog/posts/gnu-toolchain-performance-in-2018 ↩︎

 ttps://www.arm.com/products/processors/cortex-m ↩︎

 ttps://gcc.gnu.org/projects/cxx-status.html#cxx17 ↩︎

 ttps://mysqlserverteam.com/mysql-8-0-source-code-improvements/ ↩︎

 ttp://httpd.apache.org/docs/2.4/install.html ↩︎

 ttps://blog.bacula.org/what-is-bacula/system-requirements/ ↩︎

 ttps://colfaxresearch.com/compiler-comparison/ ↩︎

 ttps://www.jetbrains.com/research/devecosystem-2018/ ↩︎

 http://releases.llvm.org/6.0.0/tools/clang/docs/UsersManual.html ↩︎

 ttps://bootlin.com/blog/free-and-ready-to-use-cross-compilation-toolchains/ ↩︎

 ttps://clang.llvm.org/docs/Toolchain.html ↩︎

 ttps://www.phoronix.com/scan.php?page=article&item=gcclang-epyc-summer18&num=1 ↩︎

 ttps://gcc.gnu.org/wiki/ClangDiagnosticsComparison ↩︎

 ttps://developers.redhat.com/blog/2018/03/15/gcc-8-usability-improvements/ ↩︎

 ttps://www.openhub.net/p/gcc/factoids#FactoidTeamSizeVeryLarge ↩︎

 ttps://www.gnu.org/licenses/gcc-exception-3.1-faq.en.html ↩︎

via: https://www.linux.com/blog/2018/10/gcc-optimizing-linux-internet-and-everything

作者:Margaret Lewis 選題:lujun9972 譯者:Chao-zhi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

我們將為您添加白名單,授權「轉載文章時可以修改」。

相關焦點

  • gcc、arm-linux-gcc和arm-elf-gcc的關係?
    \n"); return 0;}編譯命令為: gcc -o test test.c 編譯生成 test 可執行文件。gcc 編譯流程分為四個步驟:預處理、編譯 、彙編、連結。個人認為預處理和編譯主要由 gcc-core 來完成,彙編和連結主要由 Binutils 來完成。
  • Linux gcc版本如何升級
    純手工打造每一篇開源資訊與技術乾貨,數十萬程式設計師和Linuxer
  • Linux GCC常用命令
    假設有一個由test1.c和 test2.c兩個源文件組成的程序,為了對它們進行編譯,並最終生成可執行程序test,可以使用下面這條命令: gcc test1.c test2.c -o test 如果同時處理的文件不止一個,GCC仍然會按照預處理、編譯和連結的過程依次進行。
  • gcc&arm-linux-gcc編譯過程詳解
    2.指針,3.Makefile ,今天是第一部分gcc,內容同樣適用於arm-linux-gcc。第1節_gcc編譯器1_常用選項_編譯過程詳解gcc的使用方法gcc [選項] 文件名gcc常用選項 一個c/c++文件要經過預處理、編譯、彙編和連結才能變成可執行文件。
  • /arm-none-linux-gnueabi-gcc: No such file or directory
    ++filt arm-none-linux-gnueabi-objdumparm-none-linux-gnueabi-cpp arm-none-linux-gnueabi-ranlibarm-none-linux-gnueabi-g++ arm-none-linux-gnueabi-readelfarm-none-linux-gnueabi-gcc
  • linux安裝gcc的shell腳本
    ,當然安裝編譯過程還是有點長的,腳本暫只支持以CentOS系統(系統版本5~7有測試過)來安裝(其它系統需要調整下快速安裝組件命令 yum 和對應的安裝包名)#!'# 鏡像地址MIRRORS_URL="http://mirror.linux-ia64.org/gnu/gcc"if [ -z $1 ] || [[ $1 == "new" ]]; then    echo "gcc version is empty!"
  • 嵌入式 Linux 的一切,看這一篇就夠了!
    把上面的文件存成helloworld.c,之後打開控制臺,輸入如下的命令gcc helloworld.c –o helloworld如果一切正常的話,你的控制臺上應該沒有任何輸出。用ls查看你的工作目錄,你會發現目錄下多了一個名為helloworld的可執行文件,之後,執行很簡單不是嗎?
  • Linux GCC 常用命令
    \n"); return 0;}這個程序,一步到位的編譯指令是:gcc test.c -o test實質上,上述編譯過程是分為四個階段進行的,即預處理(也稱預編譯,Preprocessing)、編譯(Compilation)、彙編 (Assembly)和連接(Linking)。
  • gcc中 -pthread和 -lpthread的區別
    $ gcc -v x.o -ox -pthread  /usr/lib/gcc/i486-linux-gnu/4.2.4/collect2 --eh-frame-hdr -m elf_i386 --hash-style=both  -dynamic-linker /lib/ld-linux.so.2 -ox  /usr/lib/gcc/i486
  • 如何在Linux中編寫和運行C程序
    在本文中,我們將解釋如何編寫,編譯和運行一個簡單的C程序。 這將成為您遷移到可以在Linux上編寫和執行的更複雜和有用的C程序的基礎。我們在Ubuntu 18.04 LTS系統上運行了本文中提到的步驟和命令。我們將使用Linux命令行工具Terminal,以編譯一個簡單的C程序。 要打開終端,您可以使用Ubuntu Dash或Ctrl + Alt + T快捷方式。
  • 一次搞定 Arm Linux 交叉編譯
    為了讓這個流程變得簡單,開發者們為不同的晶片開發了不同的編譯器,比如針對 Arm 平臺的 arm-linux-gcc,針對 mips 平臺的 mips-linux-gnu-gcc,這些編譯器都是基於 GCC 針對具體的架構指令集進行對應配置,所以它們在運行的時候就就會生成和該目標平臺對應的可執行文件。
  • 工程師乾貨:優化嵌入式Linux的啟動時間的秘密
    您可以在工具鏈中進行以下更改,這可能會影響啟動時間,性能和大小:編譯器版本:gcc和binutils的版本,最新版本往往可以具有更好的優化功能。C庫:glibc,uClibc,musl。使用uClibc和musl庫編譯的根文件系統更小指令集變量:ARM或Thumb2,是否支持硬浮點。
  • 為什麼程式設計師一定要學 Linux?
    其次,Linux 內核優化的好,運行效率比Windows要高,你沒見過哪個Linux 版本需要右鍵去刷新吧,因為Linux 沒有像Windows那樣複雜的系統。雖然Linux 在桌面上的佔有率不高,但是在程式設計師的世界中Linux 要佔用一席之地的,因為主流的網際網路應用都是部署在基於Linux 平臺的,例如:網站、資料庫、網路遊戲、即時通訊,主流的伺服器作業系統都在採用Linux 。
  • Linux c編程起步,掌握gcc的基本用法
    (OPTIMIZATION OPTION) :(-O0不進行優化處理,-O或-O1優化生成代碼 -O2進一步優化 -O3比-O2更進一步優化,包括inline函數)目標機選項 (TARGET OPTION) :(-b machine -V version )機器相關選項 (MACHINE DEPENDENT OPTION):(-m486 針對 486 進行代碼優化)
  • 【教程】arm-linux-gcc 4.3.2編譯uboot-1.1.6
    在第三期項目的視頻中,官方提供了一整套新的工具鏈,bootloader,內核和文件系統(arm-linux-gcc_4.3.2, uboot-2012.04.01
  • GCC的gcc和g++區別
    和g++是一個東西,只是有兩個不同的名字而已,今天在linux下編譯一個c代碼時出現了錯誤才找了一下gcc和g++的區別。gcc是GCC中的GUN C Compiler(C 編譯器)g++是GCC中的GUN C++ Compiler(C++編譯器)一個有趣的事實就是,就本質而言,gcc和g++並不是編譯器,也不是編譯器的集合,它們只是一種驅動器,根據參數中要編譯的文件的類型,調用對應的GUN編譯器而已。
  • Linux知識寶庫
    (lnx3000)smp: (symmetric multiple processor)對稱多處理器模式bigmem: 支持1G 以上內存的優化內核up:(Uni processor) 單處理器的模式0080 Oracle的安裝程序為什麼顯示亂碼?
  • GNU binutils 裡的九種武器 | Linux 中國
    [testdir]# gcc -v hello.oCOLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapperTarget: x86_64-redhat-linuxConfigured with: ..
  • 使用開源工具進行 Linux 內存取證 | Linux 中國
    計算機的作業系統和應用使用主內存(RAM)來執行不同的任務。這種易失性內存包含大量關於運行應用、網絡連接、內核模塊、打開的文件以及幾乎所有其他的內容信息,但這些信息每次計算機重啟的時候都會被清除。內存取證(Memory forensics)是一種從內存中找到和抽取這些有價值的信息的方式。Volatility 是一種使用插件來處理這類信息的開源工具。
  • 如何在Ubuntu 18.04上安裝GCC編譯器
    sudo apt install build-essential該命令將安裝一堆新包,包括gcc,g ++和make。鍵入以下命令安裝所需的GCC和G ++版本:linuxidc@linuxidc:~/www.linuxidc.com$  sudo apt install gcc-7 g++-7 gcc-8 g++-8 gcc-9 g++-9