《程序是怎樣跑起來(lái)的》總結(jié)

作者矢澤久雄抢埋,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是寄存器的集合體。

程序運(yùn)行流程示例

二崩哩、數(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ī)的信息铸史。

用單精度浮點(diǎn)數(shù)表示的數(shù)據(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的引腳配置示例

上圖是內(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)能的壓縮算法齐苛。

哈弗曼樹(shù)的編碼順序

七翘盖、程序是在何種環(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í)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末翔曲,一起剝皮案震驚了整個(gè)濱河市迫像,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瞳遍,老刑警劉巖闻妓,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異掠械,居然都是意外死亡由缆,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)猾蒂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)均唉,“玉大人,你說(shuō)我怎么就攤上這事肚菠√蚣” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蚊逢,是天一觀的道長(zhǎng)层扶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)时捌,這世上最難降的妖魔是什么怒医? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任炉抒,我火速辦了婚禮奢讨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己拿诸,他們只是感情好扒袖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著亩码,像睡著了一般季率。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上描沟,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天飒泻,我揣著相機(jī)與錄音,去河邊找鬼吏廉。 笑死泞遗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的席覆。 我是一名探鬼主播史辙,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼佩伤!你這毒婦竟也來(lái)了聊倔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤生巡,失蹤者是張志新(化名)和其女友劉穎耙蔑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體孤荣,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纵潦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垃环。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邀层。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖遂庄,靈堂內(nèi)的尸體忽然破棺而出寥院,到底是詐尸還是另有隱情,我是刑警寧澤涛目,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布秸谢,位于F島的核電站,受9級(jí)特大地震影響霹肝,放射性物質(zhì)發(fā)生泄漏估蹄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一沫换、第九天 我趴在偏房一處隱蔽的房頂上張望臭蚁。 院中可真熱鬧,春花似錦、人聲如沸垮兑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)系枪。三九已至雀哨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間私爷,已是汗流浹背雾棺。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衬浑,地道東北人垢村。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嚎卫,于是被迫代替她去往敵國(guó)和親嘉栓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容