1. 程式人生 > >計算機原理之程式是怎麼執行的

計算機原理之程式是怎麼執行的

計算機的組成

      計算機是由硬體和軟體組成的,這兩個部分共同協作完成程式的執行。這兩部分如何協作完成程式的執行,是本系列的重點。

 

資訊的表示

      資訊的表示說到底就是位加上下文。舉個小例子,比如11011101這一串二進位制,在表示整數的時候它表示221,但是如果放在JAVA的class檔案當中,它可能代表一個JVM的指令

 

程式的編譯

      對於一個簡單的C語言程式來說,一般要經過前處理器、編譯器、

彙編器和連結器的處理,才能被翻譯成一段可執行的二進位制檔案。

      比如對於一個簡單的C語言程式,如下。

#include <stdio.h>int main()
{
     printf("hello,world\n");    
}

      我們儲存在hello.c當中,那麼它的翻譯過程如下。

 

程式的執行 

      程式的執行由直譯器負責,它將逐個解釋最終生成的二進位制

檔案並執行。

 

計算機的硬體組成

      首先,我們來看下計算機中硬體的大致分佈,如下圖。

 

 

 

       其中有幾個非常重要的部分,一一看下都是什麼作用。

      匯流排貫穿整個系統的是一組電子管道(其實就是傳輸資料的線路),也就是匯流排。匯流排傳送的是字,字的大小與系統相關,比如在32位作業系統當中,一個字是4個位元組。

      I/O裝置

I/O裝置是系統與外部聯絡的通道。I/O裝置(鍵盤、滑鼠、顯示器等)由控制器(USB控制器)或者介面卡(圖形介面卡,也就是顯示卡)與I/O匯流排相連,兩者的區別在於一個是主機板上的晶片組,一個是主機板插槽上的卡。

      主存它是計算機中的一個臨時儲存裝置,在處理器執行程式的時候,主存就是臨時存放資料的地方。物理上來說,它是由動態隨即存取儲存器晶片組成,邏輯上來說,它是一組連續的位元組陣列,每一個位元組都有唯一的地址。

      處理器全稱中央處理單元,是解釋儲存在主存中指令的引擎。處理器的核心是一個程式計數器,它在整個計算機執行的期間都會指向一個主存中的一個記憶體地址,而地址當中則是一個計算機指令。處理器所做的,就是不停的執行程式計數器所指向的每一條指令。處理器所做的操作是圍繞主存、暫存器檔案以及算術/邏輯單元進行的,這裡面處理器做的最多的動作就是載入(從主存將資料複製到暫存器)、儲存(從暫存器將資料複製到主存)、操作(將兩個暫存器的內容複製到算術/邏輯單元進行操作,結果會再次複製到暫存器)以及跳轉(改變程式計數器當中的內容)。

       處理器當中提到的是指令集結構,不過實際當中指令集的實現是非常複雜的,這麼做的目的是為了加速CPU的運算速度。我們可以這樣去區分指令集機構以及微體系結構,指令集結構是指令集的抽象描述,而微體系結構則是這個抽象描述的某一個具體實現,類似於JAVA虛擬機器與JAVA虛擬機器實現的關係。

 

總結 :計算機是由軟體與硬體組成的,而硬體又包括了匯流排、I/O裝置、主存以及處理器,其中資訊是由位以及上下文表示的,而資訊則是從I/O裝置以位的形式通過匯流排進入主存,然後由處理器從主存將資訊取出處理。

       一個程式的執行,是經歷了前處理器、編譯器、彙編器以及連結器的處理之後,才最終成為可執行的檔案。當程式成為可執行檔案時就已經儲存在了磁碟上,具體的執行過程在下一章再總結。

 

Hello world的執行

       我們以linux系統為例,當我們執行一個簡單的列印字串的C程式時,我們需要在命令列輸入./hello以及回車去執行該程式。在整個執行過程中,計算機主要做了三件事,或者說經歷了三個階段來完成程式的執行。

 

1、linux的外殼掃描使用者輸入的字元

       當我們在鍵盤輸入./hello時,linux的外殼程式(也就是命令列)會掃描我們輸入的字元,將這些字元一一讀入到暫存器當中,然後再一一放入主存。換句話說,./hello這幾個字元是經過了CPU中的暫存器從而到達了主存。下面LZ將這一過程的圖示畫出來。

 

 

 

 

2、載入hello檔案的程式碼以及資料到主存

       這一過程的觸發是在我們按下回車的那一刻,此時系統會將儲存在磁碟上的hello檔案載入到主存,而此過程會利用一種叫做儲存器存取的技術,使得資料不通過暫存器直接到達主存。下圖是這一過程的圖示。

 

 

 

 

 

3、根據主存中程式碼的指令執行程式

       在程式碼以及程式所需要的資料載入到主存後,CPU就開始從main函式的起始位置,依次執行程式碼中的指令。由於我們的程式碼只是簡單的輸出“hello world”這樣的字串,因此係統只是將這個字串依次載入到暫存器,然後傳輸到顯示器終端顯示。這個過程如下圖。

 

 

 

 

總結 :本章只是簡單的介紹了一下hello程式的執行過程,我們可以簡單的這麼理解,hello程式的執行,其實就是將資料和程式碼載入到主存,並由CPU從主存獲取指令從而執行的過程。

 

原文連結:http://www.cnblogs.com/zuoxiaolong/archive/2013/09/20/computer1.html