程序的零點(diǎn):CPU到底是什么

Coding這么多年,還記得初次接觸計(jì)算機(jī)的情形嗎?寫(xiě)了幾萬(wàn)行代碼,為啥水平提升越來(lái)越緩慢?想寫(xiě)個(gè)源程序,是否感覺(jué)非常不給力?難倒你也在為這些問(wèn)題苦惱?
高手說(shuō),你不熟悉程序運(yùn)行的根本機(jī)制。
不信,你想想程序運(yùn)行的流程。

你再想想CPU是什么。

清楚嗎?我們來(lái)懷舊一下CPU。
CPU的內(nèi)部由寄存器、控制器、運(yùn)算器和時(shí)鐘四個(gè)部分構(gòu)成,各部分之間由電流信號(hào)相互連通。寄存器可用來(lái)暫存指令、數(shù)據(jù)等處理對(duì)象,可以將其看作是內(nèi)存的一種。根據(jù)種類的不同,一個(gè)CPU內(nèi)部會(huì)有20~100個(gè)寄存器??刂破髫?fù)責(zé)把內(nèi)存上的指令、數(shù)據(jù)等讀入寄存器,并根據(jù)指令的執(zhí)行結(jié)果來(lái)控制整個(gè)計(jì)算機(jī)。運(yùn)算器負(fù)責(zé)運(yùn)算從內(nèi)存讀入寄存器的數(shù)據(jù)。時(shí)鐘負(fù)責(zé)發(fā)出CPU開(kāi)始計(jì)時(shí)的時(shí)鐘信號(hào)。不過(guò),也有些計(jì)算機(jī)的時(shí)鐘位于CPU的外部。
通常所說(shuō)的內(nèi)存指的是計(jì)算機(jī)的主存儲(chǔ)器(main memory),簡(jiǎn)稱主存。主存通過(guò)控制芯片等與CPU相連,主要負(fù)責(zé)存儲(chǔ)指令和數(shù)據(jù)。主存由可讀寫(xiě)的元素構(gòu)成,每個(gè)字節(jié)(1字節(jié) = 8位 )都帶有一個(gè)地址編號(hào)。CPU可以通過(guò)該地址讀取主存中的指令和數(shù)據(jù),當(dāng)然也可以寫(xiě)入數(shù)據(jù)。但有一點(diǎn)需要注意,主存中存儲(chǔ)的指令和數(shù)據(jù)會(huì)隨著計(jì)算機(jī)的關(guān)機(jī)而自動(dòng)清除。
程序啟動(dòng)后,根據(jù)時(shí)鐘信號(hào),控制器會(huì)從內(nèi)存中讀取指令和數(shù)據(jù)。通過(guò)對(duì)這些指令加以解釋和運(yùn)行,運(yùn)算器就會(huì)對(duì)數(shù)據(jù)進(jìn)行運(yùn)算,控制器根據(jù)該運(yùn)算結(jié)果來(lái)控制計(jì)算機(jī)。看到“控制”一詞時(shí),大家可能會(huì)將事情想象得過(guò)于復(fù)雜,其實(shí)所謂的控制就是指數(shù)據(jù)運(yùn)算以外的處理(主要是數(shù)據(jù)輸入輸出的時(shí)機(jī)控制)。比如內(nèi)存和磁盤等媒介的輸入輸出、鍵盤和鼠標(biāo)的輸入、顯示器和打印機(jī)的輸出等,這些都是控制的內(nèi)容。
高手說(shuō),CPU是寄存器的集合體。
CPU的四個(gè)構(gòu)成部分中,程序員只需要了解寄存器即可,其余三個(gè)都不用太過(guò)關(guān)注。那么,為什么必須要了解寄存器呢?因?yàn)槌绦蚴前鸭拇嫫髯鳛閷?duì)象來(lái)描述的。
不同類型的CPU,其內(nèi)部寄存器的數(shù)量、種類以及寄存器存儲(chǔ)的數(shù)值范圍都是不同的。不過(guò),根據(jù)功能的不同,可以將寄存器大致劃分為八類。

