對於 GCC 的認知,很多讀者還僅停留在“GCC 是一個C語言編譯器”的層面,是很片面的。從本節開始,我將帶領大家系統學習 GCC,本節先帶領大家系統地瞭解一下 GCC。
談到 GCC,就不得不提 GNU 計劃。GNU 全稱 GNU's Not UNIX,又被稱為“革奴計劃”,由理查德·斯托曼於 1983 年發起。GNU 計劃的最終目標是打造出一套完全自由(即自由使用、自由更改、自由發佈)、開源的操作系統,並初步將其命名為 GNU 操作系統(其 logo 如圖 1 所示)。
圖 1 GNU 操作系統的 logo:非洲牛羚
GNU 計劃的實施可謂一波三折,最重要的一點是,雖然該計劃為 GNU 操作系統量身定做了名為 Thr Hurd 的系統內核,但由於其性能比不上同時期誕生的 Linux 內核,最終 GNU 計劃放棄 The Hurd 而選用 Linux 作為 GNU 操作系統的內核。在 Linux 內核的基礎上,GNU 計劃開發了很多系統部件,GCC 就是其中之一(除此之外,還有 Emacs 等非常實用的軟件)。
由此看來,GNU 計劃最終實現了“打造一套自由、開源的操作系統”的初衷,但該操作系統並非完全產自 GNU 計劃,因此其被稱為 GNU/Linux 操作系統(人們更習慣稱為 Linux 操作系統)。
早期 GCC 的全拼為 GNU C Compiler,即 GUN 計劃誕生的 C 語言編譯器,顯然最初 GCC 的定位確實只用於編譯 C 語言。但經過這些年不斷的迭代,GCC 的功能得到了很大的擴展,它不僅可以用來編譯 C 語言程序,還可以處理 C++、Go、Objective -C 等多種編譯語言編寫的程序。與此同時,由於之前的 GNU C Compiler 已經無法完美詮釋 GCC 的含義,所以其英文全稱被重新定義為 GNU Compiler Collection,即 GNU 編譯器套件。
所謂編譯器,可以簡單地將其理解為“翻譯器”。要知道,計算機只認識二進制指令(僅有 0 和 1 組成的指令),我們日常編寫的 C 語言代碼、C++ 代碼、Go 代碼等,計算機根本無法識別,只有將程序中的每條語句翻譯成對應的二進制指令,計算機才能執行。
GCC 編譯器從而停止過改進。截止到今日(2020 年 5 月),GCC 已經從最初的 1.0 版本發展到了 10.1 版本,期間歷經了上百個版本的迭代。作為一款最受歡迎的編譯器,GCC 被移植到數以千計的硬件/軟件平台上,幾乎所有的 Linux 發行版也都默認安裝有 GCC 編譯器。
表1:GCC 支持的硬件平台(部分)
|
硬件
|
操作系統
|
|
Alpha
|
Red Hat Linux 7.1
|
|
HPPA
|
HPUX 11.0
|
|
Intel x86
|
Debian Linux 2.2、Red Hat Linux 6.2 和 FreeBSD 4.5
|
|
MIPS
|
IRIX 6.5
|
|
PowerPC
|
AIX 4.3.3
|
|
Sparc
|
Solaris 2.7
|
值得一提的是,原汁原味的 GCC 編譯器沒有我們熟悉的界面窗口,要想使用它,必須編寫對應的 gcc 命令。所謂原汁原味,指的是純 GCC 編譯器和集成了 GCC 編譯器的開發軟件(IDE),和前者相比,後者在集成 GCC 編譯器功能的同時,還向用户提供了友好的界面窗口,使得用户即便記不住 gcc 命令,也能從事開發工作,這極大地降低了用户的學習成本。
我們知道,操作系統大致分為 2 大陣營,分別是 Windows 陣營和類 Unix 陣營(包括 Unix、Linux、Mac OS、安卓等)。通常情況下,Windows 系統下用户更習慣使用現有的 IDE 來編譯程序;而類 Unix 系統下,用户更喜歡直接編寫相應的 gcc 命令來編譯程序。
在瞭解什麼是 GCC 編譯器的基礎上,這裏以在 CentOS 操作系統(Linux 發行版之一)上使用 gcc 命令運行 C 語言程序為例,讓讀者更直觀的感受一下 GCC 編譯器的功能和使用方法。
如下是我們在 vim 編輯器中編寫的一段完整的 C 語言程序,其功能是輸出一個 "Hello, World!":
]圖 1 Linux 系統下編寫 C 語言程序
對於此程序,我們可以使用如下的 gcc 命令:
gcc demo.c -o demo.exe
有關 gcc 命令各部分的含義,後續章節會做詳細講解,這裏不必深究。
下圖演示瞭如何使用 gcc 命令將 C 語言代碼編譯成一個可執行文件:
圖 2 gcc 命令編譯 C 語言程序
如圖 2 所示,通過編寫對應的 gcc 命令並執行,就可以輕鬆將我們編寫的程序編譯成一個二進制可執行文件。