Hello world程式的生命週期
版權宣告:轉載,請註明出處 https://blog.csdn.net/wmaoshu/article/details/50575142
<span style="font-size:18px;">Hello world程式:
#include <stdio.h>
int main()
{
printf("hello, world\n");
}</span>
Hello world 程式的生命週期包括程式建立和程式執行,程式執行又可以細分為 系統執行、輸出簡單資訊、終止程式。通過編譯系統程式將程式建立的原始檔轉化成程式可執行的可執行目標檔案。
一、程式建立:
Hello world程式的生命週期是從一個源程式(hello.c)開始的,原始檔是由0/1位序列組成,8個位為一個位元組,其中每個位元組(包括換行符,看如下圖就能明白)對應程式中每個文字字元,即ASCII標準。像hello.c這樣,只由ASCII標準字元構成的檔案為文字檔案。其他檔案為二進位制檔案。雖然這些檔案都由0/1串構成,但是由於“上下文”環境的不同,所以,即使相同的0/1串被解釋的意義可能不同。綜上所述,資訊是由位串和“上下文”決定的。
二、編譯系統:
由於程式先是由高階程式語言編寫,但在計算機上執行的只能是低階機器語言指令,為了實現這一步轉化,這就由編譯系統程式來完成,使得從文字檔案轉化成二進位制檔案。 一個編譯系統程式包含前處理器(cpp)、編譯器(ccl)、彙編器(as)、連結器(ld)構成。
前處理器(cpp):根據源程式中#開頭的命令,對源程式做相應的修改,例如:#include <stdio.h>
#後是include <stdio.h>告訴前處理器讀取系統標頭檔案stdio.h中內容,並把它直接插入到程式中形成 hello.i被修改的源程式(文字檔案)。
編譯器(ccl):將高階語言翻譯成組合語言。形成hello.s 彙編程式(文字檔案)
為什麼選擇將高階程式語言編譯成組合語言,而不是別的語言?
一為了統一性,為不同的語言不同的編譯器提供通用的輸出語言。二組合語言就是對低階機器語言的包裝,本身就是低階機器語言。
彙編器(as):把組合語言進而轉化成低階的機器語言 可hello.o重定位的目標程式(二進位制檔案)
此時的檔案中就不再是字元了而是對應的機器語言。
聯結器(ld):將預編譯好的目標檔案(printf.o)合併到可重定位目標檔案中。形成hello可執行的目標檔案(二進位制檔案)。最後可以被載入到記憶體中,由系統執行。
三、程式執行:
初始時,當我們輸入shell命令 ./hello,shell程式將字元逐一讀入暫存器中,再把它放入到儲存器中。
Unix> ./hello(回車)
鍵入回車後,然後利用直接儲存器存取(DMA)技術將可執行的目標檔案中程式碼和資料從磁碟中複製到主存。
當hello檔案載入完成之後,處理器開始從main開始執行這個檔案,執行到printf("hello, world\n");時,將hello, world從主存複製到暫存器檔案,再從暫存器檔案中複製到顯示裝置上。
---------------------
作者:MaoTr
來源:CSDN
原文:https://blog.csdn.net/wmaoshu/article/details/50575142
版權宣告:本文為博主原創文章,轉載請附上博文連結!