乙個程式的執行過程

2021-08-09 16:11:26 字數 1744 閱讀 4714

1.資訊在計算機的中表示

我們知道,資訊在計算機中都是用0或

1表示的。計算機通過這些位資訊以及上下文來解讀這些

0/1。也即:計算機中的資訊=位+

上下文。

我們輸入的hello程式就是由0、1組成的序列,將這些位8位組織成乙個位元組,每個位元組用來表示乙個文字字元。ascii碼給出了一種字元與數字的一一對應關係。

hello, world程式以位元組方式存放於檔案中,如下圖所示。其每個字元對應乙個數字,具體可參考ascii碼表。

圖1 hello world

程式的ascii

碼表示

2.將程式翻譯成機器可讀的格式

因為我們輸入的hello, world程式是人可讀的,機器並不能直接識別它們。我們需要把這些文字翻譯成機器可執行的二進位制檔案。這一部分的工作是由編譯系統完成的。編譯系統由預處理器、編譯器、彙編器、聯結器四部分組成。以hello, world程式為例,各部分共同完成將原始檔編譯成二進位制可執行檔案。

預編譯:主要處理源**中的預處理指令,引入標頭檔案,去除注釋,處理所有的條件編譯指令,巨集的替換,新增行號,保留所有的編譯器指令。

gcc -e main.c -o main.i

編譯:編譯過程所進行的是對預處理後的檔案進行語法分析,詞法分析,語義分析,符號彙總,然後生成彙編**。

gcc –s main.i -o main.s

彙編:這裡的彙編所說的是乙個過程,將彙編**轉成二進位制檔案,二進位制檔案就可以讓機器來讀取。每一條彙編語句都會產生一句機器語言。

gcc -c main.s -o main.o

鏈結:將目標檔案、啟動**、庫檔案鏈結成可執行檔案的過程,這個檔案可被載入或拷貝到儲存器執行。

連線處理可以分為兩種:

鏈結器將函式的**從其所在地(目標檔案或靜態鏈結庫中)拷貝到最終的可執行程式中。這樣該程式在被執行時這些**將被裝入到該程序的虛擬位址空間中。靜態鏈結庫實際上是乙個目標檔案的集合,其中的每個檔案含有庫中的乙個或者一組相關函式的**。

為建立可執行檔案,鏈結器必須要完成的主要任務:

符號解析:把目標檔案中符號的定義和引用聯絡起來;

重定位:把符號定義和記憶體位址對應起來,然後修改所有對符號的引用。

②動態鏈結(載入執行時):在此種方式下,函式的定義在動態鏈結庫或共享物件的目標檔案中。

在編譯的鏈結階段,動態鏈結庫只提供符號表和其他少量資訊用於保證所有符號引用都有定義,保證編譯順利通過。動態鏈結器(ld-linux.so)鏈結程式在執行過程中根據記錄的共享物件的符號定義來動態載入共享庫,然後完成重定位。

在此可執行檔案被執行時,動態鏈結庫的全部內容將被對映到執行時相應程序的虛位址空間。動態鏈結程式將根據可執行程式中記錄的資訊找到相應的函式**

gcc -o main main.o

3.處理器讀取並解釋儲存在儲存器中的指令

shell:命令列直譯器,為使用者提供了乙隻與系統打交道的方式。它等待使用者的輸入,當使用者輸入一行命令後,shell先判斷它是不是乙個shell內建命令,如果不是,shell會假定使用者輸入為乙個可執行檔案的名字,從而去載入並執行該檔案。因此,當我們通過編譯系統將原始檔編譯成可執行二進位制檔案後,在shell中輸入我們得到的可執行二進位制檔名,shell將其從磁碟中載入到儲存器(注:我們的可執行檔案是存放在磁碟上的),並通過處理器進行解釋執行,得到最終的結果,輸出到終端(顯示器)上進行顯示。自此,我們的hello, world程式完成了其生命週期。

詳解乙個程式的執行過程

2.預處理器 主要負責文字的替換 巨集展開 刪除注釋等一些簡單的工作,經過預處理後得到的才是真正的原始碼 3.編譯器 檢查 分析我們所寫的 是否符合程式語言的規範 如果你所寫的 符合要求,那麼編譯器就會將原始檔之中的 轉換為彙編 一般不特指的話,可以將編譯器理解為預處理器 編譯器 彙編器的組合 4....

乙個C 程式的執行過程

可能很多人都知道我們把程式打包成dll就丟出去了,但是裡面的具體的執行過程是怎麼樣的呢。程式集是由元資料和il組成的。il是和cpu無關的語言,是微軟的幾個專家請教了外面的編譯器的作則,開發出來的。il比大多數機器語言都要高階一點。il能夠訪問和操作物件型別,並提高了指令來初始化物件,呼叫物件上的虛...

乙個簡單程式的建立與執行過程

在windows下建立乙個簡單程式的過程大概是這樣幾步 1.編寫源 一般是在像vs這樣的整合開發環境中,但也可以在乙個文字檔案中直接敲 2.編譯源 就是把你能認識的 轉化成機器能認識的010這樣的 一般是一成乙個obj目標檔案.實嚴格來說這一步是包括編譯和彙編兩步.先是編譯成組合語言,然後再用彙編器...