C 語言的編譯
上一個小節(jié) C 語言的程序結(jié)構(gòu)中我們簡單的認(rèn)識了一下 C 語言的程序到底由那些部分組成,但是僅僅了解 C 語言的程序結(jié)構(gòu)還不夠,僅僅是萬里長征走完了第一步,后面還需要進(jìn)行很多的步驟才能讓程序成為一個可以使用的工業(yè)產(chǎn)品。還記的上一個小節(jié)中我們提到的 gcc 嗎?其實這是一個 C 語言的編譯器,這一個小節(jié)我們就來學(xué)習(xí)一下編譯器這個概念。
1. C 語言編譯器
每個語言都需要編譯器,甚至包括可以直接操作 CPU 內(nèi)部寄存器的匯編語言。編譯器的作用就是將我們用接近人類自然語言編寫的程序翻譯成計算機(jī)可以直接執(zhí)行的二進(jìn)制文件。
其實使用二進(jìn)制是人類在計算機(jī)發(fā)明過程中妥協(xié)于工程實踐的一個行為。因為從最高效率的數(shù)字進(jìn)制來說,三進(jìn)制其實更為有效率,但是實現(xiàn)起來不那么容易。
C 語言的編譯器有非常多種,下面我們列舉了一些,供大家參考。
編譯器 | 編譯器作者 | 支持的操作系統(tǒng) | 是否有相關(guān)的集成開發(fā)環(huán)境 | 授權(quán)許可類型 |
---|---|---|---|---|
AMPC | Axiomatic Solutions Sdn Bhd | Windows,Unix & Other | Yes | Proprietary |
Amsterdam Compiler Kit | Andrew Tanenbaum and Ceriel Jacobs | Unix & Other | No | BSD |
CCS C Compiler | CCS, Inc. | Windows,Unix & Other | Yes | Proprietary |
Clang | Low-Level Virtual Machine | Windows,Unix & Other | No | BSD |
DMS Software Reengineering Toolkit | Semantic Designs | Windows,Unix & Other | No | Proprietary |
GCC C | GNU Project | Windows,Unix,IBM mainframe, AmigaOS, VAX/VMS, RTEMS | No | GPL |
RCC (RCOR C Compiler) | Rodrigo Caetano (rcor) | Windows,Unix | No | GPL |
Interactive C | KISS Institute for Practical Robotics | Windows, Unix, Mac, Linux, IRIX, | Solaris, SunOS | No |
LabWindows/CVI | National Instruments | Windows,Unix & Other | Yes | Proprietary |
lcc | Chris Fraser and David Hanson | Windows,Unix & Other | Windows only | Freeware (source code available for non-commercial use) |
Mark Williams C | Mark Williams Company | Windows,Other | Yes | Proprietary |
Microsoft C | Microsoft | Windows | Yes | Proprietary |
Nwcc | Nils Weller | Windows,Unix,Other | No | BSD |
Open64 | SGI Google HP Intel Nvidia PathScale Tsinghua University and others | Unix,Other | No | GPL |
Pelles C | Pelle Orinius | Windows | Yes | Freeware |
PGCC | The Portland Group | Windows,Unix,Other— Mac OS X | Yes — Visual Studio on Windows | Proprietary |
Portable C Compiler | Anders Magnusson and others | Windows,Unix,Other | No | BSD |
Power C | Mix Software | Other | No | Proprietary |
QuickC | Microsoft | Windows | Yes | Proprietary |
SAS/C | SAS Institute | Windows,Unix,Other-IBM mainframe, AmigaOS, 68K, 88K, Unix | Yes | Proprietary |
Tiny C Compiler | Fabrice Bellard | Windows,Unix | No | LGPL |
Turbo C | Embarcadero | Other | No | Proprietary - V 2.01 freely available |
CCS C Compiler | CCS, Inc. | Windows,Unix,Other | Yes | Proprietary |
MikroC Compiler | MikroElektronika, Inc. | Windows,Unix,Other | Yes | Proprietary |
ups debugger (includes C interpreter) | Tom Hughes, Ian Edwards, and others | Unix,Other-Solaris, SunOS | Yes | GPL |
VBCC | Dr. Volker Barthelmann | Windows,Unix,Other | No | Freeware (source code available, |
XL C | IBM | Unix-AIX | Eclipse | Proprietary |
當(dāng)然,編譯器還與計算硬件平臺息息相關(guān)。同一個編譯器會因為計算機(jī)體系結(jié)構(gòu)不同而分為不同的版本。如 arm64,armhf,x86, x86_64,PowerPC 等等。
在本教程中,我們主要會使用到 gcc 編譯器。同時我們會在 arm64,armhf,x84_64 等硬件平臺上編譯我們的程序。從中可以看出 C 語言的移植性還是很好的。同樣的程序,我們可以在不同的編譯器以及硬件平臺上編譯執(zhí)行。
Tips:請大家注意,我們的學(xué)習(xí)要求操作系統(tǒng)為 Windows 10,Linux, Unix, 或者 MacOS。對于微軟已經(jīng)停止維護(hù)的 Windows 7 以及更早的系統(tǒng)。我們沒有辦法使用新的特性來編譯和運行相關(guān)的程序。
2. 使用 IDE 編譯 C 語言
在集成環(huán)境中,編譯 C 語言一般只需要在菜單中選擇 運行 或者 調(diào)試運行 即可。也可以通過相關(guān)的快捷鍵來直接編譯運行程序。要是只編譯不運行,那么里面會有 編譯 選項和與之對應(yīng)的快捷鍵。這時程序只是編譯,并不會運行。
對于初學(xué)者來說建議大家不使用 IDE, 而是直接使用文本編輯器來編輯程序。大家不要擔(dān)心,我不會推薦諸如 VIM,EMACS 這種上個世紀(jì)的產(chǎn)物,因為太小眾了。這里建議大家使用微軟的 Visual Studio Code, 簡稱 VSCode。這個文本編輯器,現(xiàn)代,多功能,多種操作系統(tǒng)下都可以使用,功能強(qiáng)大,可以根據(jù)自己的需要安裝插件擴(kuò)展功能。
3. Ubuntu 下安裝 GCC 編譯器
在類 Linux 中編譯 C 語言是一件簡單的事情。只要打開一個終端窗口安裝 gcc 編譯器即可。
對于基于 Ubuntu 系統(tǒng)的用戶,安裝編譯所需的軟件只需要執(zhí)行如下命令:
sudo apt install build-essential
Tips:對于 RPM 包管理的 Linux 發(fā)行版(如 CentOS,OpenSUSE 等),會有類似的軟件組,只不過名稱和安裝時所使用的命令不同。
在安裝結(jié)束后可以查看 gcc 的版本。
gcc --vresion
會有類似如下的信息輸出:
gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
這時候可以把之前一直使用的示例程序編譯一下。
# include <stdio.h>
int main()
{
int x,y,z;
printf("Welcome to Utopia's lessons!\n");
return 0;
}
首先將上面的命令保存為文件名 test.c。
編譯 C 語言的命令如下:
gcc test.c -o test
這個命令的意思是將 test.c
文件名的程序源碼,編譯為名稱 test
二進(jìn)制程序。
4. 在 Windows 下編譯 C 語言
以前在 Windows 下直接編譯 C 語言是一件困難的事情。要么使用諸如 Visual Studio 之類的 IDE,要么安裝 Cygwin 這類的模擬環(huán)境。
但是在目前 Windows 10 中,現(xiàn)在有了更便捷的選擇。可以安裝 WSL 環(huán)境, 全稱為 Windows Subsystem for Linux。大家可以通過搜索上面的關(guān)鍵字來查找安裝方式。
在這里我將微軟的官方文檔鏈接放在這里,方便大家安裝。這里有詳細(xì)步驟,以及大家在安裝過程中會經(jīng)常遇到的安裝問題等。
在選擇安裝 Ubuntu 后,就可以按照上面在 Linux 環(huán)境下編譯 C 語言的方式來編譯了。
Tips:這時候大家可能很好奇文件路徑的問題。在 Windows 10 中的盤符,是掛載在 WSL 系統(tǒng)中 /mnt 目錄下的。比如你的用戶名叫 mooc,那么你的文檔目錄下存儲了源代碼,你要怎么進(jìn)入 文檔 這個目錄呢?
cd /mnt/c/Users/mooc/Documents/
3. 小結(jié)
C 語言的編譯總結(jié)起來其實就是,用編譯器將源代碼,也就是我們可以讀懂的程序,翻譯成機(jī)器可以讀懂的機(jī)器碼。
這個過程需要你做到幾點:
- 準(zhǔn)備編譯器;
- 準(zhǔn)備代碼編寫工具;
- 編寫代碼;
- 通過命令行,使用編譯器編譯。
當(dāng)然這是最簡單的使用,后面隨著課程的深入,我們還會通過工具來進(jìn)行編譯命令行的替代。