- 零基礎(chǔ)學(xué)C語言(第4版)
- 康莉 李寬
- 3025字
- 2020-06-17 18:23:07
1.4 程序的開發(fā)周期
在Windows下,利用“記事本”(Notepad.exe)這個小軟件,可以輸入并編輯文字,然后保存到計算機硬盤上,如圖1-2所示。保存到硬盤上的數(shù)據(jù)以文件的形式存在,如要將文件保存到“d:\”目錄,在保存的時候,“記事本”軟件會提示用戶輸入文件名和保存的路徑,例如我們可以用“C.txt”作為文件名,以“d:\”作為文件路徑。保存后,通過Windows的文件瀏覽器定位到“d:\”就可以看到文件“C.txt”。同樣的,用畫圖小軟件可以信手涂鴉,也能保存一個擴(kuò)展名為bmp的文件到硬盤上,如圖1-2所示。

圖1-2 記事本和畫圖可以產(chǎn)生文件
可以看到,“記事本”和“畫圖”都可以產(chǎn)生出文件來。這些文件被稱作“文檔”。這些文檔都可以被應(yīng)用軟件打開,它們自身是無法運行也無法展現(xiàn)其內(nèi)容的。例如,要查看.txt文本文檔的內(nèi)容,可以使用“記事本”軟件打開;又如,想要聽.mp3音頻文件的聲音,可以使用mp3播放軟件打開。那么如何產(chǎn)生一個.exe的可執(zhí)行文件呢?
聰明的讀者一定知道了。是的,就是通過編寫某種語言的源代碼,編譯成功通過后,再經(jīng)過連接,成功后就出現(xiàn)了計算機可以執(zhí)行的一個.exe文件了。這就是所謂的程序。是不是只有C語言才能編制出.exe的程序來呢?當(dāng)然不是的。據(jù)不完全統(tǒng)計,全球現(xiàn)存的編程語言多達(dá)2500多種,這其中大部分都可以經(jīng)過編譯連接,最后產(chǎn)生出一個.exe可執(zhí)行文件來。但是基本上,它們都遵循同樣的流程:編輯源代碼,編譯源代碼,連接目標(biāo)程序,最后生成一個.exe可執(zhí)行文件。用C語言開發(fā)程序的流程如圖1-3所示。