從表中可以看出,寄存器中存儲(chǔ)的內(nèi)容既可以是指令也可以是數(shù)據(jù)。其中,數(shù)據(jù)分為“用于運(yùn)算的數(shù)值”和“表示內(nèi)存地址的數(shù)值”兩種。數(shù)據(jù)種類不同,存儲(chǔ)該數(shù)值的寄存器也不同。CPU中每個(gè)寄存器的功能都是不同的。用于運(yùn)算的數(shù)值放在累加寄存器中存儲(chǔ),表示內(nèi)存地址的數(shù)值則放在基址寄存器和變址寄存器中存儲(chǔ)。
對(duì)程序員來(lái)說(shuō),CPU就是具有各種功能的寄存器的集合體。其中,程序計(jì)數(shù)器、累加寄存器、標(biāo)志寄存器、指令寄存器和棧寄存器都只有一個(gè),其他的寄存器一般有多個(gè)。

懷舊半天,讓我們來(lái)看幾個(gè)簡(jiǎn)單的問(wèn)題,抗住。
1. 程序是什么?
2. 程序是由什么組成的?
3. 什么是機(jī)器語(yǔ)言?
4. 正在運(yùn)行的程序存儲(chǔ)在什么位置?
5. 什么是內(nèi)存地址?
6. 計(jì)算機(jī)的構(gòu)成元件中,負(fù)責(zé)程序的解釋和運(yùn)行的是哪個(gè)?
哈哈,下面是答案。
1. 指示計(jì)算機(jī)每一步動(dòng)作的一組指令。
一般所說(shuō)的程序,譬如運(yùn)動(dòng)會(huì)、音樂(lè)會(huì)的程序等,指的是“行事的先后次序”。計(jì)算機(jī)程序也是一樣的道理。
2. 程序是指令和數(shù)據(jù)的組合體。
例如,C語(yǔ)言“printf ("你好");”這個(gè)簡(jiǎn)單的程序中,printf是指令,"你好"是數(shù)據(jù)。
3. CPU可以直接識(shí)別并使用的語(yǔ)言。
CPU能夠直接識(shí)別和執(zhí)行的只有機(jī)器語(yǔ)言。使用C、Java等語(yǔ)言編寫(xiě)的程序,最后都會(huì)轉(zhuǎn)化成機(jī)器語(yǔ)言。
4. 內(nèi)存
硬盤和磁盤等媒介上保存的程序被復(fù)制到內(nèi)存后才能運(yùn)行。
5. 內(nèi)存中保存命令和數(shù)據(jù)的場(chǎng)所,通過(guò)地址來(lái)標(biāo)記和指定。地址由整數(shù)值表示。
6. CPU
計(jì)算機(jī)的構(gòu)成元件中,根據(jù)程序的指令來(lái)進(jìn)行數(shù)據(jù)運(yùn)算,并控制整個(gè)計(jì)算機(jī)的設(shè)備稱作CPU。大家熟知的奔騰(Pentium)就是CPU的一種。
相關(guān)圖書(shū)推薦

日文版重印41次!
“計(jì)算機(jī)組成原理”圖解趣味版
蹲馬桶就能看懂的編程基礎(chǔ)知識(shí)
《程序是怎樣跑起來(lái)的》從計(jì)算機(jī)的內(nèi)部結(jié)構(gòu)開(kāi)始講起,以圖配文的形式詳細(xì)講解了二進(jìn)制、內(nèi)存、數(shù)據(jù)壓縮、源文件和可執(zhí)行文件、操作系統(tǒng)和應(yīng)用程序的關(guān)系、匯編語(yǔ)言、硬件控制方法等內(nèi)容,目的是讓讀者了解從用戶雙擊程序圖標(biāo)到程序開(kāi)始運(yùn)行之間到底發(fā)生了什么。

