系統學習1 C程式的生命週期

2021-08-07 09:22:41 字數 1492 閱讀 7756

通過跟蹤c語言的hello程式來對系統進行學習。

資訊就是位+上下文

# include

int main()

printf("hello,world\n");

return 0;

源程式實際上是0,1組成的位(位元)序列,8個位組成乙個組(位元組),每個位元組表示程式中的某些文字字元。

hello.c程式的ascii碼(ascii標準用來表示文字字元)。實際上就是用唯一的單位元組大小的整數值來表示每個字元。

hello.c是以位元組序列的方式儲存在檔案中,對應的某些字元。就比如c語言的開頭命令# include 比如,35代表『#』,105代表『i』。同時,每個文字行都是以『\n』來結束的。

只有像hello.c的由ascii字元構成的檔案成為文字檔案。其他的都稱為二進位制檔案。

這種方法說明了乙個基本思想:系統中的所有資訊,磁碟檔案,記憶體中程式,記憶體中存放的資料以及網上傳送的資料,都是由一串位元表示。區分不同資料物件的唯一方法是我們讀取資料物件的上下文。不同的上下文,同樣的位元組表示為不同的命令。

每條c語句都必須被其他程式轉換成低階機器語言指令,按照一種稱為可執行目標程式的格式打包,以二進位制磁碟檔案的形式儲存,目標程式稱為可執行目標檔案。

unix系統上,原始檔到目標檔案的轉化是由編譯器驅動程式完成。例如命令gcc -o hello hello.c。這個過程分為四個階段完成,執行這四個階段的程式(預處理器、編譯器、彙編器、鏈結器)一起構成了編譯系統。

預處理階段:預處理器(cpp)根據#開頭的命令,修改原始的c程式,比如# include ,告訴預處理器讀取系統標頭檔案stdio.h的內容,並把它插入到程式文字中,形成.i為字尾的檔案。

編譯器:編譯器(ccl)將hello.i翻譯為hello.s,它包含了乙個組合語言程式。如圖:

用文字格式描述了一條低階機器語言指令。組合語言是不同程式和不同編譯器產生的組合語言,但是許多編譯器產生的組合語言都相同。

彙編階段:彙編器(as)將hello.s翻譯成機器語言指令,把這些指令打包成可重定位目標程式的格式,並把結果儲存在目標檔案hello.o中,hello.o是乙個二進位制檔案,包含的17個位元組是main的指令編碼。

鏈結階段:hello呼叫了printf函式,為每個c編譯器都提供了標準c庫中的乙個函式,比如printf函式就存在於預編譯好了的目標檔案中,這個檔案必須以某種方式合併到hello.o程式中。那麼鏈結器(ld)就是用來搞合併的。結果就得到了hello檔案,他是乙個可執行的目標檔案。可以被載入到記憶體中,由系統執行。

作業系統學習筆記 程序生命週期

程序管理中最基本功能是程序控制。程序控制任務 程序的建立 終止 程序狀態的轉變等。程序控制一般由os核心來實現。程序圖 樹狀結構 描述的是程序家族之間的關係,任何乙個程序可以產生它的子程序。子孫程序可以繼承父程序的資源,比如父程序擁有的資料 緩衝區 檔案。當子孫程序結束的時候,將資源歸還的父程序。引...

iOS 程式的生命週期

程式將要啟動 2.didfinishlaunchingwithoptions 程式第一次啟動時執行,如果直接啟動,launchoptions是沒有資料的,如果由其它應用啟動,launchoptions是包含資料的 應用進入後台,登出程式的啟用狀態,執行以下幾個任務 暫停正在執行的任務 禁止計時器 減...

Windows程式的生命週期

幾年前曾經看過侯俊傑老師的 mfc深入淺出 覺得這本書對mfc的講解比較深入,由淺入深,對c 的基礎 windows程式的基礎 mfc的原理等講的都比較好。通過幾年的工作學習,我對mfc的理解也有了進一步的提高,想再去看一遍這本書,最近看了第一章,就想寫點東西來增加自己的理解,也順便開始我的部落格之...