C語言既可以編譯執行又可以解釋執行嗎 編譯執行怎麼解釋?解釋執行又怎麼解釋

時間 2021-08-30 10:38:27

1樓:匿名使用者

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

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

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

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

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

2樓:匿名使用者

目前我知道的c語言只能編譯執行,就是先編譯成二進位制的exe檔案才能執行。

指令碼語言才可以解釋執行。

3樓:匿名使用者

c語言程式只能編譯執行,不能解釋執行

編譯執行,是你用c寫的程式**必須經編譯器編譯成作業系統可識別的可執行二進位制檔案才能執行,例如c,c++等

解釋執行,是指無需編譯,直譯器直接讀取原始檔然後解釋執行程式,例如shell,python等語言

4樓:匿名使用者

以前在csdn上有牛人做過解釋執行,其原理就是把手工錄入的**自動通過編譯器進行編譯並執行,不過功能十分有限。

不過現在好像有專門的ide。給你個地址看看

簡要說明程式「編譯執行」與「解釋執行」的區別。

5樓:

編譯執行 是把源程式編譯成 目標碼後 再執行目標碼。例如,c語言程式,必須給出完整程式,編譯器,通過幾次掃描,翻譯,編排,連結,變成 exe 檔案 執行。編譯執行,程式執行時間短,效率高。

解釋執行,並不把整個程式 變成目標碼,而是按順序,讀一句,解釋一句,執行一句,所以,沒給完整程式,它就可以執行了。例如,瀏覽器處理網頁,網頁程式,每下來一句,就可以解釋執行一句,不用等整個網頁下來後再處理。

編譯執行和解釋執行的區別是什麼?

6樓:匿名使用者

就像外語翻譯中的「口譯」一樣,說一句翻一句,不產生全文的翻譯文字。這種工作方式非常適合於人通過終端裝置與計算機會話,如在終端上打一條命令或語句,解釋程式就立即將此語句解釋成一條或幾條指令並提交硬體立即執行且將執行結果反映到終端,從終端把命令打入後,就能立即得到計算結果。這的確是很方便的,很適合於一些小型機的計算問題。

但解釋程式執行速度很慢,例如源程式中出現迴圈,則解釋程式也重複地解釋並提交執行這一組語句,這就造成很大浪費。

b、編譯程式

這是一類很重要的語言處理程式,它把高階語言(如fortran、cobol、pascal、c等)源程式作為輸入,進行翻譯轉換,產生出機器語言的目標程式,然後再讓計算機去執行這個目標程式,得到計算結果。

編譯程式工作時,先分析,後綜合,從而得到目標程式。所謂分析,是指詞法分析和語法分析;所謂綜合是指**優化,儲存分配和**生成。為了完成這些分析綜合任務,編譯程式採用對源程式進行多次掃描的辦法,每次掃描集中完成一項或幾項任務,也有一項任務分散到幾次掃描去完成的。

下面舉一個四遍掃描的例子:第一遍掃描做詞法分析;第二遍掃描做語法分析;第三遍掃描做**優化和儲存分配;第四遍掃描做**生成。

值得一提的是,大多數的編譯程式直接產生機器語言的目標**,形成可執行的目標檔案,但也有的編譯程式則先產生組合語言一級的符號**檔案,然後再呼叫匯程式設計序進行翻譯加工處理,最後產生可執行的機器語言目標檔案。

在實際應用中,對於需要經常使用的有大量計算的大型題目,採用招待速度較快的編譯型的高階語言較好,雖然編譯過程本身較為複雜,但一旦形成目標檔案,以後可多次使用。相反,對於小型題目或計算簡單不太費機時的題目,則多選用解釋型的會話式高階語言,如basic,這樣可以大大縮短程式設計及除錯的時

編譯執行是讀完所有的語句再執行,解釋執行是邊讀語句邊執行,後者花的時間顯然要多,對效率會產生影響,但卻能無形中健壯程式

哪個英語軟體既可以練聽力又可以練口語

筆者認為應從以下幾方面去努力 1 預習。預習既是學習方法問題,也是學習習慣的問題。預習的內容很多,如 課前要預習生詞 課文和語法內容,在自己不懂的地方作上標記,帶著問題有針對性去聽課,課堂上盡力去解決自己不懂的問題,如仍不懂,課後應馬上問老師。2 聽課。聽課是學習過程中最重要的環節,聽課效率高的學生...

既可以美白又可以深度清潔臉部適合混合性面板的洗面奶

想靠洗面奶美白肯定是不可能的 mm你可以想想洗面奶就在臉上停留1 2分鐘,頂多就是起到清潔的作用 美白還是要靠 精華的。給你推薦幾款好用的洗面奶吧,我妹妹再用她是高中生也是混合 的za美白潔面膏 59元 里美蘋果潔面乳29元 泊美的一款潔面乳多少錢我忘記了但是也不錯的還有就是妮維雅的一款美白的潔面乳...

電源兩用式是什麼意思?是既可以充電又可以裝電

小糖魚體育 充電 電源兩用式就是可以充滿電後使用,也可以插著電源使用 跟手機類似 剃鬚刀常見的術語解釋 1 全身水洗 全機可以用水流沖洗清潔,但不能長時間在水中浸泡。短短的幾分鐘不影響產品的使用功能。2 乾溼兩用 在全身水洗的基礎上,可以在刀頭塗上沐浴露 肥皂沫之類的一起剃鬚,效果更好,也更舒適。扭...