c语言程序从源代码到二进制机器码,C语言源代码转变为可执行程序的过程
Hello.c
#includeint main()
{
printf("Hello World\0");
return 0;
}
我們在VS下只需要Ctrl+F5便能打印出Hello World,
在Linux下也只需要兩行命令
gcc Hello.c
./a.out
但程序為什么要被編譯器編譯之后才能運行?
因為計算機能夠識別的只有機器語言,機器語言就是由二進制0和1構成。所以為了讓計算機執(zhí)行我們寫的程序,必須翻譯成計算機能夠識別的機器語言程序(目標程序)。
編譯器把C語言程序轉換成可以執(zhí)行的機器碼的過程做了什么?怎么做的?
1.預處理:展開頭文件/宏替換/去掉注釋/條件編譯
2.編譯:檢查語法,生成匯編代碼
3.匯編 :把匯編代碼轉化成二進制的機器碼
4.鏈接 合成可執(zhí)行的程序,并對聲明 在其他目標文件找到對應的定義
Linux環(huán)境下有sum.c和text.c兩個源文件生成可執(zhí)行文件。過程圖解
過程詳解:
預處理過程主要處理那些源代碼文件中的以“#”開始的預編譯指令
將所有的“#define”刪除,并且展開所有的宏定義。
處理所有條件預編譯指令
處理#include預編譯指令,將包含的文件插入到該預編譯指令的位置。(這個過程是遞歸進行的,也就是說被包含的文件可能還包含其他文件)
刪除所有的注釋
添加行號和文件名標識,以便于編譯時編譯器產(chǎn)生的調式用的行號信息及用于編譯時產(chǎn)生編譯錯誤或警告時能夠顯示行號。
保留所有的#pragma編譯器指令,因為編譯器須要使用它們。
編譯:
編譯過程就是把預處理完的文件進行一系列詞法分析、語法分析、語義分析及優(yōu)化后生產(chǎn)相應的匯編代碼文件。
編譯器就是將高級語言翻譯成機器語言的一個工具
編譯過程一般可以分成6步:掃描、語法分析(語法樹)、語義分析、源代碼優(yōu)化、代碼生成和目標代碼優(yōu)化
編譯器所能分析的語義是靜態(tài)語義(即在編譯期可以確定的語義){動態(tài)語義:只有在運行期才能確定的語義。},包括:聲明和類型的匹配,類型的轉換。
匯編:
匯編器是將匯編代碼轉變成機器可以執(zhí)行的指令,每一個匯編語句幾乎對應一條機器指令。
鏈接:
把各個模塊之間相互引用的部分都處理好,使得各個模塊之間能夠正確的銜接。
鏈接過程主要包括地址和空間分配、符號決議和重定位等這些步驟。
重定位所做的就是給程序中每個這樣的絕對地址引用的位置“打補丁”,使它們指向正確的地址。
鏈接的接口--------符號
鏈接過程的本質就是要把多個不同的目標文件之間相互粘到一起。
在鏈接中,目標文件之間相互拼合實際上是目標文件之間對地址的引用,即對函數(shù)和變量的地址的引用
在鏈接中,我們將函數(shù)和變量統(tǒng)稱為符號,函數(shù)名和變量名就是符號名
每一個目標文件都會有一個相應的符號表,這個表里面記錄了目標文件中所用到的所有符號,每個定義的符號有一個對應的值,叫做符號值,對于變量和函數(shù)來說,符號值就是它們的地址、
總結
以上是生活随笔為你收集整理的c语言程序从源代码到二进制机器码,C语言源代码转变为可执行程序的过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可转债数据一览表集思录_可转债股票数据一
- 下一篇: 从编写c语言源程序到运行,c语言 源代码