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