日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言程序从源代码到二进制机器码,C语言源代码转变为可执行程序的过程

發(fā)布時間:2023/12/9 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言程序从源代码到二进制机器码,C语言源代码转变为可执行程序的过程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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语言源代码转变为可执行程序的过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。