本節書摘來自華章計算機《c語言程式設計魔法書:基于c11标準》一書中的第1章,第1.3節,作者: 陳轶 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
對于目前主流桌面作業系統而言,可使用visual c++、gcc以及llvm clang這三大編譯器。其中,visual c++(簡稱msvc)隻能用于windows作業系統;其餘兩個,除了可用于windows作業系統之外,主要用于unix/linux作業系統。像現在很多版本的linux都預設使用gcc作為c語言編譯器。而像freebsd、macos等系統預設使用llvm clang編譯器。由于目前llvm項目主要在apple的主推下發展的,是以在macos中,clang編譯器又被稱為apple llvm編譯器。msvc編譯器主要用于windows作業系統平台下的應用程式開發,它不開源。使用者可以使用visual studio community版本來免費使用它,但是如果要把通過visual studio community工具生成出來的應用進行商用,那麼就得好好閱讀一下微軟的許可證和說明書了。而使用gcc與clang編譯器建構出來的應用一般沒有任何限制,程式員可以将應用程式随意釋出和進行商用。不過由于msvc編譯器對c99标準的支援就十分有限,加之它壓根不支援任何c11标準,是以本書的代碼例子不會針對msvc進行描述。所幸的是,visual studio community 2017加入了對clang編譯器的支援,官方稱之為——clang with microsoft codegen,目前版本基于的是clang 3.8。也就是說,應用于visual studio內建開發環境中的clang編譯器前端可支援clang編譯器的所有文法特性,而後端生成的代碼則與msvc效果一樣,包括像long整數類型在64位編譯模式下長度仍然為4個位元組,是以各位使用的時候也需要注意。為了友善描述,本書後面涉及visual studio內建開發環境下的clang編譯器簡稱為vs-clang編譯器。
而在嵌入式系統方面,可用的c語言編譯器就非常豐富了。比如用于keil公司51系列單片機的keil c51編譯器;目前大紅大紫的arduino闆搭載的開發套件,可用針對avr微控制器的avr gcc編譯器;arm自己出的ads(arm development suite)、rvds(realview development suite)和目前最新的ds-5 studio;dsp設計商ti(texas instruments)的ccs(code composer studio);dsp設計商adi(analog devices,inc.)的visual dsp++編譯器,等等。通常,用于嵌入式系統開發的編譯工具鍊都沒有免費版本,而且一般需要通過國内代理進行購買。是以,這對于個人開發者或者嵌入式系統愛好者而言是一道不低的門檻。不過arduino的開發套件是可免費下載下傳使用的,并且用它做開發闆連接配接調試也十分簡單。arduino所采用的c編譯器是基于gcc的。還有像樹莓派(raspberry pi)這種迷你電腦可以直接使用gcc和clang編譯器。此外,還有像nvidia公司推出的jetson tk系列開發闆也可直接使用gcc和clang編譯器。樹莓派與jetson tk都預設安裝了linux作業系統。在嵌入式領域,一般比較低端的單片機,比如8位的mcu所對應的c編譯器可能隻支援c90标準,有些甚至連c90标準的很多特性都不支援。因為它們一方面記憶體小,rom的容量也小;另一方面,本身處理器機能就十分有限,有些甚至無法支援函數指針,因為處理器本身不包含通過寄存器做間接過程調用的指令。而像32位處理器或dsp,一般都至少能支援c99标準,它們本身的性能也十分強大。而像arm出的rvds編譯器甚至可用gnu文法擴充。
圖1-1展示了上述c語言編譯器的分類。
