『壹』 調試時,對C語言源程序進行編譯的目的是什麼
建議看看編譯原理。
我們的PC機,只能認識機器碼,不認識C語言的。編譯,就是讓C語言變得讓機器認識。
編譯過程,一般是:
C語言-->匯編語言-->2進制文件。
2進制文件由操作系統裝載,並調度運行。
『貳』 執行C語言一定要先編譯么,不可以直接執行么
一般來說編譯過後就成了基本上能執行的2進制代碼。但是這些2進制代碼並不完善,一個程序往往需要調用不止一部分的代碼,所以需要把這些代碼全部整合起來才能執行。
即時你的程序看起來只有一個文件,但是編譯過後,多多少少裡面至少會調用到一些操作系統功能,和其它的一些設置,所以依然需要組建這個過程把這個程序和這些系統默認的代碼組建起來形成一個完成、單一的可執行文件。所以一般組建過程就包含了組建內部和外部代碼,一般來說內部代碼就是我說的系統預留的必要的一些代碼(例如怎麼具體完成把一些字元顯示在屏幕上呀這些功能),而外部代碼就是額外的調用自己寫得或者別人寫得其它程序功能(往往當你的程序調用了非c標准函數的時候)。
所以就算你的代碼可以編譯,但是可能因為組建並不成功(例如需要組建的代碼本身有bug,或者丟失,或者版本不匹配),你的程序依然可能無法正確運行。
『叄』 為什麼要編譯
在匯編語言之後,上世紀50年代,科學家有發明了好幾種用人類語言書寫程序的方法,被稱為計算機高級語言。如PASCAL語言、BASIC語言、C語言等。高級語言源程序都可以用記事本(Notepad)打開和編輯。高級語言源程序也要經過翻譯才能被計算機接受。把高級語言翻譯成機器語言的方法大體有兩種,一種被稱作「解釋」,如GWBASIC、BASIC、QBASIC等語言,這種方式下,源程序被翻譯出一個完整的操作步驟,計算機就作出相應反應,執行一步,再翻譯再執行,逐步達到源程序制定目標。另一種方式被稱作「編譯」,如PASCAL語言和C語言等,這種方式下,計算機把源程序全部翻譯成它自身能讀懂的、被稱作目標程序的機器語言程序,然後再一次執行。二者的區別在於編譯程序能產生目標程序而解釋程序則不能產生目標程序。用高級程序設計語言編寫的程序,要轉換成等價的可執行程序,必須經過編譯和連接。同樣一段高級語言程序通過不同的編譯器可能產生不同的可執行程序。計算機不能直接執行符號化的程序,而是通過匯編程序、解釋程序和編譯程序而將符號程序轉換為可執行程序。高級語言需要編譯成目標代碼或通過解釋器解釋後才能被CPU執行。
『肆』 為什麼c/c++開源庫使用前需要編譯
這樣可以運行,但有兩個問題:
每個新程序要使用開源庫中的api,都需要重新編譯部分甚至整個開源庫源代碼,這會浪費大量的時間;
如果有多個程序同時使用同一個庫,每個程序都將生成一份這個庫的二進制文件,這會浪費大量的磁碟空間;當這些程序同時運行時,每個程序的內存中都會裝載一份庫的二進制代碼,這會浪費大量的內存空間。
因此,直接將第三方庫的源代碼包含到當前程序的代碼中編譯是效率非常低下的方式,實際中除非極特殊情況,不會考慮使用這種方式,而是將開源庫源代碼編譯成二進制的動態鏈接庫,其他程序要使用其中的API時,只需要指定動態鏈接庫的入口點,程序運行時載入動態鏈接庫 並找到其中的函數入口點就可以調用開源庫API。並且,當有多個程序調用此動態鏈接庫時,只會佔用一份內存空間。
『伍』 C語言編譯原理是什麼
編譯共分為四個階段:預處理階段、編譯階段、匯編階段、鏈接階段。
1、預處理階段:
主要工作是將頭文件插入到所寫的代碼中,生成擴展名為「.i」的文件替換原來的擴展名為「.c」的文件,但是原來的文件仍然保留,只是執行過程中的實際文件發生了改變。(這里所說的替換並不是指原來的文件被刪除)
2、匯編階段:
插入匯編語言程序,將代碼翻譯成匯編語言。編譯器首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後,編譯器把代碼翻譯成匯編語言,同時將擴展名為「.i」的文件翻譯成擴展名為「.s」的文件。
3、編譯階段:
將匯編語言翻譯成機器語言指令,並將指令打包封存成可重定位目標程序的格式,將擴展名為「.s」的文件翻譯成擴展名為「.o」的二進制文件。
4、鏈接階段:
在示例代碼中,改代碼文件調用了標准庫中printf函數。而printf函數的實際存儲位置是一個單獨編譯的目標文件(編譯的結果也是擴展名為「.o」的文件),所以此時主函數調用的時候,需要將該文件(即printf函數所在的編譯文件)與hello world文件整合到一起,此時鏈接器就可以大顯神通了,將兩個文件合並後生成一個可執行目標文件。
『陸』 c語言中的源程序必須經過編譯連接生成可執行程序才能運行,這句話是對不對
哥們,這么理解是對的,不過感覺有點表面。
建議看看計算機一些原理,像你說的這個問題我會想到,計算機最終只能識別二進制碼,
所以其實不管我們一切啥語言,最終都是通過編譯器編譯成二進制碼,計算機才能識別
而去運行,而c語言編寫的程序,肯定是要經過一系列的編譯,鏈接,生成可執行的文件。
在windows系統中,執行文件都是.exe為擴展名的。不過在linux系統中就不一樣了,linux
系統並不區分擴展名,所以也就無所謂什麼.exe之類的文件,只要知道最終生成可執行的
二進制文件就可以了。
『柒』 c程序寫好要編譯和綜合是啥意思
書寫出來的是源程序,也就是.c和.h文件。 肉眼可讀。
最終運行的是可執行文件,也就是二進制文件。 windows上是.exe文件。
從源文件到可執行文件要經過編譯和鏈接,你說的綜合應該就是鏈接。
編譯是每個.c文件編譯成對應的目標文件(.o, .obj, .tco這類的,不同工具擴展名有所不同)
鏈接是把這些目標文件整合成可執行文件。
『捌』 C語言為什麼要先編譯成匯編語言
C語言,具有可移植性,或者說同樣的代碼可以在不同cpu平台上運行得到同樣的結果
匯編語言,移植性差,一般針對某型cpu,每個類型的cpu都有自己的匯編語言
為保證C語言編制的通用演算法的可移植性,比如我們用C編寫了一套mp3解碼演算法程序,要在pc機上、手機上都能用,那麼我們就採用通用的C編譯器,將C語言程序編譯成指定CPU的匯編語言,再匯編成機器可執行程序。
另一個用途是程序優化問題,在C語言層次,由於是高級語言,不涉及底層硬體,那麼底層硬體的特性不能夠得到充分利用,在需要優化演算法的場合,我們需要將C語言演算法編譯生成匯編程序,然後修改需要優化的匯編程序達到目的。比如,你在手機上經常會遇到音頻解碼器,需要安裝,而且不同的cpu需要選擇不同的解碼器,這些解碼器應當就是在匯編層次上優化了演算法的可執行代碼,關鍵部分經過匯編級優化,不需要優化部分仍然使用C語言編譯的結果。
『玖』 用C語言編的程序,要生成可執行文件的時候,要編譯、鏈接,編譯是什麼意思啊鏈接是什麼意思編譯和鏈接
編譯就是把C代碼轉換成CPU可執行的機器指令,每個.c文件生成一個.obj文件。
鏈接就是把生成的(多個) .obj 文件及用到的庫文件(.lib)一起組合生成可執行文件(.exe)。
『拾』 c語言為何需要編譯和連接才能運行
的文件(也稱為源代碼)而已,需要經過1定的處理才能轉換成機器上可運行的可履行文件。
我們將對C語言的這類處理進程稱為編譯與鏈接。