不懂底層的程式設計師不是好程式設計師,解密程式碼在電腦中運行原理
- 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 還需要存儲其結果操作數。

程式碼執行原理