圖1-3 開發(fā)程序的流程
1.4.1 編輯C源代碼
編輯C源代碼就是做如下工作:
(1)逐個輸入字符,如漢字、英文、標(biāo)點符號或者其他可以用鍵盤輸入的字符。
(2)通過插入、刪除、移動、復(fù)制、粘貼等方法修改已經(jīng)輸入的字符。
(3)將輸入、修改完畢的所有字符保存到硬盤上。
一篇由漢字、英文、標(biāo)點符號或者其他可以用鍵盤輸入的字符組合的內(nèi)容被稱作文本。能夠進(jìn)行文字編輯的軟件被稱作編輯器。
通俗地講,源代碼就是程序員輸入編寫的、符合C語言語法規(guī)則的文本。如下列片段就是一段源代碼:
void main(void) { printf("\nHello World!"); }
一般用擴(kuò)展名.c表示其為一個C源代碼文件。源代碼文件簡稱源文件,有時候也叫作源程序。程序員的主要工作之一就是根據(jù)需求編寫源代碼。
編輯器的功能在很大程度上能夠幫助程序員提高工作效率。只要能輸入文字的文本編輯軟件都可以作為源代碼編輯器。如記事本軟件、字處理軟件Word、Ultra Edit、Edit Plus等。但是專業(yè)程序員一般都采用專業(yè)的源代碼編輯器。業(yè)界鼎鼎有名的編輯工具有VI/VIM、Emacs/XEmacs等。一個好的源代碼編輯器,要求具備關(guān)鍵字著色功能(可以用不同的顏色表示代碼的不同部分)、優(yōu)秀的代碼跳轉(zhuǎn)功能、代碼自動補全功能等。雖然用最普通的記事本軟件也能編輯代碼,但是卻十分不方便。
1.4.2 編譯C源代碼
編譯是把C語言源代碼翻譯成用二進(jìn)制指令表示的目標(biāo)文件。注意,這里的目標(biāo)文件與機器語言還有一段距離,并不是真正的機器語言,所以不能被計算機直接運行。編譯著重于“譯”,就是翻譯。
聲明 讀者要注意區(qū)分編輯和編譯的概念。雖然一字之差,意義卻大不相同。編輯,是指對文本的修改、插入、刪除等操作;而編譯卻是將編輯好的源代碼翻譯成目標(biāo)文件。
編譯過程由C編譯系統(tǒng)提供的編譯程序完成。編譯程序簡稱為編譯器。編譯程序運行后,自動對源程序進(jìn)行句法和語法檢查,當(dāng)發(fā)現(xiàn)錯誤時,就將錯誤的類型和所在的位置顯示出來,以幫助用戶修改源程序中的錯誤。用戶可以再利用編輯器對源程序進(jìn)行修改。修改好后,重新進(jìn)行編譯,直到編譯通過為止。如果未發(fā)現(xiàn)句法和語法方面的錯誤,就自動形成目標(biāo)代碼,并對目標(biāo)代碼進(jìn)行優(yōu)化后生成目標(biāo)文件。
目標(biāo)程序文件的擴(kuò)展名為.obj,它是目標(biāo)程序的文件類型標(biāo)識。不同的編譯系統(tǒng),或者不同版本的編譯程序,它們的啟動命令不同,生成的目標(biāo)文件也不相同,擴(kuò)展名有時候也不一定相同,當(dāng)然格式也不相同,但是其作用相同。
一個C源代碼文件編譯后就會產(chǎn)生一個目標(biāo)文件與之對應(yīng)。一般不會出現(xiàn)多個源代碼文件對應(yīng)一個目標(biāo)文件的情況。進(jìn)行軟件開發(fā)涉及的源代碼文件個數(shù),不會像教學(xué)C語言這樣簡單到只有一個源文件,而是幾十、上百甚至成千上萬個。所以大型軟件的開發(fā)一般通過工程文件的方式來管理源代碼。
請讀者思考一下,為什么軟件開發(fā)不直接從源代碼一步到位翻譯成可執(zhí)行文件,而要經(jīng)過編譯后,再經(jīng)過連接這個步驟呢?這個問題,留在后續(xù)章節(jié)再解釋。當(dāng)讀者明白了這個問題后,也就明白了目標(biāo)文件存在的意義了。
1.4.3 連接目標(biāo)文件
多個源代碼文件經(jīng)編譯后產(chǎn)生了對應(yīng)的多個目標(biāo)文件,此時還沒有將其組合裝配成一個可以運行的整體,因此計算機還是不能執(zhí)行。連接過程是用連接程序?qū)⒛繕?biāo)文件、第三方目標(biāo)文件、C語言提供的運行時庫文件連接裝配成一個完整的可執(zhí)行的目標(biāo)程序。連接程序簡稱連接器。
可執(zhí)行程序文件的擴(kuò)展名為.exe,是可執(zhí)行程序的文件類型標(biāo)識。絕大部分系統(tǒng)生成的可執(zhí)行文件的擴(kuò)展名是.exe,但是在UNIX系統(tǒng)中,除非在編譯時用戶特別規(guī)定自己的文件名,否則生成的可執(zhí)行文件自動確定為a.out。有的C編譯系統(tǒng)把編譯和連接放在一個命令文件中,用一條命令即可完成編譯和連接任務(wù),減少了操作步驟。
程序員開發(fā)程序,除了要編寫自己的代碼外,有時候會使用其他人提供的庫文件。如讀者要編寫一個mp3播放器軟件,對于mp3解碼部分,因為已經(jīng)有現(xiàn)成的第三方代碼庫做好了這件事情,可以直接拿這個第三方庫文件來使用。這個庫提供的功能可供用戶的播放器軟件調(diào)用。為了方便開發(fā),C語言也有一批庫函數(shù),一般編譯廠商都會提供給開發(fā)人員使用。
1.4.4 編譯連接過程示例
有時候為了敘述簡便,將編譯連接這兩個步驟,統(tǒng)一用“編譯”一個詞語代替,讀者應(yīng)該清楚實際是經(jīng)歷過了兩步。例如在Visual Studio編程環(huán)境里,當(dāng)用戶下達(dá)build(構(gòu)建)命令后,開發(fā)環(huán)境就開始編譯連接工作。本節(jié)的示例沒有列出源文件,源文件名是main.c,內(nèi)容可以暫時不考慮,讀者只關(guān)注編譯、連接的步驟即可。
(1)當(dāng)源代碼中沒有錯誤時,其工作過程輸出如下:
------ Build started: Project: 9.1, Configuration: Debug Win32 ------ Compiling... main.c Linking... Build log was saved at "file://e:\study\C Study\9.1\Debug\BuildLog.htm" 9.1 - 0 error(s), 0 warning(s)
從這個Build的過程中,明顯看出經(jīng)歷了“Compiling…”(編譯)、“Linking…”(連接)兩步。最后結(jié)果是“0 error(s),0 warning(s)”,即沒有錯誤也沒有警告。
(2)如果源代碼有錯誤,在編譯過程就會提示用戶。由于沒有通過編譯,也就沒有目標(biāo)文件,所以連接也就不用進(jìn)行了。一個源代碼錯誤編譯不通過的示例如下:
------ Build started: Project: 9.1, Configuration: Debug Win32 ------ Compiling... main.c e:\study\C Study\9.1\main.c(20) : error C2143: syntax error : missing ')' before '{' Build log was saved at "file://e:\study\C Study\9.1\Debug\BuildLog.htm" 9.1 - 1 error(s), 0 warning(s) ---------------------- Done ---------------------- Build: 0 succeeded, 1 failed, 0 skipped
說明 讀者現(xiàn)在可能還不明白錯誤提示信息的含義,不用擔(dān)心,在后面的章節(jié)中會慢慢講到。現(xiàn)在讀者只需要關(guān)注如果源代碼有錯誤,會出現(xiàn)什么情況即可。
“e:\study\C Study\9.1\main.c(20):error C2143:syntax error:missing')'before'{'”這行輸出表示,代碼第20行(“( )”內(nèi)表示出來的)出現(xiàn)錯誤。錯誤代碼是C2143,具體錯誤是語法錯誤,在“{”前缺少“)”。雙擊錯誤提示可將鼠標(biāo)光標(biāo)定位到錯誤行處,可以修改源代碼。
(3)有時候編譯通過了,但是連接卻不一定通過。如下:
------ Build started: Project: 9.1, Configuration: Debug Win32 ------ Compiling... main.c Linking... LIBCD.lib(crt0.obj) : error LNK2019: unresolved external symbol _main referenced in function _mainCRTStartup Debug/9.1.exe : fatal error LNK1120: 1 unresolved externals Build log was saved at "file://e:\study\C Study\9.1\Debug\BuildLog.htm" 9.1 - 2 error(s), 0 warning(s) ---------------------- Done ---------------------- Build: 0 succeeded, 1 failed, 0 skipped
編譯main.c后沒有提示信息,表示通過,產(chǎn)生了.obj文件。Linking提示后,表示開始進(jìn)行連接。但是在連接過程中出現(xiàn)錯誤,最終沒有產(chǎn)生.exe文件。同樣,具體的連接錯誤原因,這里不再分析了。
1.4.5 運行程序
運行程序是指將可執(zhí)行的目標(biāo)程序投入運行,以獲取程序處理的結(jié)果。如果程序運行結(jié)果不正確,可重新回到第一步,對程序進(jìn)行編輯修改、編譯和運行。與編譯、連接不同的是,運行程序可以脫離語言開發(fā)環(huán)境。因為它是對一個可執(zhí)行程序進(jìn)行操作,與C語言本身已經(jīng)沒有聯(lián)系,所以既可以在語言開發(fā)環(huán)境下運行,也可直接在操作系統(tǒng)下運行。
- 新編Visual Basic程序設(shè)計上機實驗教程
- Learning Real-time Processing with Spark Streaming
- Docker技術(shù)入門與實戰(zhàn)(第3版)
- Java面向?qū)ο笏枷肱c程序設(shè)計
- Unity 2020 Mobile Game Development
- 嚴(yán)密系統(tǒng)設(shè)計:方法、趨勢與挑戰(zhàn)
- Java程序設(shè)計:原理與范例
- 軟件品質(zhì)之完美管理:實戰(zhàn)經(jīng)典
- Swift Playgrounds少兒趣編程
- Android移動應(yīng)用項目化教程
- Mastering VMware Horizon 7(Second Edition)
- Mobile Forensics:Advanced Investigative Strategies
- Python預(yù)測分析與機器學(xué)習(xí)
- Clojure for Finance
- 前端架構(gòu)設(shè)計