作者矢澤久雄抢埋,YAZAWA股份有限公司董事長(zhǎng)兼總經(jīng)理宋渔。本書(shū)以通俗易懂的方式來(lái)解析程序的運(yùn)行機(jī)制州疾,可以了解CPU的寄存器和內(nèi)存的運(yùn)行方式。無(wú)論任何事情皇拣,了解其本質(zhì)非常重要孝治,只有了解本質(zhì)才能利用效率。這樣一來(lái)审磁,即時(shí)有了新技術(shù)出現(xiàn)也能容易的理解并掌握谈飒。
一、對(duì)程序員來(lái)說(shuō)CPU是什么
CPU(Central Processing Unit态蒂,中央處理器)是計(jì)算機(jī)的大腦杭措,它的內(nèi)部由數(shù)百萬(wàn)至數(shù)億個(gè)晶體管構(gòu)成。CPU有四個(gè)構(gòu)成部分:控制器钾恢、寄存器手素、運(yùn)算器鸳址、時(shí)鐘。程序員只需了解寄存器即可泉懦,因?yàn)槌绦蚴前鸭拇嫫髯鳛閷?duì)象來(lái)描述的稿黍,CPU是寄存器的集合體。
二崩哩、數(shù)據(jù)是用二進(jìn)制表示的
要想對(duì)程序的運(yùn)行機(jī)制形成億大致的印象巡球,就要了解信息(數(shù)據(jù))在計(jì)算機(jī)內(nèi)部是以怎樣的形式來(lái)表現(xiàn)的,又是以怎樣的方法進(jìn)行運(yùn)算的邓嘹。在C和Java等高級(jí)語(yǔ)言編寫(xiě)的程序中酣栈,數(shù)值、字符串和圖像等信息在計(jì)算機(jī)內(nèi)部都是以二進(jìn)制數(shù)值的形式來(lái)表現(xiàn)的汹押。通過(guò)電流信號(hào)矿筝,我們可以給CPU發(fā)送指令或者傳遞數(shù)字信息等,比如讓電腦計(jì)算1+2的時(shí)候棚贾,就要把進(jìn)行加法計(jì)算的命令和1和2這兩個(gè)數(shù)字通過(guò)電流的方式傳遞給CPU窖维。CPU的引腳有電流通過(guò)的時(shí)候數(shù)值為1,沒(méi)有電流通過(guò)時(shí)數(shù)值為0妙痹,所以只能用二進(jìn)制數(shù)來(lái)表示計(jì)算機(jī)的信息铸史。
三、計(jì)算機(jī)進(jìn)行小數(shù)運(yùn)算時(shí)出錯(cuò)的原因
當(dāng)遇到無(wú)限循環(huán)小數(shù)時(shí)细诸,計(jì)算機(jī)無(wú)法正確表示數(shù)值,最后都變成了近似值陋守。計(jì)算機(jī)這個(gè)功能有限的機(jī)器設(shè)備震贵,是無(wú)法處理無(wú)限循環(huán)的小數(shù)的。因此水评,在遇到循環(huán)小數(shù)時(shí)猩系,計(jì)算機(jī)就會(huì)根據(jù)變量數(shù)據(jù)類(lèi)型所對(duì)應(yīng)的長(zhǎng)度將數(shù)值從中間截?cái)嗷蛘咚纳嵛迦搿N覀冎乐性铮瑢?.333……這樣的循環(huán)小數(shù)從中間階段會(huì)變成0.3333寇甸,則是它的3倍是無(wú)法得出1的,計(jì)算機(jī)運(yùn)算出錯(cuò)也是同樣的道理疗涉。
四拿霉、數(shù)量使用有棱有角的內(nèi)存
計(jì)算機(jī)是進(jìn)行數(shù)據(jù)處理的設(shè)備,而程序表示的就是處理順序和數(shù)據(jù)結(jié)構(gòu)咱扣。由于處理對(duì)象數(shù)據(jù)是存儲(chǔ)在內(nèi)存和磁盤(pán)上的绽淘,因此程序必須能自由地使用內(nèi)存和磁盤(pán)。
上圖是內(nèi)存IC的引腳配置示例闹伪,雖然這是一個(gè)虛擬的內(nèi)存IC沪铭,但它的引腳和實(shí)際的內(nèi)存IC是一樣的壮池。VCC和GND是電源,A0~A9是地址信號(hào)的引腳杀怠,D0~D7是數(shù)據(jù)信號(hào)的引腳椰憋,RD和WR是控制信號(hào)的引腳。將電源連接到VCC和GND后赔退,就可以傳遞比如0或1這樣的信號(hào)橙依。大多數(shù)情況下,+5V的直流電壓表示1离钝,0V表示0票编。數(shù)據(jù)信號(hào)引腳有D0~D7共八個(gè),表示一次可以輸入輸出8位(=1字節(jié))的數(shù)據(jù)卵渴。此外慧域,地址信號(hào)引腳有A0~A9共十個(gè),表示可以指定0000000000~1111111111共1024個(gè)地址浪读。而地址用來(lái)表示數(shù)據(jù)的存儲(chǔ)場(chǎng)所于毙,因此我們可以得出這個(gè)內(nèi)存IC中可以存儲(chǔ)1024個(gè)1字節(jié)的數(shù)據(jù)。因?yàn)?024=1K耍鬓,所以該內(nèi)存的IC的容量就是1KB碉钠。
五、內(nèi)存和磁盤(pán)的親密關(guān)系
從都具有存儲(chǔ)程序命令和數(shù)據(jù)這點(diǎn)看痘拆,內(nèi)存和磁盤(pán)的功能是相同的仰禽。在計(jì)算機(jī)的5大部件中,內(nèi)存和磁盤(pán)也都是被歸類(lèi)為存儲(chǔ)部件纺蛆。不過(guò)利用電流來(lái)實(shí)現(xiàn)存儲(chǔ)的內(nèi)存吐葵,同利用磁效應(yīng)來(lái)實(shí)現(xiàn)存儲(chǔ)的磁盤(pán),還是有差異的桥氏。而從存儲(chǔ)容量來(lái)看温峭,內(nèi)存是高速高價(jià),而磁盤(pán)是低俗廉價(jià)字支。
六凤藏、親自嘗試壓縮數(shù)據(jù)
RLE(Run Length Encoding,行程長(zhǎng)度編碼)算法堕伪,是把內(nèi)容用“數(shù)據(jù) x 重復(fù)次數(shù)”的形式來(lái)表示的壓縮方法揖庄。例如:AAAAAABBCDDEEEEEF = A6B2C1D2E5F1。哈夫曼算法是指:為各壓縮對(duì)象文件分別構(gòu)造最佳的編碼體系欠雌,并以該編碼體系為基礎(chǔ)來(lái)進(jìn)行壓縮抠艾。壓縮算法的種類(lèi)大概有一二十種,之所以會(huì)存在如此多得壓縮算法桨昙,是因?yàn)閴嚎s比率检号、壓縮需要的處理時(shí)間(壓縮的復(fù)雜程度)以及各種文件的需求等是不一樣的腌歉,因此,至今學(xué)界都不能提出一個(gè)萬(wàn)能的壓縮算法齐苛。
七翘盖、程序是在何種環(huán)境中運(yùn)行的
由于同一個(gè)程序能被大量用戶(hù)使用,所以說(shuō)程序具有很大的價(jià)值凹蜂。如果將程序拿來(lái)出售的話(huà)馍驯,只要銷(xiāo)量大,肯定就能收到非陈耆可觀的利潤(rùn)汰瘫。即便是自由軟件,若有大量的用戶(hù)使用的話(huà)擂煞,那也是一件讓人高興的事混弥。大家也都希望自己編寫(xiě)的程序被盡可能多得用戶(hù)喜歡并使用吧。但是对省,如果環(huán)境不同蝗拿,程序是無(wú)法運(yùn)行的。例如蒿涎,在Macintosh上直接運(yùn)行Windows用的程序哀托,基本上無(wú)法實(shí)現(xiàn)的,這是因?yàn)檫\(yùn)行環(huán)境不同造成的劳秋。運(yùn)行環(huán)境 = 操作系統(tǒng) + 硬件仓手。
八、從源文件到可執(zhí)行文件
把EXE文件的內(nèi)容Dump一下玻淑,Dump是指把文件內(nèi)容嗽冒,每個(gè)字節(jié)用2位十六進(jìn)制數(shù)來(lái)表示的方式。本地代碼的內(nèi)容就是各種數(shù)值的羅列岁忘,這些數(shù)值就是本地代碼的真面目辛慰。每個(gè)數(shù)值都表示某一個(gè)命令或數(shù)據(jù)区匠,而計(jì)算機(jī)就是把所有的信息作為數(shù)值的集合來(lái)處理的干像。能夠把C語(yǔ)言等高級(jí)程序語(yǔ)言編寫(xiě)的源代碼轉(zhuǎn)換成本地代碼的程序稱(chēng)為編譯器。編譯器轉(zhuǎn)化生成的本地文件驰弄,并不能直接運(yùn)行麻汰,還要鏈接處理。
九戚篙、操作系統(tǒng)和應(yīng)用的關(guān)系
利用計(jì)算機(jī)運(yùn)行程序大部分都是為了提高處理效率五鲫。例如,Microsoft Word這樣的文字處理軟件岔擂,是用來(lái)提高文本文件處理效率的程序位喂,Microsoft Excel 等表格計(jì)算軟件浪耘,是用來(lái)提高賬本處理效率的程序。類(lèi)似于文字處理軟件這樣塑崖,為了提高特定處理效率的程序總稱(chēng)為“應(yīng)用”七冲。程序員的工作就是編寫(xiě)各種各樣的應(yīng)用來(lái)提高業(yè)務(wù)效率。而應(yīng)用的運(yùn)行環(huán)境规婆,也就是操作系統(tǒng)澜躺,則直接從軟件商店等處購(gòu)買(mǎi)就可以了。不過(guò)抒蚜,一定不能忽略操作系統(tǒng)掘鄙,否則就無(wú)法編寫(xiě)應(yīng)用。這是因?yàn)槲怂瑁绦騿T是通過(guò)利用操作系統(tǒng)提供的功能來(lái)編寫(xiě)應(yīng)用的操漠。
十、通過(guò)匯編語(yǔ)言了解程序的實(shí)際構(gòu)成
在加法運(yùn)算的本地代碼中加上add(addition的縮寫(xiě))器贩、在比較運(yùn)算的本地代碼中加上cmp(compare的縮寫(xiě))等颅夺,這些縮寫(xiě)稱(chēng)為助記符,使用助記符的編程語(yǔ)言稱(chēng)為匯編語(yǔ)言蛹稍,匯編語(yǔ)言和本地代碼是一一對(duì)應(yīng)的關(guān)系吧黄。通過(guò)編譯器輸出匯編語(yǔ)言的源代碼,不會(huì)轉(zhuǎn)化成本地代碼的偽指令唆姐,匯編語(yǔ)言的語(yǔ)法是“操作碼+操作數(shù)”
十一拗慨、硬件控制方法
“計(jì)算機(jī)如果沒(méi)有軟件,就僅僅是個(gè)箱子”奉芦,也就是說(shuō)赵抢,即使計(jì)算機(jī)這種看起來(lái)很了不起的設(shè)備(硬件),離開(kāi)了軟件依然什么也做不了声功,因?yàn)檐浖拇嬖谑怯布_\(yùn)行的必要條件烦却。雖然說(shuō)計(jì)算機(jī)領(lǐng)域的新技術(shù)在不斷涌現(xiàn),但計(jì)算機(jī)能處理的事情始終只是對(duì)數(shù)據(jù)進(jìn)行運(yùn)算先巴,并把結(jié)果輸出其爵,這一點(diǎn)是不會(huì)發(fā)生任何變化的。不管程序內(nèi)容是什么伸蚯,最終都是數(shù)據(jù)的輸入輸出和運(yùn)算摩渺。
十二、讓計(jì)算機(jī)“思考”
程序就如同是由計(jì)算機(jī)執(zhí)行的各種指令羅列起來(lái)的文章剂邮,計(jì)算機(jī)內(nèi)部的CPU摇幻,通過(guò)對(duì)該文章的內(nèi)容進(jìn)行解析和運(yùn)行,來(lái)控制連接到計(jì)算機(jī)的各種外圍設(shè)備。具體來(lái)說(shuō)绰姻,控制就是指CPU和各種設(shè)置之間配合進(jìn)行數(shù)據(jù)的輸入輸出處理枉侧。計(jì)算機(jī)并不智能,它只是運(yùn)行了表現(xiàn)人類(lèi)思考方式的程序而已狂芋。也就是說(shuō)棵逊,開(kāi)發(fā)程序的程序員,賦予了計(jì)算機(jī)這些智能银酗,程序只是人類(lèi)的想法在計(jì)算機(jī)上進(jìn)行了重現(xiàn)辆影。
讀后感:對(duì)程序的運(yùn)行機(jī)制有了大致的了解,明白了如何用二進(jìn)制表示小數(shù)黍特、部分壓縮算法蛙讥、程序運(yùn)行流程。但是對(duì)匯編語(yǔ)言還是很晦澀難懂灭衷,內(nèi)存和寄存器的相關(guān)知識(shí)還不夠全面次慢,有需要的話(huà)還會(huì)深入學(xué)習(xí)。