關於GNU規範的語法擴充套件

2020-07-16 10:04:24
GNU 是一款能用於構建類 Unix 作業系統的計算機軟體合集,由自由軟體之父 Richard Stallman 開創,於 1983 年 9 月 27 日對外發布。GNU 完全由自由軟體(free software)構成。

GNU 語法擴充套件源自於 GCC 編譯器,在 1987 年發布 1.0 版本,稱為 GNU C Compiler。隨後,GCC 編譯器前端支援了 C++、Objective-C/C++、Fortran、Ada、Java 以及最近躍升的 Go 等程式語言,因此現在 GCC 被稱為 GNU Compiler Collection。

由於在 20 世紀 90 年代,GNU C 編譯器就對 C90 標準做了相當多的語法擴充套件,包括複合字面量、匿名結構體和陣列、可指定的初始化器等,這些語法擴充套件被廣泛使用,尤其是大量用於 Linux 核心程式碼中,因此 C99 標準將這些語法特性全都列入標準之中。

正因為 GCC 本身是開源自由軟體,因此很多商用編譯器也基於 GCC 進行擴充套件,例如:
  • 像 ARM 的 RVCT(RealView Compiler Toolkit)本身就支援 GNU 擴充套件;
  • 還有不少開發平台本身就直接使用 GCC 編譯工具。

由於有不少大公司頂級開發人員的參與,因此 GCC 編譯器的目的碼優化能力相當高,而且還支援許多不同的處理器。所以,GCC 當前被廣泛使用並博得開發者的好評。像 Linux 作業系統基本預設使用 GCC 作為預設編譯器,包括 Android 的 NDK 開發工具一開始也是如此。

然而,由於 GCC 基於比較嚴格的 GPL 許可證,許多大型商業開發商對它望而卻步。該許可證允許使用者免費使用軟體,但是要求不能隨意對它進行篡改並重新發布。如果開發者對它進行篡改,然後發布自己修改之後的軟體,那麼必須要把自己修改的那部分也開源出來。

因此,在 2003 年誕生了一個 LLVM 開源專案,基於更為寬鬆的 BSD 許可證,其編譯器稱為 Clang。BSD 許可證允許開發者隨意對軟體進行修改並重新發布,甚至可以將修改過的版本作為自主版權,因而這個許可證深受大公司的歡迎。

現在 Apple 對 LLVM 專案的投入非常大。macOS 上的開發工具 Xocde 從 4.0 版本起就開始使用 Clang 編譯工具鏈,隨後 Apple 將自己改寫的 Clang 編譯器稱為 Apple LLVM。當前最新的 Xcode 8 所使用的 Apple LLVM 版本為 8.x。

而當前 Android NDK 也支援了 Clang 編譯器工具鏈。

Clang 編譯器並非基於 GCC,它是從頭開始寫的。但是它的目標是盡量與 GCC 編譯器相容,所以Clang 編譯器包含大部分 GNU 語法擴充套件,除此之外還含有它自己特有的C語言擴充套件。當然也有一些特性是 GCC 含有而 Clang 不具備的,不過這些特性一般很少使用。

我們現在可以看到 GNU 語法擴充套件適用性十分廣泛。如果讀者當前在做 Linux/Unix 或 Windows 上的C語言程式設計開發,或者是在開發 macOS/iOS 應用,又或者是在開發 Android 應用,那麼完全可以毫無顧忌地使用 GNU 語法擴充套件。

本教學最後幾個章節會分別介紹 GCC 編譯器特定的語法擴充套件以及 Clang 編譯器特定的語法擴充套件。由於 Clang 編譯器已經包含了大部分 GNU 語法擴充套件,因此在介紹 GCC 語法擴充套件的時候,如果當前特性 Clang 不支援,則會指明。