本節書摘來自華章計算機《c語言程式設計魔法書:基于c11标準》一書中的第1章,第1.4節,作者: 陳轶 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
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不支援,則會指明。