標籤:
一從hello world說起
The only way to learn a new programming language is by writing programs in it.The first program to write is the same for all languages:
Print the words
Hello, world
——《TCPL》
這是TCPL開篇的一句話,那麼作為部落格的開篇,就從這個對於學習所有電腦語言的統一入口——hello world程式說起。
首先是這個程式的C語言實現
#include <studio.h>
int main()
{
printf("hello,world\n");
}
我們按照C語言的要求,將上述內容儲存在名為hello.c的檔案中。這就是——原始碼檔案。
我們知道電腦只能識別0和1這兩種字元,那電腦如何執行我們編寫的程式呢?
對於C語言而言,我們在用文字編輯器編寫程式時,寫下的是字元序列,而序列中的每一個字元,都有一個對應的編碼。以最基本的ASCII編碼來講,上述程式的第一個字元”#”,其二進位表示為00100011,即ASCII碼中的35,用16進位表示為23。按照這種方式,將所有的程式字元,都翻譯一遍,就是如下這個樣子:
如果電腦要執行我們用C語言編寫的源檔案,就需要按照上面的方式,將字元序列轉換為由0和1組成的bit序列。這樣的序列,就是程式員的祖師們所採用的編程方式。
幸好,我們已經有了C這樣的“進階”電腦語言,編寫程式的效率和程式的可讀性,都大大提高。我們現在編寫程式,幾乎無需關心進階語言怎麼轉化為低級語言或者機器語言。那些工作都由“編譯器驅動程式”去處理。那麼C語言編譯驅動程式到底做了哪些工作呢?我們這裡先給出一個大致的步驟:C語言->組合語言->二進位檔案。
二談談電腦的硬體
下面我們談談電腦的硬體:
1主板晶片集:有的主板晶片集分為南橋(SB)和北橋(NB),
北橋主要負責與CPU的聯絡,控制記憶體,有的還提供整合的顯示核心。
南橋主要負責I/O匯流排之間的通訊,如PCI匯流排,USB,LAN,音頻等。
現在的很多主板都沒有北橋了,北橋的記憶體控制功能和整合顯卡功能都由CPU來處理。
2匯流排:匯流排是電腦各個組件之間通訊的線路,他是cpu,記憶體,輸入裝置,輸出裝置傳遞資訊的公用通道,電腦的各種裝置通過介面與匯流排串連,從而可以相互連訊。
3I/O裝置:常見的I/O裝置有:鍵盤,滑鼠,顯示器,硬碟(磁碟機)。
4記憶體:記憶體是由一組DRAM晶片集成的,邏輯上可以看做一個一維位元組數組,每個位元組都有唯一的地址(數組索引),這些地址從0開始,記憶體的容量,即這個數組的索引範圍。
5cpu:cpu是解釋或執行儲存在記憶體中的指令的引擎。它的核心是程式計數器(PC)。
從電腦通電開始,CPU就從程式計數器指向的記憶體位址讀取指令,解釋指令,並按照指令的要求執行簡單操作。然後由算數邏輯單位(ALU)計算新的資料和地址,並更新程式計數器指向下一條指令。重複這個動作,電腦則運轉起來。
三程式與硬體的結合
說完了硬體,我們繼續回來說hello world,我們要執行一個C語言,要先對其進行編譯產生可執行檔,然後通過一個控制台(Shell)中輸入 ./hello,然後點擊斷行符號,這時控制台上會列印出hello world。
我們放慢速度,詳細說一下這個過程都發生了什麼:
1我們通過鍵盤,輸入”./hello”字元
2點擊斷行符號,這是一個不可見的字元,shell在接收到這個字元後,就會將我們輸入的字元,通過匯流排,逐一讀取到寄存器,然後再通過匯流排將字元存放到儲存空間。
3接下來shell會判斷本行輸入的內容,是否是shell中的內建命令,如果是內建命令則按照內建命令來執行;如果不是,就會在硬碟對應的目錄中尋找一個符合名稱的可執行檔。
4在找到檔案後,會通過一系列指令,將硬碟上的這個檔案的代碼和資料拷貝到記憶體中。
5此時,PC會指向這段程式的開始位置的地址,然後CPU讀取程式二進位指令,然後按照指令執行。這些指令將”hello, world\n”從記憶體拷貝到寄存器檔案,然後從寄存器檔案拷貝到顯示裝置(顯示器),這樣我們在螢幕上就能看到列印的字元了。當然,這些字元在電腦實際儲存的是由0和1組成的序列,只是在顯示的時候,通過點陣形成了自然語言的字元的圖形。
由此可見,即使是最基本的hello world程式,要想執行,也會調用電腦的各種硬體裝置。
四儲存的階層
為了提高電腦的效能,在cpu的寄存器和記憶體之間,又增加了“快取”。根據其速度和容量,又分一級緩衝(L1),二級緩衝(L2)以及三級緩衝(L3)。
按照這種儲存空間的分層思想,可以形成如下的金字塔結構。
五作業系統
剛才我們談到,電腦調度各種硬體來實現hello world程式的執行,並不是由應用程式直接控制的,而是通過作業系統來統一控制的。
作業系統有兩個準系統:
1防止硬體被應用程式濫用;
2對硬體的控制,提供簡單一致的方法。
作業系統有如下一些抽象概念:進程,線程,虛擬儲存空間,檔案。
下面逐一做簡單介紹:
進程:是作業系統對運行程式的一種抽象,作業系統儲存進程啟動並執行所有資訊(上下文)。並通過環境切換,實現進程的交錯執行。
線程:進程內部可以包含多個稱為線程的執行單元,線程之間可以更高效的傳遞資訊。
虛擬儲存空間:每個進程都有其可以控制的一塊獨佔的記憶體地區。這塊獨佔的記憶體,就叫虛擬儲存空間,它由這樣幾個區組成。
1程式碼和資料
2運行時堆
3共用庫
4使用者棧
5核心虛擬儲存空間
檔案:檔案就是位元組序列,每個I/O裝置都可以看成是檔案。
通過作業系統與電腦硬體相互結合,實現了應用程式的執行。
六總結
最後總結一下:我們通過一段由C語言編寫的hello world程式,來分析電腦都做了什麼工作。而這個過程,就是電腦系統工作的過程。
由此,我們得到了電腦系統的概念:電腦系統是由硬體和系統軟組成的,它們共同協作,以運行應用程式,從而使電腦為人服務。
電腦系統的概念(1)