您好,登錄后才能下訂單哦!
這篇文章主要介紹“計(jì)算機(jī)系統(tǒng)源程序編譯的方法是什么”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“計(jì)算機(jī)系統(tǒng)源程序編譯的方法是什么”文章能幫助大家解決問題。
對(duì)于程序員來說,HelloWorld 程序再熟悉不過了,下面是 C 語言寫的 HelloWorld 程序。
#include<stdio.h>
int main()
{
printf("hello, world\n");
return 0;
}
這段程序很簡單,僅僅是在屏幕上輸出hello world
,對(duì)于程序員很容易閱讀,但是從計(jì)算機(jī)的角度來看,也是這么簡單嗎?
我們都知道,計(jì)算機(jī)的世界只有 0 和 1組成的位(比特),這對(duì)于人類來說太不友好了,因此計(jì)算機(jī)科學(xué)家們?cè)O(shè)計(jì)了 ASCⅡ 碼來表示現(xiàn)實(shí)世界的符號(hào)。每 8 個(gè)位構(gòu)成一個(gè)組(稱為一個(gè)字節(jié)),用一個(gè)組來表示一個(gè)符號(hào),上面的 C 程序用 ASCⅡ 表示就是下面的樣式。
因此對(duì)于計(jì)算機(jī)來說,所有的數(shù)據(jù)都是由一串比特表示的,要區(qū)分這些數(shù)據(jù)對(duì)象的唯一方法就是讀到它們時(shí)的上下文。
信息 = 位 + 上下文
雖然我們把 C 語言程序編寫完成了,但是它并不能運(yùn)行,因?yàn)樗壳斑€僅僅是由 ASCⅡ 字符構(gòu)成的文本文件,計(jì)算機(jī)并不能運(yùn)行文本文件。
想要得到 HelloWorld 的可執(zhí)行文件,需要經(jīng)過預(yù)處理、編譯、匯編、鏈接四個(gè)階段。
預(yù)處理階段,預(yù)處理器會(huì)根據(jù)以字符#
開頭的命令去修改源程序,預(yù)處理器去讀取系統(tǒng)頭文件stdio.h
中的內(nèi)容,并將其直接插入程序文本中,結(jié)果就得到了另一個(gè) C 程序—— hello.i。
編譯階段,編譯器會(huì)把 hello.i 程序翻譯成匯編語言程序 hello.s,匯編語言本質(zhì)上就是機(jī)器語言,此時(shí)的程序仍然是文本文件。
匯編階段,匯編器會(huì)將 hello.s 翻譯成機(jī)器語言指令,保存在 hello.o 文件中,此時(shí)得到的就是二進(jìn)制文件了。
程序中使用了 printf 函數(shù),這是由編譯器提供的標(biāo)準(zhǔn) C 庫中的函數(shù),它存儲(chǔ)在 printf.o 文件中,鏈接器會(huì)將這個(gè)文件合并到 hello.o 中,結(jié)果就得到一個(gè)可執(zhí)行的 hello 文件,存儲(chǔ)于磁盤中。
在運(yùn)行可執(zhí)行文件 hello 文件之前,應(yīng)該先了解一下系統(tǒng)的硬件組成,一個(gè)典型系統(tǒng)的硬件組織如下圖所示。
為了運(yùn)行 hello 程序,我們需要在 shell 中輸入指令./hello
,指令通過鍵盤經(jīng) I/O 總線 --> I/O 橋 --> 總線接口 --> 寄存器 --> I/O 橋存于主存中,當(dāng)敲擊回車鍵時(shí),等于告訴 shell 程序,命令的屬于已經(jīng)結(jié)束, shell 將會(huì)執(zhí)行一系列指令來加載 hello 文件。
利用直接存取(DMA)技術(shù),hello 文件不需要通過寄存器就能到達(dá)主存,當(dāng)目標(biāo)文件 hello 到達(dá)主存中,處理器就開始執(zhí)行 hello 程序的機(jī)器指令。其指令即將 "hello, world\n" 字符串的字節(jié)從主存復(fù)制到寄存器,再從寄存器復(fù)制到顯示設(shè)備中,最終顯示在屏幕上面。
我們發(fā)現(xiàn)這個(gè)簡單的 HelloWorld 程序會(huì)讓系統(tǒng)花費(fèi)大量的時(shí)間把信息從一個(gè)地方挪到另一個(gè)地方,而我們都清楚,寄存器、主存、磁盤之間的訪問速度是相互差了好幾個(gè)數(shù)量級(jí)的,而這種復(fù)制的開銷會(huì)嚴(yán)重減慢程序的運(yùn)行,為了加快這些復(fù)制操作的速度,系統(tǒng)設(shè)計(jì)者就引入了高速緩存。
計(jì)算機(jī)科學(xué)中最為重要的概念之一就是抽象,指令集提供了對(duì)硬件處理器的抽象,操作系統(tǒng)同樣通過進(jìn)程、虛擬內(nèi)存、文件(磁盤、鍵盤、網(wǎng)絡(luò)都可以看成文件)這幾個(gè)抽象概念為應(yīng)用程序提供簡單一致的機(jī)制來控制低級(jí)硬件設(shè)備,同時(shí)防止硬件被失控的應(yīng)用程序?yàn)E用。
進(jìn)程是對(duì)正在運(yùn)行的程序的抽象,在一個(gè)系統(tǒng)上可以同時(shí)運(yùn)行多個(gè)進(jìn)程,但是每個(gè)進(jìn)程看起來都好像在獨(dú)占的使用硬件,CPU 看上去是在并發(fā)的執(zhí)行多個(gè)進(jìn)程,這就需要操作系統(tǒng)進(jìn)行上下文切換。
在我們還沒有輸入./hello
之前,只有 shell 進(jìn)程在運(yùn)行,當(dāng)我們讓其運(yùn)行 hello 程序時(shí),shell 會(huì)通過系統(tǒng)調(diào)用來執(zhí)行我們的請(qǐng)求。操作系統(tǒng)首先保存 shell 進(jìn)程的上下文(PC、寄存器等信息),然后創(chuàng)建一個(gè)新的 hello 進(jìn)程,并將控制權(quán)轉(zhuǎn)交給 hello 進(jìn)程。
關(guān)于“計(jì)算機(jī)系統(tǒng)源程序編譯的方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。