這篇文章主要介紹“計(jì)算機(jī)系統(tǒng)源程序編譯的方法是什么”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“計(jì)算機(jī)系統(tǒng)源程序編譯的方法是什么”文章能幫助大家解決問(wèn)題。
創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)全網(wǎng)營(yíng)銷(xiāo)推廣、網(wǎng)站重做改版、巴彥淖爾網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5建站、商城開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為巴彥淖爾等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。對(duì)于程序員來(lái)說(shuō),HelloWorld 程序再熟悉不過(guò)了,下面是 C 語(yǔ)言寫(xiě)的 HelloWorld 程序。
#include
int main()
{
printf("hello, world\n");
return 0;
}
這段程序很簡(jiǎn)單,僅僅是在屏幕上輸出hello world
,對(duì)于程序員很容易閱讀,但是從計(jì)算機(jī)的角度來(lái)看,也是這么簡(jiǎn)單嗎?
我們都知道,計(jì)算機(jī)的世界只有 0 和 1組成的位(比特),這對(duì)于人類(lèi)來(lái)說(shuō)太不友好了,因此計(jì)算機(jī)科學(xué)家們?cè)O(shè)計(jì)了 ASCⅡ 碼來(lái)表示現(xiàn)實(shí)世界的符號(hào)。每 8 個(gè)位構(gòu)成一個(gè)組(稱(chēng)為一個(gè)字節(jié)),用一個(gè)組來(lái)表示一個(gè)符號(hào),上面的 C 程序用 ASCⅡ 表示就是下面的樣式。
因此對(duì)于計(jì)算機(jī)來(lái)說(shuō),所有的數(shù)據(jù)都是由一串比特表示的,要區(qū)分這些數(shù)據(jù)對(duì)象的唯一方法就是讀到它們時(shí)的上下文。
信息 = 位 + 上下文
雖然我們把 C 語(yǔ)言程序編寫(xiě)完成了,但是它并不能運(yùn)行,因?yàn)樗壳斑€僅僅是由 ASCⅡ 字符構(gòu)成的文本文件,計(jì)算機(jī)并不能運(yùn)行文本文件。
想要得到 HelloWorld 的可執(zhí)行文件,需要經(jīng)過(guò)預(yù)處理、編譯、匯編、鏈接四個(gè)階段。
預(yù)處理階段,預(yù)處理器會(huì)根據(jù)以字符#
開(kāi)頭的命令去修改源程序,預(yù)處理器去讀取系統(tǒng)頭文件stdio.h
中的內(nèi)容,并將其直接插入程序文本中,結(jié)果就得到了另一個(gè) C 程序—— hello.i。
編譯階段,編譯器會(huì)把 hello.i 程序翻譯成匯編語(yǔ)言程序 hello.s,匯編語(yǔ)言本質(zhì)上就是機(jī)器語(yǔ)言,此時(shí)的程序仍然是文本文件。
匯編階段,匯編器會(huì)將 hello.s 翻譯成機(jī)器語(yǔ)言指令,保存在 hello.o 文件中,此時(shí)得到的就是二進(jìn)制文件了。
程序中使用了 printf 函數(shù),這是由編譯器提供的標(biāo)準(zhǔn) C 庫(kù)中的函數(shù),它存儲(chǔ)在 printf.o 文件中,鏈接器會(huì)將這個(gè)文件合并到 hello.o 中,結(jié)果就得到一個(gè)可執(zhí)行的 hello 文件,存儲(chǔ)于磁盤(pán)中。
在運(yùn)行可執(zhí)行文件 hello 文件之前,應(yīng)該先了解一下系統(tǒng)的硬件組成,一個(gè)典型系統(tǒng)的硬件組織如下圖所示。
為了運(yùn)行 hello 程序,我們需要在 shell 中輸入指令./hello
,指令通過(guò)鍵盤(pán)經(jīng) I/O 總線 --> I/O 橋 --> 總線接口 --> 寄存器 --> I/O 橋存于主存中,當(dāng)敲擊回車(chē)鍵時(shí),等于告訴 shell 程序,命令的屬于已經(jīng)結(jié)束, shell 將會(huì)執(zhí)行一系列指令來(lái)加載 hello 文件。
利用直接存?。―MA)技術(shù),hello 文件不需要通過(guò)寄存器就能到達(dá)主存,當(dāng)目標(biāo)文件 hello 到達(dá)主存中,處理器就開(kāi)始執(zhí)行 hello 程序的機(jī)器指令。其指令即將 "hello, world\n" 字符串的字節(jié)從主存復(fù)制到寄存器,再?gòu)募拇嫫鲝?fù)制到顯示設(shè)備中,最終顯示在屏幕上面。
我們發(fā)現(xiàn)這個(gè)簡(jiǎn)單的 HelloWorld 程序會(huì)讓系統(tǒng)花費(fèi)大量的時(shí)間把信息從一個(gè)地方挪到另一個(gè)地方,而我們都清楚,寄存器、主存、磁盤(pán)之間的訪問(wèn)速度是相互差了好幾個(gè)數(shù)量級(jí)的,而這種復(fù)制的開(kāi)銷(xiāo)會(huì)嚴(yán)重減慢程序的運(yùn)行,為了加快這些復(fù)制操作的速度,系統(tǒng)設(shè)計(jì)者就引入了高速緩存。
計(jì)算機(jī)科學(xué)中最為重要的概念之一就是抽象,指令集提供了對(duì)硬件處理器的抽象,操作系統(tǒng)同樣通過(guò)進(jìn)程、虛擬內(nèi)存、文件(磁盤(pán)、鍵盤(pán)、網(wǎng)絡(luò)都可以看成文件)這幾個(gè)抽象概念為應(yīng)用程序提供簡(jiǎn)單一致的機(jī)制來(lái)控制低級(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)程看起來(lái)都好像在獨(dú)占的使用硬件,CPU 看上去是在并發(fā)的執(zhí)行多個(gè)進(jìn)程,這就需要操作系統(tǒng)進(jìn)行上下文切換。
在我們還沒(méi)有輸入./hello
之前,只有 shell 進(jìn)程在運(yùn)行,當(dāng)我們讓其運(yùn)行 hello 程序時(shí),shell 會(huì)通過(guò)系統(tǒng)調(diào)用來(lái)執(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)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。