天天看點

【1.1】系統漫遊——資訊就是位+上下文

        計算機系統發展這麼多年,雖然具體的實作方式一直在變,但底層的原理一直都不曾變化。為了更好的了解我們的程式是如何被執行如何被底層影響的,有必要開展一次全新的計算機系統之旅了。

        我們學習C語言幾乎都是從“helloword”開始的,這麼一個簡單的程式也需要計算機系統各個部件之間緊密配合、協同工作,才能使程式正确的執行。當程式執行時,我們希望知道内部到底發生了什麼,隻有真正了解本質,對問題的分析才能準确透徹!這次學習之旅會非常漫長,下面就以對“hello”程式的整個生命周期跟蹤,大概了解一下關鍵概念和具體路徑,後續章節會進行詳細分析。

hello.c :

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

通過WinHex檢視hello.c檔案,可以看到:

【1.1】系統漫遊——資訊就是位+上下文

        左邊是檔案對應的16進制代碼,右邊是我們的源程式,也就是說源程式在計算機中是以ascii碼值來儲存的,例如:“#”的ascii值是0x23。需要特别注意一下:第2行中有2個連續的0x0D 0x0A ,這是windows中特有的“換行符\r\n” ,在linux中的是“換行符\n”。可以看到,源程式檔案是程式員通過編輯器建立的一個“文本檔案”,test.c檔案就是由一系列的位元組(ascii)組成,每個byte都代表某一個“文本字元”。就像hello.c檔案這樣隻由ascii碼組成的檔案叫做個“文本檔案”,其他所有檔案都叫“二進制檔案”。

        該檔案說明一個基本原則:所有的資訊,無論是儲存在磁盤還是記憶體中,或者傳輸在網絡中,都是由一系列的bits組成,區分這些不同資料對象的的唯一方法是我們觀察的視角。例如:對于0x69,我們可以認為是字元“i”,或者是數值,或者是圖像中某一個像素點等等。不管他們是什麼,在計算機中都是用二進制表示的,因為計算機隻有“開關”兩種狀态。

       關于“文本檔案”和“二進制檔案”:

      前面講到,計算機中的資訊都是用二進制位來表示的,就上圖中左邊的資料内容(計算機實體級别上存儲的内容),如果把它看做是文本檔案,那麼編譯器就會把這些數值以8bits為機關,轉化成ascii碼展現出來,就變成了右邊的代碼;如果看做是二進制檔案,就不會做任何轉化,直接呈現出來。應該都有過打開一個未知擴充名檔案的經曆,這些擴充名就是告訴計算機用什麼方式來解析檔案,是用“文本檔案”還是“二進制檔案”,如果用二進制檔案,還要看如何解析二進制檔案(不同的檔案解析規則不同)。如果把.jpg檔案擴充名改為.txt,則系統會認為是“文本檔案”,解析出來多半是密密麻麻的亂碼,這就是把“二進制檔案”故意解析成“文本檔案”的後果。總的來說,實體層上講資料都是二進制存儲的,邏輯層上講就會出現“文本檔案”和“二進制檔案”的不同解析方式。這些就是他們最本質的差別,至于其他的可以自行搜尋相關介紹。

繼續閱讀