編譯預處理是特指什麼過程
編譯,編譯程序讀取源程序(字元流),對之進行詞法和語法的分析,將高級語言指令轉換為功能等效的匯編代碼,再由匯編程序轉換為機器語言,並且按照操作系統對可執行文件格式的要求鏈接生成可執行程序。
如果用一張圖來表示:
讀取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源程序的名稱。預編譯程序對於在源程序中出現的這些串將用合適的值進行替換。
注意:
預編譯程序所完成的基本上是對源程序的「替代」工作。經過此種替代,生成一個沒有宏定義、沒有條件編譯指令、沒有特殊符號的輸出文件。這個文件的含義同沒有經過預處理的源文件是相同的,但內容有所不同。下一步,此輸出文件將作為編譯程序的輸出而被翻譯成為機器指令。
『貳』 C語言文件的編譯與執行的四個階段並分別描述
C語言程序的執行經歷了四個主要階段:預處理、編譯、鏈接和運行。以下是這四個階段的詳細描述:
1. **預處理階段**:
在這個階段,C語言源代碼被預處理器(C Preprocessor, CPP)處理。預處理器會處理所有包含的文件指令(如#include),展開宏定義(如#define),並處理條件編譯指令(如#ifdef、#ifndef)。預處理後的結果被保存為擴展名為.i的文件。
2. **編譯階段**:
編譯器接下來對預處理後的.i文件進行編譯。編譯過程包括詞法分析(識別源代碼中的單詞和符號)、語法分析(檢查單詞和符號的組合是否符合C語言的語法規則)、語義分析(確保代碼有意義,比如變數使用前已經定義)以及代碼優化。編譯的最終產物是一個或多個擴展名為.s的匯編語言文件,以及一個.o的目標文件,該文件包含了可以被計算機處理器直接執行的指令。
3. **鏈接階段**:
鏈接器將一個或多個目標文件.o合並成一個可執行文件.exe。在這個過程中,鏈接器還會處理程序中調用的外部函數,確保這些函數在程序運行時可以被找到。如果程序中使用了標准庫函數,鏈接器會連接到這些函數所在的庫文件上。
4. **運行階段**:
最後,可執行文件.exe在計算機上運行。操作系統載入該文件到內存中,並從程序的入口點開始執行指令,直到程序結束或者遇到中斷(如用戶輸入、系統調用等)。
通過這四個階段,C語言源代碼最終被轉換為可以在特定處理器上執行的程序。
『叄』 編譯器是如何運行的
編譯器運行的主要過程包括以下幾個步驟:
源代碼輸入:
編譯器首先接收高級編程語言編寫的源代碼作為輸入。
預處理:
在這一階段,預處理器會對源代碼進行處理,包括宏展開、文件包含、條件編譯等,生成預處理後的代碼。
編譯:
編譯器將預處理後的代碼轉換為匯編代碼或中間表示。這一步是編譯器工作的核心,涉及詞法分析、語法分析、語義分析、中間代碼生成、代碼優化等多個子步驟。
詞法分析:將源代碼轉換為一系列的標記。
語法分析:根據語言的語法規則,將標記序列轉換為抽象語法樹。
語義分析:檢查代碼的語義正確性,並為變數、函數等分配符號表條目。
中間代碼生成:將抽象語法樹轉換為中間表示,便於後續的優化和代碼生成。
代碼優化:對中間表示進行優化,以提高生成的目標代碼的運行效率。
目標代碼生成:
編譯器將優化後的中間表示轉換為目標代碼,這是計算機能直接執行的低級語言代碼。
鏈接:
鏈接器將多個目標代碼文件以及所需的庫文件鏈接在一起,生成最終的可執行程序。
鏈接過程包括符號解析和重定位,確保程序中的函數調用、變數訪問等正確指向相應的地址。
總結: 編譯器是將高級編程語言代碼轉換為計算機能直接執行的機器代碼的程序。 編譯器運行的主要過程包括源代碼輸入、預處理、編譯、目標代碼生成以及鏈接。
『肆』 c語言的編譯過程是什麼
c語言的編譯過程如下:
1、預處理:預處理過程實際上是處理「#」的過程:#include包含的頭文件直接拷貝到hello.c中;#define定義的宏定義進行替換,同時刪除代碼中沒有的注釋部分。2、編譯:編譯的過程實質上是將高級語言翻譯成機器語言的過程。3、匯編:匯編器是將匯編代碼轉變成機器可以執行的命令,每一個匯編語句幾乎都對應一條機器指令。匯編相對於編譯過程比較簡單,根據匯編指令和機器指令的對照表一一翻譯即可。4、鏈接:就像hello.c中使用到了C標准庫的東西「printf」,但是編譯過程只是將源文件翻譯成二進制文件而已,這個二進制文件還不能直接執行,還需要一個動作:將翻譯成的二進制文件與需要用到的庫綁定在一塊。
補充:編譯過程可分為6步:掃描(詞法分析)、語法分析、語義分析、源代碼優化、代碼生成、目標代碼優化。
『伍』 源程序到可執行程序的編譯過程
源代碼到可執行程序的編譯過程涉及四個關鍵步驟:預處理、編譯、匯編和鏈接。
預處理是程序編譯的第一步,由獨立的預編譯器處理,不屬於編譯器的直接工作。它主要負責處理預處理指令,如條件編譯,但並不涉及運行時間。
編譯階段將源代碼轉換成特定硬體平台的匯編語言,比如X86的x86匯編或ARM的ARM匯編,生成.s/.asm文件。這個過程涉及語法、詞法、語義分析等六大部分,以確保變數、函數等的正確使用和錯誤檢測。
編譯過程中,符號表管理至關重要,記錄了標識符及其屬性,如類型、內存佔用和地址,而錯誤管理則用於識別並報告語法錯誤(如拼寫錯誤、括弧匹配問題)和語義錯誤(如類型不匹配、作用域錯誤)。
從源程序到目標程序,可能會進行多次遍歷以優化代碼,但過多遍歷會增加編譯時間。最終,匯編階段將匯編語言轉換為機器語言的可重定位目標文件,如.o/.obj。
鏈接是編譯的最後一步,將目標文件、啟動代碼和庫文件結合,形成可執行的.exe文件。鏈接分為靜態和動態兩種,靜態鏈接時所有庫代碼會直接嵌入程序,而動態鏈接則依賴運行時查找庫。