c語言編譯執行的全過程是怎樣的,C語言編譯執行的全過程是怎樣的?

時間 2021-08-30 11:20:53

1樓:憨人超

不明白樓主什麼意思,就是先把你的**轉為彙編**,然後轉為二進位制檔案,讀入記憶體執行。

2樓:匿名使用者

用編譯原理的話來說呢,分成詞法分析,語法分析,語義分析,中間**生成,**優化,目標**生成這麼幾個階段。

對c語言來說,一般只需要知道分成編譯和連線兩個階段,編譯階段將源程式(*.c)轉換成為目標**(,一般是obj檔案,至於具體過程就是上面說的那些階段),連線階段是把源程式轉換成的目標**(obj檔案)與你程式裡面呼叫的庫函式對應的**連線起來形成對應的可執行檔案(exe檔案)。

3樓:匿名使用者

編譯,編譯程式讀取源程式(字元流),對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編**,再由彙編程式轉換為機器語言,並且按照作業系統對可執行檔案格式的要求連結生成可執行程式。

c源程式標頭檔案-->預編譯處理(cpp)-->編譯程式本身-->優化程式-->彙編程式-->連結程式-->可執行檔案

1.編譯預處理

讀取c源程式,對其中的偽指令(以#開頭的指令)和特殊符號進行處理

偽指令主要包括以下四個方面

(1)巨集定義指 令,如#define name tokenstring,#undef等。對於前一個偽指令,預編譯所要做的是將程式中的所有name用tokenstring替換,但作為字串常量的 name則不被替換。對於後者,則將取消對某個巨集的定義,使以後該串的出現不再被替換。

(2)條件編譯指令,如#ifdef,#ifndef,#else,#elif,#endif,等等。這些偽指令的引入使得程式設計師可以通過定義不同的巨集來決定編譯程式對哪些**進行處理。預編譯程式將根據有關的檔案,將那些不必要的**過濾掉

(3) 標頭檔案包含指令,如#include "filename"或者#include 等。在標頭檔案中一般用偽指令#define定義了大量的巨集(最常見的是字元常量),同時包含有各種外部符號的宣告。採用 標頭檔案的目的主要是為了使某些定義可以供多個不同的c源程式使用。

因為在需要用到這些定義的c源程式中,只需加上一條#include語句即可,而不必再 在此檔案中將這些定義重複一遍。預編譯程式將把標頭檔案中的定義統統都加入到它所產生的輸出檔案中,以供編譯程式對之進行處理。

包含到c源 程式中的標頭檔案可以是系統提供的,這些標頭檔案一般被放在/usr/include目錄下。在程式中#include它們要使用尖括號(< >)。另外開發人員也可以定義自己的標頭檔案,這些檔案一般與c源程式放在同一目錄下,此時在#include中要用雙引號("")。

(4)特殊符號,預編譯程式可以識別一些特殊的符號。例如在源程式中出現的line標識將被解釋為當前行號(十進位制數),file則被解釋為當前被編譯的c源程式的名稱。預編譯程式對於在源程式中出現的這些串將用合適的值進行替換。

預編譯程式所完成的基本上是對源程式的「替代」工作。經過此種替代,生成一個沒有巨集定義、沒有條件編譯指令、沒有特殊符號的輸出檔案。這個檔案的含義同沒有經過預處理的原始檔是相同的,但內容有所不同。

下一步,此輸出檔案將作為編譯程式的輸出而被翻譯成為機器指令。

2.編譯階段

經過預編譯得到的輸出檔案中,將只有常量。如數字、字串、變數的定義,以及c語言的關鍵字,如main,if,else,for,while,, +,-,*,\,等等。預編譯程式所要作得工作就是通過詞法分析和語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間**表示或彙編代 碼。

3.優化階段

優化處理是編譯系統中一項比較艱深的技術。它涉及到的問題不僅同編譯技術本身有關,而且同機器的硬體環境也有很大的關係。優化一部分是對中間**的優化。

這種優化不依賴於具體的計算機。另一種優化則主要針對目標**的生成而進行的。上圖中,我們將優化階段放在編譯程式的後面,這是一種比較籠統的表示。

對於前一種優化,主要的工作是刪除公共表示式、迴圈優化(**外提、強度削弱、變換迴圈控制條件、已知量的合併等)、複寫傳播,以及無用賦值的刪除,等等。

後 一種型別的優化同機器的硬體結構密切相關,最主要的是考慮是如何充分利用機器的各個硬體暫存器存放的有關變數的值,以減少對於記憶體的訪問次數。另外,如何 根據機器硬體執行指令的特點(如流水線、risc、cisc、vliw等)而對指令進行一些調整使目標**比較短,執行的效率比較高,也是一個重要的研究 課題。

經過優化得到的彙編**必須經過彙編程式的彙編轉換成相應的機器指令,方可能被機器執行。

4.彙編過程

彙編過程實際上指把組合語言**翻譯成目標機器指令的過程。對於被翻譯系統處理的每一個c語言源程式,都將最終經過這一處理而得到相應的目標檔案。目標檔案中所存放的也就是與源程式等效的目標的機器語言**。

目標檔案由段組成。通常一個目標檔案中至少有兩個段:

**段 該段中所包含的主要是程式的指令。該段一般是可讀和可執行的,但一般卻不可寫。

資料段 主要存放程式中要用到的各種全域性變數或靜態的資料。一般資料段都是可讀,可寫,可執行的。

unix環境下主要有三種型別的目標檔案:

(1)可重定位檔案 其中包含有適合於其它目標檔案連結來建立一個可執行的或者共享的目標檔案的**和資料。

(2)共享的目標檔案 這種檔案存放了適合於在兩種上下文裡連結的**和資料。第一種事連結程式可把它與其它可重定位檔案及共享的目標檔案一起處理來建立另一個目標檔案;第二種是動態連結程式將它與另一個可執行檔案及其它的共享目標檔案結合到一起,建立一個程序映象。

(3)可執行檔案 它包含了一個可以被作業系統建立一個程序來執行之的檔案。

彙編程式生成的實際上是第一種型別的目標檔案。對於後兩種還需要其他的一些處理方能得到,這個就是連結程式的工作了。

5.連結程式

由彙編程式生成的目標檔案並不能立即就被執行,其中可能還有許多沒有解決的問題。例如,某個原始檔中的函式可能引用了另一個 原始檔中定義的某個符號(如變數或者函式呼叫等);在程式中可能呼叫了某個庫檔案中的函式,等等。所有的這些問題,都需要經連結程式的處理方能得以解決。

連結程式的主要工作就是將有關的目標檔案彼此相連線,也即將在一個檔案中引用的符號同該符號在另外一個檔案中的定義連線起來,使得所有的這些目標檔案成為一個能夠誒作業系統裝入執行的統一整體。

根據開發人員指定的同庫函式的連結方式的不同,連結處理可分為兩種:

(1)靜態連結 在這種連結方式下,函式的**將從其所在地靜態連結庫中被拷貝到最終的可執行程式中。這樣該程式在被執行時這些**將被裝入到該程序的虛擬地址空間中。靜態連結庫實際上是一個目標檔案的集合,其中的每個檔案含有庫中的一個或者一組相關函式的**。

(2) 動態連結 在此種方式下,函式的**被放到稱作是動態連結庫或共享物件的某個目標檔案中。連結程式此時所作的只是在最終的可執行程式中記錄下共享物件的 名字以及其它少量的登記資訊。在此可執行檔案被執行時,動態連結庫的全部內容將被對映到執行時相應程序的虛地址空間。

動態連結程式將根據可執行程式中記錄 的資訊找到相應的函式**。

對於可執行檔案中的函式呼叫,可分別採用動態連結或靜態連結的方法。使用動態連結能夠使最終的可執行檔案比較 短小,並且當共享物件被多個程序使用時能節約一些記憶體,因為在記憶體中只需要儲存一份此共享物件的**。但並不是使用動態連結就一定比使用靜態連結要優越。

在某些情況下動態連結可能帶來一些效能上損害。

c語言編寫好**後,怎麼編譯,最後生成可執行檔案?

4樓:南京西潤學堂

c語言bai最終想執行,必須轉為du彙編,再由彙編轉為機zhi器碼dao,也就是所謂的01之類的。

所以想執行,要使內用編譯器,把寫好的____c_代_碼_翻_譯_為_匯_編____,再到機器碼。

一樣的c語言,想在不同的平臺上使用(x86、arm、mips等),所對應的機器碼也不同。所容以編譯器也不一樣,常用的編譯器有gcc、vs等。

ps:系統讓返回修改

5樓:晨曦月殤

c語言編寫好**後,怎麼編譯,用vc++編譯器,學習怎

麼用這個軟體建立工程,

6樓:stop桀

左一按鈕編譯,左二生成可執行檔案,!執行

7樓:江城子

編譯器都有編譯的功能啊,會自動生成exe檔案

8樓:匿名使用者

直接下個codeblocks就ok啦

c語言中一個程式寫完後怎麼執行啊?

9樓:匿名使用者

c,語言中一個程式講完後怎麼執行?這個程式是在程式寫完之後可以完整的去執行的

10樓:千鋒教育

如果是在tc2.0中:就copy按ctrl+f9編譯、連結,按alt+f5看結果;

如果在vc6.0中:按ctrl+f7編譯、再f7連結,ctrl+f5看結果。

c語言是一門通用計算機程式語言,應用廣泛。c語言的設計目標是提供一種能以簡易的方式編譯、處理低階儲存器、產生少量的機器碼以及不需要任何執行環境支援便能執行的程式語言。

11樓:匿名使用者

檢驗錯誤,

bai編譯,再連線,生成了exe檔案du,zhi就可以執行

了。按ctrl+f9就可以了,這dao時程式會執行內一次。如果你想隨容時執行這個程式,找到它所在的資料夾,雙擊即可。

但是可能看不到結果,因為它是dos介面的,執行完就退出來了。你可以先進到dos介面:開始--所有程式--附件--命令提示符。

這樣要輸入路徑和檔名才可以執行,不太方便。

12樓:匿名使用者

除錯可以用f9,能檢查出錯誤。

執行ctrl+f9,能看執行結果

f7單步除錯

f8跳過函式單步除錯(不單版步執行子權函式內**,直接到主函式下一步)

alt+c可以調出編譯下拉選單,compile to obj產生obj檔案

make exe file 產生exe檔案link exe file 連線

13樓:利德

要看你用的什麼程式設計環境,是tc,還是vc還是什麼

結婚全過程,婚禮當天的全過程 詳細的

4.婚禮當天流程。化妝。婚車 攝影 攝像到達時間最後確認。車輛安排。迎新娘。到新娘家。新郎準備好鮮花 紅包。出門前告知新娘。抵達前10分鐘告知迎親爆竹準備進門前新娘親友提問阻撓 可有可無 塞紅包吧新娘提問 新郎承諾。新郎給女方父母敬茶 合影。桂圓 蓮心 紅棗 水浦蛋 湯 視習俗 出門前新娘向父母告別...

燒麥的做法全過程是?燒麥的做法全過程是什麼?

燒賣的做法基本上和包子是差不多的。此時製作的方式和手法上尚有不同。燒麥的配料和製作過程 傳統燒麥的做法。用料 水餃皮適量 糯米適量 香菇適量 紅蘿蔔適量 鮮筍適量 香蔥適量 料酒少許 生抽少許 鹽少許 雞精少許 胡椒少許 豬肉適量 青豆少許 香油少許。做法 1.將香菇 紅蘿蔔和鮮筍洗淨,然後切成小丁...

葫蘆種植的全過程有圖,葫蘆種植的全過程有圖。

種植葫蘆全過程圖 葫蘆的種植全過程有圖。 播種出苗 小苗苗慢慢長大 開始開花 見果 葫蘆長大了 葫蘆的生長過程 要具體的記錄 素顏以對 葫蘆的生育週期大致可分為發芽期 幼苗期 初花期和結瓜期4個時期。不同時期有不同的生長髮育特性。發芽期從種子萌動到第一片真葉出現為發芽期。在溫度 水分等適宜條件下,約...