最佳答案
1. 編譯的不雅點
編譯順序讀取源順序(字元流),對之停止詞法跟語法的分析,將高等言語指令轉換為功能等效的彙編代碼,再由彙編順序轉換為呆板言語,並且按照操縱體系對可履行文件格局的請求鏈接生成可履行順序。
2. 編譯的完全過程
C源順序 > 預編譯處理(.c) > 編譯、優化順序(.s、.asm) > 彙編順序(.obj、.o、.a、.ko) > 鏈接順序(.exe、.elf、.axf等)
2.1 編譯預處理
- 讀取C源順序:預處理器(cpp)起首讀取C源順序,對其停止處理。
- 處理偽指令:偽指令重要包含以下四個方面:
- 宏定義指令:如
#define Name TokenString
,#undef
等。預編譯會將順序中的全部Name用TokenString調換,但作為字元串常量的Name則不被調換。 - 前提編譯指令:如
#ifdef
,#ifndef
,#else
,#elif
,#endif
等。這些指令容許順序員經由過程定義差其余宏來決定編譯順序對哪些代碼停止處理。 - 頭文件包含指令:如
#include "FileName"
或許#include <FileName>
等。頭文件中一般用偽指令#define
定義了大年夜量的宏(最罕見的是字元常量),同時包含有各種外部標記的申明。
- 宏定義指令:如
- 預處理成果:預處理的成果是一個預處理源文件,其擴大名為
.i
。
2.2 編譯
- 編譯器:預處理後的源文件會被編譯器(如gcc)編譯成彙編代碼。
- 轉換過程:編譯器將C言語的高等語句轉換為呆板可能懂得的初級指令。
- 錯誤檢查:編譯器會檢查語法錯誤跟範例檢查,假如發明錯誤,編譯過程會結束,並給犯錯誤提示。
- 輸出文件:編譯後的輸出文件平日以
.s
或.asm
開頭。
2.3 彙編
- 彙編器:彙編器(as)將編譯器產生的彙編代碼轉換為呆板碼,即二進位情勢的目標文件。
- 輸出文件:彙編過程中的輸出文件平日以
.obj
或.o
開頭。
2.4 鏈接
- 鏈接器:鏈接器(ld)將全部須要的目標文件跟庫文件鏈接在一起,生成終極的可履行文件。
- 鏈接過程:鏈接器擔任處理函數挪用跟全局變數的引用,確保順序運轉時能正確找到這些元素。
- 輸出文件:鏈接後的輸出文件平日以
.exe
或.elf
開頭。
3. 運轉順序
- 載入可履行文件:當用戶運轉順序時,操縱體系會將可履行文件載入到內存中。
- 履行代碼:順序在內存中運轉時,會利用打算機的硬體資本,比方CPU、內存、硬碟等。
4. 總結
C言語順序的編譯過程是一個複雜的過程,涉及到多個階段跟東西。經由過程懂得這個過程,我們可能更好地懂得C言語順序的任務道理,並編寫更高效、牢固的順序。