不懂底層的程序員不是好程序員,解密代碼在計算機中運行原理

  • 2019 年 12 月 26 日
  • 筆記

程序與計算機的關係

還記得Windows的CMD嗎?只需向這個黑框框輸入指令,計算機即可做出相對應的響應。其實計算機的運行本身就是依靠向CPU下達一條一條的指令,並使計算機按指令運行。計算機指令就是指揮機器工作的指示和命令,程序就是一系列按一定順序排列的指令,執行程序的過程就是計算機的工作過程。

計算機的核心就是CPU,其作用就如同人類的心臟。

計算機基本架構

想要了解程序如何在計算機中運行,以及C/C++編程中設計的內存、地址、指針等概念,就必須要先了解計算機的基本架構;

計算機架構

CPU中主要由寄存器、時鐘、CU(控制單元)、ALU(算術邏輯單元)

時鐘:是對 CPU 內部操作與系統其他組件進行同步。

CU:協調參與機器指令執行的步驟序列。

ALU:執行算術運算以及邏輯運算。

CPU 通過主板上 CPU 插座的引腳與計算機其他部分相連。分別連接至數據總線、控制總線和地址總線。

寄存器:寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、數據和位址。在中央處理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序計數器(PC)。在中央處理器的算術及邏輯部件中,包含的寄存器有累加器(ACC)。在C++程序中向函數在實參傳遞時會將實參存入寄存器,需要反覆重複使用的變量也最好放到寄存器中。

內存存儲單元:狹義上的內存指的就是我們所說的內存條,但實際上 CPU 也不是直接操作內存的,因為其讀寫速度遠遠趕不上 CPU ,因此在內存和 CPU 之間還有「緩存」,如一級緩存、二級緩存, CPU 讀取數據時操作的都是緩存。內存主要用於在程序運行時保存指令與數據。它接受來自 CPU 的數據請求,將數據從隨機存儲器 (RAM) 傳輸到 CPU,並從 CPU 傳輸到內存。

Cache:在寄存器和內存中間還有存在着一個叫Cache的高速緩衝存儲器。由於CPU的運行速度遠高於內存讀寫速度,因此CPU如果直接從內存中存取數據就需要等待一定時間,但是Cache能保存着CPU剛用過或循環使用的一部分數據,這樣當下次CPU使用該部分數據時可從Cache中直接調用,這樣就減少了CPU的等待時間,提高了系統的效率。

四者之間的關係是:

CPU<->寄存器<->緩存<->內存

代碼執行流程

首先通過高級語言編寫的程序,需要通過編譯和鏈接翻譯成計算機能識別的指令:

比如這樣一行C語言代碼:puts("VIP會員");,在計算機執行時卻是10110000 10101011 00110001 00011100 00110011 00111110 01010011 11110000;

編譯流程如圖:

編譯流程

程序執行的流程可以簡單歸納為:取指 (Fetch)、譯碼 (Decode) 和執行 (Execute)

例如:要執行a = b +c;有兩個輸入操作數 (b 和 c),—個輸岀操作數 (a)。

1、將編譯過代碼讀取緩存區

2、將代碼編譯成計算機指令

3、CPU 從指令隊列區域取得指令,並立即增加指令指針的值。

4、CPU 對指令的二進制位模式進行譯碼。這種位模式可能會表示該指令有操作數(輸入值)。

5、CPU 從寄存器和內存中取得操作數。這步可能會包含地址計算。

6、使用步驟 3 得到的操作數,CPU 執行該指令。同時更新部分狀態標誌位,如零標誌 (Zero)、進位標誌 (Carry) 和溢出標誌 (Overflow)。

7、輸出操作數,若輸出也是指令的一部分CPU 還需要存儲其結果操作數。

代碼執行原理