




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
編程機(jī)制探析(InsightintoProgramming《編程機(jī)制探析》初 (已提供 《編程機(jī)制探析》第一章寫作初衷——若是當(dāng)年早知 《編程機(jī)制探析》第二章計(jì)算機(jī)語 《編程機(jī)制探析》第三章計(jì)算機(jī)運(yùn)行結(jié) 《編程機(jī)制探析》第四章運(yùn)行棧與內(nèi)存尋 《編程機(jī)制探析》第五章命令式編 《編程機(jī)制探析》第六章面向?qū)?《編程機(jī)制探析》第七章設(shè)計(jì)模 《編程機(jī)制探析》第八章Compositor 《編程機(jī)制探析》第九章線 《編程機(jī)制探析》第十章線程同步模 《編程機(jī)制探析》第十一章Copyon 《編程機(jī)制探析》第十二章 tor 《編程機(jī)制探析》第十四章關(guān)于方法表的那些 《編程機(jī)制探析》第十三章動(dòng)態(tài)類 《編程機(jī)制探析》第十五章遞 《編程機(jī)制探析》第十六章樹形遞 《編程機(jī)制探析》第十七章函數(shù)式編 《編程機(jī)制探析》第十八章函數(shù)式語 《編程機(jī)制探析》第十九章《編程機(jī)制探析》第十九章函數(shù)=數(shù)據(jù)=類型 《編程機(jī)制探析》第二十章流程控 《編程機(jī)制探析》第二十一章 《編程機(jī)制探析》第十四章關(guān)于方法表的那些 《編程機(jī)制探析》初 (已提供PDF時(shí)時(shí)間:2011-08-29關(guān)鍵字:編程,設(shè)計(jì)模式,《編程機(jī)制探析》初第一章作初衷——若是當(dāng)年早知道......第二章計(jì)算機(jī)語言第三章計(jì)算機(jī)運(yùn)行結(jié)構(gòu)第四章行棧與內(nèi)存尋址第五章命令式編程第六章向?qū)ο蟮谄哒略O(shè)計(jì)模式第八章Compositor第九章第十章線程同步模第十一章CopyonWrite第十二章ItorPattern第十三章動(dòng)態(tài)類型第十四章于方法表的那些事第十五章遞歸第十六章樹形遞歸第十七章函數(shù)式編程第十八章函數(shù)式語第十九章?lián)偷诙铝鞒炭刂频诙徽卤緯醺灏l(fā)布在網(wǎng)上的目的如回本很多思路都是在討論和網(wǎng)絡(luò)資源研討的過程中形成的。因此,作為其產(chǎn)物,應(yīng)該有所回饋。 。(作者:buaawhl王海龍。 本書已經(jīng)做成PDF,只是由于問題,章節(jié)排布有點(diǎn)小問題,第十四章排到了最后一章PDF版請(qǐng)?jiān)谌缦碌刂?這本書放在網(wǎng)上,是為了交流和學(xué)習(xí)之用。請(qǐng)高抬貴手,莫用于商業(yè)目的。全文。多謝排限于水平,書中錯(cuò)漏之處在所難免,說不定還不少。請(qǐng)大家不吝指改本書在網(wǎng)上發(fā)布之后,很可能會(huì)得到的真知灼見,可以讓我學(xué)到。我可以在內(nèi)容上、語言上進(jìn)一步改進(jìn)。宣這是我寫的第一本書,真正意義上的,自己寫的一本書。寫的都是想寫的內(nèi)容。我希望能有的人讀到這本書。我希望這本書能夠幫助到的人。我希望有的人喜歡這本書。第一章寫作初衷——若是當(dāng)年早知道......Blog : 第二章算機(jī)語Blog : 第三章計(jì)算機(jī)運(yùn)行結(jié)Blog : 第四章運(yùn)行棧與內(nèi)存尋Blog : 第五章令式編Blog : 第六章向?qū)log : 第七章計(jì)模Blog : 第八章CompositorPattern : Blog : 第十章線程同步模Blog : 第十一章CopyonBlog : 第十二章I torPattern : 第十三章態(tài)類Blog : 第十四章關(guān)于方法表的那些Blog : 第十五章Blog : 第十六章形遞Blog : 第十七章函數(shù)式編Blog : 第十八章函數(shù)式語Blog : 第十九章函數(shù)=數(shù)據(jù)=類型Blog : 第二十章程控Blog : 第二十一章AOP : 時(shí)時(shí)間:2011-08-《編程機(jī)制探析》第一章寫作初衷——若是當(dāng)年早知道小時(shí)候,我讀過一部短篇小說《一塊牛排》,著名小說家.倫敦寫的故事中,一個(gè)年老的老拳擊手陷入了人生的低谷,參加比賽之前,連補(bǔ)充體力的一塊牛排都買不起。他的對(duì)手是一個(gè)正處于體力上升期、精力充沛的年輕拳擊手。他憑借著豐富的經(jīng)驗(yàn)與對(duì)手周旋,并抓住一閃即逝的機(jī)會(huì),給了年輕的拳擊手以沉重打擊。但是,遺憾的是,他的體力不足,并沒有給對(duì)手造成致命打擊。對(duì)手最終重新穩(wěn)住了腳跟,將他擊倒在地。很多年過去了,但這篇小說給我的印象一直沒有褪色,尤其是文中那一段關(guān)于老拳擊手心理活動(dòng)的描寫:“當(dāng)他坐在自己的一角打量對(duì)手的時(shí)候,他的腦子里涌現(xiàn)出一個(gè)想法。如果以他的老謀深算,再加上那樣的年輕力壯,定能成為一名重量級(jí)的世界冠軍,一代拳王。可是就在這里,決不可能無敵于天下,因?yàn)樗鄙僦腔?而獲取智慧的唯一途徑,就是拿青春去交換。不過這樣一來,等他有了智慧的時(shí)候,青春已經(jīng)了。”這段話,我可以說是感同身受。我也年輕過,我也躊躇滿志過,我也精力充沛過,我也廢寢忘食過。然后,同那個(gè)老拳擊手一樣,等我年紀(jì)漸長后,回憶起當(dāng)年的無知無覺,我也滿腔遺憾,悔不當(dāng)初。若是當(dāng)年的我,就擁有了現(xiàn)在的見識(shí)和經(jīng)驗(yàn),那么,我當(dāng)年絕不會(huì)走那么多彎路,也絕不會(huì)浪費(fèi)那么多時(shí)間。如今,很多事情雖然知道了,卻為時(shí)已晚。正個(gè)一句話笑話講的那樣:早戀??墒牵呀?jīng)晚了。正如那個(gè)老拳擊手一樣,每個(gè)人都有一些大大小小的“早知如此,就應(yīng)如何如何”的遺憾。細(xì)數(shù)當(dāng)年,我也有過不少這樣的遺憾。我現(xiàn)在還清楚地記得,畢業(yè)求職的時(shí)候,我去一家外企面試,由于英語口語不好,沒有通過。只有在那時(shí)候,我才了英語口語的重要性,我才明白,那些早晨起來在校園里堅(jiān)持大聲背誦口語的是明智。對(duì)于見多識(shí)廣的同學(xué)來說,英語口語在求職中的重要性,只是一個(gè)簡單的。而我對(duì)英語的認(rèn)識(shí)卻遠(yuǎn)遠(yuǎn)沒深刻到這個(gè)程度。在積累詞匯量和擴(kuò)大閱讀量兩個(gè)方面投入了精力,以便查閱大量的英文技術(shù)文檔。那件事情是一個(gè)知識(shí)決定命運(yùn)的活生生的例子,給了我深刻的教訓(xùn),以至于我到現(xiàn)在還不能忘卻。上有一些人,意志堅(jiān)韌,能力出眾,做什么事情都能干出一番名堂來。那些人可能很難理解我的這種想法。在他們看來,一份職業(yè)只不過是一個(gè)起點(diǎn)而已,能做到什么地步,完全依靠個(gè)人的能力。但很不幸的是,我是一個(gè)資質(zhì)平庸、意志薄弱的人。第一份職業(yè)基本上決定了一個(gè)人職業(yè)起點(diǎn)的高低。與其努力工作,不如努力找工作。對(duì)于像我這樣的資質(zhì)平庸的人來說,尤其如此。人在失敗的時(shí)候,出于自我心理保護(hù)的機(jī)制,總是會(huì)為自己找借口。吾非圣賢,自然也是如此。很快,我就為自己找到了諸多借口。首先,我沒有口語重要,是因?yàn)樾畔⒉粚?duì)稱。我是農(nóng)村里長大的孩子,自然不如城里人懂得多其次,我們農(nóng)村孩子從小學(xué)的都是啞巴英語,高考時(shí)部分就吃了大虧,幸虧沒有考口語。再次,這種基本教育環(huán)境的,不僅表現(xiàn)在英語方面,還表現(xiàn)在各個(gè)方面。比如,雙語家庭里長大的孩子從小就懂雙語,根本就不用學(xué)。生意人家庭里長大的孩子,從小就懂生意經(jīng),自然比我們起點(diǎn)高。再說了,為什么要???!都說中文,不就沒這回事了總而言之,這都是環(huán)境的錯(cuò),和我一點(diǎn)關(guān)系都沒當(dāng)然,以上種種借口,除了給自己帶來心靈上的撫慰,對(duì)于物質(zhì)世界卻沒有任何改變作用。要想在物質(zhì)世界占有一席之地,還得從改變自身做起。既然信息不對(duì)稱,那么就想辦法彌補(bǔ)。我求職寶典之類的重要性,也開始有意無意地留意網(wǎng)上的相關(guān)資料。我在網(wǎng)上看到過一個(gè)微軟求職的例子。有一個(gè)人,從來沒有接觸過編程工作,卻敢于去微軟面試。第一次自然被刷下來了。但他不屈不撓,還準(zhǔn)備下次再來。主考官見狀,對(duì)其產(chǎn)生,決定給他這個(gè)機(jī)會(huì)。多次面試之后,他從一個(gè)門外漢成為了一個(gè)半專業(yè),展示了強(qiáng)大的學(xué)習(xí)能力,通過了考核,成為了微軟的一員。在這個(gè)例子中,那個(gè)人的學(xué)習(xí)能力和意志力起了關(guān)鍵作用,同時(shí),那個(gè)主考官的耐心、閑心、寬容心也起了重大作用。無獨(dú)有偶,后來我在網(wǎng)上又看到了一篇帖子——“我為這份工作準(zhǔn)備了十年”。作者在文中描述了他為了一份工作,積累各方面經(jīng)驗(yàn)長達(dá)十年的過程。隔行如隔山,那個(gè)帖子描述的工種我不太懂,好像也是專業(yè)性很強(qiáng)的那種。網(wǎng)上有些風(fēng)言風(fēng)語嘲笑作者,說什么有這份心思和功夫,還不如做生意或開公司,說不定早就發(fā)財(cái)了。對(duì)此,我的看法是這樣的。我羨慕,但我敬佩專業(yè)。前一個(gè)微軟求職的帖子,我還沒有太強(qiáng)的感覺,但是,看了這篇帖子,作者那種孜孜以求的精神,卻令我敬佩不已,汗顏不已。我從來就沒有過這種感覺,能夠?qū)σ环萋殬I(yè),或者說一個(gè)公司,能夠有這么向往和執(zhí)著的精神我如果能夠擁有這樣的精神和毅力,我也能成功獲得一份向往的工作。但我沒有。我從來沒有對(duì)某個(gè)職位產(chǎn)生過如此感情。我開始自身。難道我對(duì)計(jì)算機(jī)技術(shù)不夠熱愛?也許吧。我看到過一些少年的故事。有些還在上高中的少年,就已經(jīng)成為深諳計(jì)算機(jī)底層的級(jí)別的編程高手。他們擁有天賦、、熱情,。與他們相比,天賦就不用說了,太打擊自信。就說和熱情,我也遠(yuǎn)遠(yuǎn)不能與他們相比。當(dāng)年求學(xué)的時(shí)候,我選擇計(jì)算機(jī)專業(yè),完全是因?yàn)檫@行熱門,好找工作。你能指望一個(gè)出身農(nóng)村普通勞動(dòng)者家庭的年輕人能夠懷有“為中華崛起而學(xué)習(xí)計(jì)算機(jī)”的遠(yuǎn)大理想嗎?這樣的人確實(shí)有。比如,“計(jì)算機(jī)要從娃娃抓起”宣傳畫上爺手撫的那個(gè)娃娃。現(xiàn)實(shí)中,我也遇到那樣的同學(xué)和同事,對(duì)于計(jì)算機(jī)真正的熱忱和熱愛。但是,那類人屈指可數(shù),鳳毛角。大部分人都是像我這樣,只是為了謀生和“錢景”。說實(shí)話,編碼工作整天與機(jī)器和代碼打交道,確實(shí)是比較枯燥的。不過,編程工作也可能是有趣的。我正是在學(xué)習(xí)和工作的過程中,時(shí)而遇到智力上的,甚至體會(huì)到創(chuàng)造的快樂,才真正對(duì)編程工作本身產(chǎn)生了和熱情。遺憾的是,隨著軟件業(yè)的發(fā)展,程序員的工種進(jìn)一步細(xì)化,產(chǎn)生了大量代碼工人的職位,不僅減少了編碼工作的趣味,而且加重了程序員的職業(yè)感。俗話說,有競爭才有動(dòng)力。程序員原本是一種腦力勞動(dòng),但是,隨著經(jīng)過簡單培訓(xùn)的代碼工人的大量涌入,編程越來越有淪為體力勞動(dòng)的趨勢(shì)。本來自以為老資格的入行早的程序員,面對(duì)精力充沛的年輕一代和日新月異的新技術(shù),越來越感到力不從心,不禁發(fā)出了和那個(gè)老拳擊手一樣的感慨——這是個(gè)吃青春飯的行業(yè),這是年輕人的天下。程序員是不是吃青春飯的行業(yè)。這是程序員群體中一直爭論不休、經(jīng)久不衰的永恒話題。之所以說這是個(gè)永恒話題,是因?yàn)檫@個(gè)話題的爭論,不會(huì)有定論。一方面,有不少人叫囂著,程序員三十歲之前一定要轉(zhuǎn)管理和行政,否則前途堪憂。想想老拳擊手面對(duì)精力充沛的的窘境吧。體力、精力、學(xué)習(xí)能力都不如人,只能吃老本。另一方面,有不少三四十歲甚至更大的資深程序員現(xiàn)身說法,并舉例說,在國外(這里的國外,自然是指那些發(fā)達(dá)國家,其他的欠發(fā)達(dá)國家,很少有人會(huì)在意),十年經(jīng)驗(yàn)以上的程序員才是一個(gè)軟件公司真正的中堅(jiān)力量。這兩種說法都有道理,各有其適用范圍。但是,無論持何種看法的人,都同意這一點(diǎn):程序員是一個(gè)感分嚴(yán)重的職業(yè),每天都在擔(dān)心自己會(huì)被淘汰。當(dāng)然,職業(yè)感并非程序員這個(gè)職業(yè)獨(dú)有,而是這個(gè)時(shí)代的象征。有一個(gè)流行詞語叫做充電。每個(gè)人都在著上夜大、進(jìn)修、考研、考證、考,生怕被時(shí)代大潮所拋下。各類資格,學(xué)業(yè)證明,能夠給人以極大的安全感。似乎手中有了證,就有了將來兌換成貨幣的保證。從前,我們說,手中有糧,心中不慌?,F(xiàn)在,我們說,手中有證,心中不慌。程序員這個(gè)行業(yè)也不例外。為了滿足軟件從業(yè)人員考證的需求,各大公構(gòu)提供了多種多樣的認(rèn)證以及相關(guān)程序員是否應(yīng)該考證?這也是在程序員群體中引起過爭論的一個(gè)話當(dāng)時(shí)有牛人放出這樣的豪言:真正有能力的程序員是從來不考證的。考證是缺乏自信心的表現(xiàn)。認(rèn)證是一個(gè)程序員一生的污點(diǎn)!對(duì)于這種說法,我是舉雙手雙腳贊成的。因?yàn)槲覜]有考過任何認(rèn)證。當(dāng)然,真正的原因是因?yàn)榭甲C費(fèi)用太貴,而并非我過于自信于自己的能力。事實(shí)上,和所有浮躁的年輕人一樣,我也是相當(dāng)缺乏自信的。同所有年輕的程序員一樣,我千方百計(jì)、嘔心瀝血地尋找提高技術(shù)能力的方法。技術(shù)書籍,閱讀技術(shù)文檔,閱讀開源代碼,技術(shù),追蹤技術(shù),等等,這些大家都干過的事情,我也通通干過?,F(xiàn)在回顧過去,不禁感慨萬千。當(dāng)年的我,就像一只無頭一般,四處亂撞,極度想找到出路,卻四處碰壁。我一直想多積累一些原理性方面的知識(shí)和經(jīng)驗(yàn),卻不得其門而入,徒然在的資料性知識(shí)上浪費(fèi)了太多的時(shí)間和精力。多年以后,我終于摸到了一點(diǎn)門徑,卻已經(jīng)青春不再。當(dāng)然,我還是比小說《一塊牛排》里面的那個(gè)老拳擊手幸運(yùn)一點(diǎn)。程序員這個(gè)職業(yè)歸根結(jié)底還是和智力相關(guān)的。體力會(huì)隨著的增長而逐年下降,但智力不會(huì)?;蛘哒f,不全會(huì)。人的智力分為兩部分。一部分叫做流體智慧,指那些會(huì)隨著增長而消退的能力,比如,反應(yīng)能力,機(jī)械力,等。一部分叫做晶體智慧,這那些不會(huì)隨增長而消退的能力,比如,邏輯思維能力,理解能力,等?;畹嚼?,學(xué)到老,指并不只是一句勵(lì)志空話,而是有一定心理學(xué)依據(jù)的。這本書主要講述的都是這些年來我個(gè)人積累的一些計(jì)算機(jī)編程方面的原理方面的知識(shí),希望能夠?qū)Τ绦騿T朋友們有所助益。另外,我有很多親戚朋友,沒有接觸過編程,對(duì)于計(jì)算機(jī)的了解也僅限于日常使用。他們覺得計(jì)算機(jī)程序挺神秘的。我希望,這本書能夠?qū)τ谒麄冞@些非計(jì)算機(jī)相關(guān)行業(yè)人員也能夠有所幫助。換句話說,我希望,這本書能夠起到普及計(jì)算機(jī)知識(shí)、宣傳計(jì)算機(jī)文化的作二是為了延長本書的生命力。編程語言是有生命期限的,說不定什么時(shí)候就會(huì)過時(shí),被掃入歷史的堆。一門編程語言的風(fēng)光時(shí)間一般也就是十年左右。而自然語言(即漢語、英語等語言)的來以說是永不過時(shí)的。這本書的內(nèi)容,都是我個(gè)人認(rèn)為在幾十年內(nèi)都不會(huì)過時(shí)的重要編程模式。我不希望本書的生命力受到某種編程語言代碼的生命周期影響。這句話說得有點(diǎn)大了。所以,這里,我需要適時(shí)地惶恐一下。不,應(yīng)該說是惶其實(shí),早在幾年前,我就想寫這本書了。那時(shí)候,我花費(fèi)偌大心力弄懂一些重要的編程概念或者編程模型,一種自得自滿的心理油然而生:“原來是這么回事啊。以前看的那些書籍資料上寫的根本就不對(duì)嘛,簡直就是誤導(dǎo)。我估計(jì),那些作者可能自己都沒有理解透徹,就半懂不懂地寫出來了。若是我來寫,我一定會(huì)寫得更加清晰易懂?!被靖拍钆宄?,就等于打通了瓶頸。以前看不懂的那些專業(yè)之類的資料也大致能夠看懂了,對(duì)于問題的理解也會(huì)隨之加深。這時(shí)候,我才明白,我之前的自以為透徹的理解是多么粗淺和無知。與那些半通不通的書籍資料相比,我也只不過是五十步笑百步而已。我深受打擊,不敢再動(dòng)筆,生怕貽笑大方。我總想著,再多積累一些知識(shí),寫得更有深度一些。但隨著時(shí)間的推移,我發(fā)現(xiàn),我接觸到的未知領(lǐng)域越來越多,已經(jīng)遠(yuǎn)遠(yuǎn)超出了我的智力限度。再這樣下去,這本書可能也寫不出來了。我甚至有了放棄這本書的想法。但是,寫一本編程書籍的事情,早已為人所知(唉,那時(shí)候年少輕狂,嘴上沒把門的)一些朋友還關(guān)心地問我進(jìn)度如何。每次都弄得我很尷尬。最后,我下定了決心,還是把這本書寫出來算了,也算給自己一個(gè)交待??梢哉f,這本書是我技術(shù)生涯的重要總結(jié)。書中內(nèi)容都是我認(rèn)為的“所有人都應(yīng)該早知道,但很多人卻不知道,或者說,不清楚的重要編程概念”。我不敢保證這本書有多么好。我只能保證,我寫的東西,都是別人沒寫到的內(nèi)容,或者說,沒寫到這種深度的。另外,我會(huì)竭盡所能,保證這本書的趣味性和生動(dòng)性。我現(xiàn)在還記得,我曾經(jīng)讀過的一些計(jì)算機(jī)教科書是面目可憎,枯燥乏味。如果我寫的書給讀者這種覺,那我還不如找一塊豆腐,一頭……不,一下扔到鍋里煮了吃了算了。人生苦短,及時(shí)行樂。寓教于樂,才是王好了,以上就是序章部分。按理來說,序言寫到這里也就結(jié)束了。但我不。關(guān)于“要是當(dāng)年早知道”這個(gè)話題,我還有很多話要說。要是當(dāng)年早知道口語的重要性,我就每天早晨去大喊瘋狂英語要是當(dāng)年早知道這些編程原理知識(shí),我早就應(yīng)該選定好方向,一個(gè)獨(dú)創(chuàng)的軟件作品說不定已經(jīng)成型了。要是當(dāng)年早知道那些創(chuàng)業(yè)期公司會(huì)上市,我早就應(yīng)該加入進(jìn)去,現(xiàn)在都可以退休享受生活了。要是當(dāng)年早知道會(huì)瘋漲,我借錢也要去買,現(xiàn)在不知道翻了幾千倍了每個(gè)人可能都會(huì)像我一樣,因?yàn)殄e(cuò)失了各種各樣的大好良機(jī),而滿懷大大小小的遺為了彌補(bǔ)這種遺憾,網(wǎng)上悄然興起一種“重生”文學(xué)。中心內(nèi)容是,一個(gè)人突然回到了多年前,有了重活一次的機(jī)會(huì),可以彌補(bǔ)當(dāng)年的種種缺憾。這類小說,引不起我的閱讀,但卻了我關(guān)于職業(yè)生涯的一些思考。如果人生真的可以重來的話,我還這個(gè)問題,我思考了很久。最終答案是:會(huì)。因?yàn)槟莻€(gè)時(shí)候,我別無選我在網(wǎng)上看過一個(gè)在的中國留學(xué)生寫的文章。在學(xué)校里,經(jīng)常有些歐美同學(xué)很好奇地問那個(gè)中國留生:“為什么都喜歡學(xué)計(jì)算機(jī)呢?”那些歐美同學(xué)的專業(yè)各異,有哲學(xué),有考古學(xué),都是各人感趣的科目。面對(duì)這個(gè)問題,那個(gè)中國留學(xué)生通常無言以對(duì)。他只能在心里吶喊:“你以為學(xué)計(jì)算機(jī)嗎?我們不好找工作,是我當(dāng)年求學(xué)報(bào)專業(yè)時(shí)的唯一考量。當(dāng)然,計(jì)算機(jī)專業(yè)并非唯一的好找工作的專業(yè)。就在報(bào)志愿前,我遇到了一個(gè)智者。當(dāng)然,那個(gè)智者也不過是農(nóng)村里一個(gè)普通的中年體力勞動(dòng)者,滿面滄桑和風(fēng)霜,生活的重?fù)?dān)在他身上留下了深刻的印記,卻并沒有磨滅他樂觀外向的性格。他喜歡閑談吹牛,和我侃了好久。他建議我學(xué)醫(yī),因?yàn)獒t(yī)生是任何時(shí)代都少不了的職業(yè),而且,醫(yī)生是一種越有經(jīng)驗(yàn)越值錢、越老越值錢的職業(yè)。我當(dāng)時(shí)還開了一個(gè)玩笑,說,醫(yī)生這個(gè)職業(yè)還是要退休的。上,唯一沒有退休限制的職業(yè)只有兩種,一種是,一種是總統(tǒng)。我還講了一個(gè)關(guān)于的笑話。那人聽了,哈哈一笑,談興更濃,又說起了幾種保值的職業(yè),即越有經(jīng)驗(yàn)越值錢、越老越值錢的職業(yè),比如,教師,技工,以及其他利于積累資格和經(jīng)驗(yàn)的職業(yè)。那番談話給我留下了很深的印象。我也確實(shí)慎重考慮過他的建議。但是,出于急功近利的心理,我最終還是選擇了有吃青春飯嫌疑的計(jì)算機(jī)專業(yè)。現(xiàn)在看來,那真是一種短視的行為。幸虧我從這個(gè)職業(yè)中獲得了智力上的樂趣,還不至于后悔當(dāng)年的選擇。市面上曾經(jīng)流行過一本書(也許現(xiàn)在還在流行?)——《窮,富》。這句話是廢話,地球人都知道,只是做不到,我們不去理會(huì)該書的另一個(gè)重要觀點(diǎn)是鼓勵(lì)人們創(chuàng)業(yè)開公司。因?yàn)殚_公司是先花錢,再根據(jù)剩下的錢交稅。而拿工資是先交稅,再花剩下的錢。這條信息對(duì)我挺有用的。但是,對(duì)于很多人來說,可能只是簡單的。我們也不去理會(huì)它我們來看該書表達(dá)的第三個(gè)觀點(diǎn):當(dāng)你需要為一件事情長期投入時(shí)間和精力的時(shí)候,你最好想到幾十年后你年老時(shí)的情景。書中舉了一個(gè)例子。作者年輕的時(shí)候,想在網(wǎng)球和球這兩項(xiàng)運(yùn)動(dòng)中選擇一項(xiàng),作為自己的主要業(yè)余動(dòng)。這里說明一下,在地廣人稀的國家,球場并非稀缺資源,球也不是多么化的運(yùn)動(dòng),而是一種比較常見、花費(fèi)不高的平動(dòng)。我就見過,一些十幾歲的小孩子,連球車的錢都不愿意出,自己球袋,一桿一桿,在偌大的球場上長途跋涉。如果在寸土寸金的地方,這樣的小孩子也許只有當(dāng)球童,才有機(jī)會(huì)進(jìn)入球場吧。作為一個(gè)年輕人,作者想選擇對(duì)抗更激烈、運(yùn)動(dòng)量更大的網(wǎng)球。他的父親勸他,“網(wǎng)球和球都是需要投入大量時(shí)間訓(xùn)練才能取得技巧的運(yùn)動(dòng)。你選了一項(xiàng),就勢(shì)必要放棄另一項(xiàng)。你想一下,當(dāng)你年老的時(shí)候,你就打不動(dòng)網(wǎng)球了。那時(shí)候,如果你再學(xué)球,那么獲得的成就會(huì)很有限,你獲得的快樂也會(huì)很有限。”作者經(jīng)過深思熟慮后,“明智”地選擇了球,而他的同齡朋友(似乎就是那個(gè)“窮”的兒子)擇了網(wǎng)球。幾十年后,作者證明了自己選擇的正確:他的朋友打不動(dòng)網(wǎng)球了,再學(xué)球也錯(cuò)過了最佳階段,而作者已經(jīng)是一個(gè)球高手了。這個(gè)例子對(duì)我的觸動(dòng)很大。我這么說,并非我認(rèn)為球就一定比網(wǎng)球明智——那個(gè)選擇網(wǎng)球的同齡朋友很可能有自己的想法,比如,網(wǎng)球更受子的歡迎,更容易泡到妞,等等。這個(gè)理由對(duì)于的男孩子來說,是壓倒一切的。這個(gè)例子之所以觸動(dòng)我,是其中所表現(xiàn)的一種原則——當(dāng)你決定投入相當(dāng)長、相當(dāng)多的時(shí)間去做一件事情的時(shí)候,最好能夠想到幾十年后年老的情景。也許,在你選擇一項(xiàng)或者運(yùn)動(dòng)的時(shí)候,這個(gè)原則的重要性還不是那么明顯。但是,當(dāng)你選擇一項(xiàng)職業(yè)的候,這個(gè)原則的重要性就不言而喻了。如果按照這個(gè)原則來看,小說《一塊牛排》里描述的那個(gè)老拳擊手顯然了職業(yè)。所有的運(yùn)動(dòng)員行業(yè)都是吃青春飯的,尤其是高強(qiáng)度體力運(yùn)動(dòng)。選擇這類職業(yè),一定要提前選擇好退路,要么功成身退,嫁入豪門,要么向。俗話說,女怕嫁錯(cuò)郎,男怕入錯(cuò)行。正如對(duì)女人的重要性如同第二次投胎一樣,職業(yè)對(duì)的重要性也如同第二次重生。這話很俗,很糙,很不入耳,但是,這卻是一條普遍適用于社會(huì)中大部分人的通行法則。部分意志強(qiáng)大、能力出眾的人才能夠擺脫這條法則的影響。有能力的人,在哪一行都能干出個(gè)名堂來,干什么行業(yè)都能成為行業(yè)翹楚。那些人可以很牛地說:沒有不行的行業(yè),只有不行的但我不是那樣的人。那樣的人能夠壓倒一切,而我,只會(huì)被一切壓所以,對(duì)大部分人都起作用的原則,對(duì)我也一定會(huì)起作用,而且很可能會(huì)特別起作最后,讓我吐露一下心中的奢我希望,本書能夠幫助程序員這個(gè)職業(yè)成為一種長期的、創(chuàng)造性的、充滿樂趣和智力的職業(yè)時(shí)時(shí)間:2011-08-29關(guān)鍵字《編程機(jī)制探析》第二章計(jì)算機(jī)語我們先來看一則小故老鼠帶著孩子拼命奔逃,一只貓?jiān)诤竺婢o追不舍那只貓嚇了一跳,轉(zhuǎn)身就老鼠松了一口氣,抓緊機(jī)會(huì),對(duì)驚魂未定的孩子教育道:“看見沒?學(xué)好一門外語是重要??!”計(jì)算機(jī)語言實(shí)則也是一門外語。掌握這門外語也非常的重要。掌握了計(jì)算機(jī)語言,就等于掌握了與計(jì)算機(jī)交流的。人類發(fā)明了各種工具,作為自己身體的延伸。交通工具是腳的延伸,操作工具是手的延伸,而計(jì)算機(jī),則是大腦的延伸。計(jì)算機(jī)在中文里有一種十分形象化的翻譯——電腦。由于這種翻譯形象生動(dòng),言簡意賅,很快就流行起來,成為大眾化的稱呼。不過,業(yè)內(nèi)對(duì)電腦這種叫法卻一種略帶不屑的心理,感覺那是非專業(yè)的的叫法。業(yè)內(nèi)只把計(jì)算機(jī)準(zhǔn)確地叫做計(jì)算機(jī)。計(jì)算機(jī)的英文是Computer,就是計(jì)算器、計(jì)算工具的意思。一些更專業(yè)的,甚至直接把計(jì)算機(jī)叫做機(jī)器。在他們的眼里,計(jì)算機(jī)只不過是機(jī)器的一種,和其他種類的機(jī)器沒有什么本質(zhì)上的區(qū)別。這種叫法體現(xiàn)了作為人類的專業(yè)的一切盡在掌握的優(yōu)越感。而電腦這種稱呼則無形中把計(jì)算機(jī)提高到與人類大腦平齊的程度,體現(xiàn)了對(duì)計(jì)算機(jī)這種神秘的、先進(jìn)的事物的尊敬和崇拜感。所以,如果你需要昭顯自己的專業(yè)程度,最好把計(jì)算機(jī)叫做計(jì)算機(jī),或者直接叫做機(jī)器。不過,我個(gè)人十分喜歡電腦這種形象而浪漫的稱呼。計(jì)算機(jī)、機(jī)器這些稱呼過于機(jī)械化,無形中為這個(gè)行業(yè)中多增加了一分枯燥和呆板。當(dāng)然,為了準(zhǔn)確起見,本書還是會(huì)使用計(jì)算機(jī)這個(gè)名詞。畢竟,雖然計(jì)算機(jī)能夠做的工作越來越多,但本質(zhì)上做的還是計(jì)算工作,還不能代替人類思考,達(dá)不到“腦”的程度。也許將來某一天,隨著人工智能的發(fā)展,計(jì)算機(jī)能夠真正地成為“電腦”。人類發(fā)明的現(xiàn)有工具中,有哪些與計(jì)算機(jī)比較類似呢?首先躍入腦海的自然是計(jì)算工具,比如,算盤,計(jì)算器,等。沒錯(cuò),顧名思義,計(jì)算機(jī)本質(zhì)上做的就是計(jì)算工作。不過,計(jì)算機(jī)的計(jì)算工作方式與其它計(jì)算工具卻大相徑庭。傳統(tǒng)的計(jì)算工具,比如,算盤,計(jì)算器,其工作方式就如同懶蛤蟆一樣,按一下,跳一下。每一個(gè)計(jì)算步驟,都需要人的參與,才能繼續(xù)下去。計(jì)算機(jī)完全不同。計(jì)算機(jī)的優(yōu)越之處在于奇快無比(當(dāng)然是和人類相比)的計(jì)算速度,一秒鐘之內(nèi)能夠進(jìn)千上萬、甚至上億次運(yùn)算,遠(yuǎn)遠(yuǎn)超過了人類的反應(yīng)速度。如果計(jì)算機(jī)的每一步計(jì)算都需要人的參與,那么必將極大拖慢計(jì)算機(jī)的速度,極大浪費(fèi)計(jì)算機(jī)的工作潛力。計(jì)算機(jī)的這種特性決定了計(jì)算機(jī)的工作方式:先由工作人員(即程序員)事先編制好計(jì)算過程(即計(jì)算機(jī)程序),然后,把計(jì)算過程傳給計(jì)算機(jī),并讓計(jì)算機(jī)按照計(jì)算過程執(zhí)行;然后,就是計(jì)算機(jī)的活了;,你些跑哎,快些跑!計(jì)算機(jī)就飛快地運(yùn)轉(zhuǎn)起來,以瞬息萬千的速度執(zhí)行著計(jì)算程序。最早的計(jì)算機(jī)概念模型——圖靈機(jī),就是這樣一個(gè)機(jī)器:一方面,它接受一條輸入紙帶,上面印滿了計(jì)算過程;另一方面,它吐出一條紙帶,上面寫滿了計(jì)算結(jié)果。上圖為“圖靈機(jī)的藝術(shù)表示”,源自于互聯(lián)網(wǎng)自由共享資源(作者Schadel任何人為任何目的使用這項(xiàng)作品)。注:這里說明一下,為了增強(qiáng)本書的趣味性,我會(huì)在書中一些生動(dòng)有趣的。為了表達(dá)對(duì)作者的尊重,并避免問題,我會(huì)盡量使用公共的自由共享,并給出作者信息。如果你曾經(jīng)見過八音盒的內(nèi)部構(gòu)造的話,你就不會(huì)對(duì)這種結(jié)構(gòu)感到陌生。八音盒是一種機(jī)械音樂的裝置可以看作是一種版的、不需要用電的留聲機(jī)。我小時(shí)候沒有見過八音盒,甚至不知道這種東西的存在。長大之后,我才見到了八音盒。那么一個(gè)小小的裝置可以發(fā)出連續(xù)清脆的音樂,令我感到很奇妙。我很想弄懂它的工作原理。恰好,不久之后,我就見到了一個(gè)被拆開的八音盒。其內(nèi)部工作原理立刻昭然若揭了。八音盒的發(fā)音裝置很簡單,就是一個(gè)小金屬滾筒,加一排細(xì)細(xì)的金屬。金屬滾筒上布滿了小小的凸起。當(dāng)金屬滾筒在發(fā)條的帶動(dòng)下,開始轉(zhuǎn)動(dòng)的時(shí)候,那些小小的凸起就會(huì)撥動(dòng)和金屬滾筒挨在一起的那排細(xì)細(xì)的金屬,就像一個(gè)人在彈鋼琴一樣,只不過樂譜早已在金屬滾筒上了。那些小小的凸起,實(shí)際上就是一部樂譜,其位置排列都是按照樂譜來設(shè)定的。有一個(gè)叫做akkogolld的藝術(shù)家,根據(jù)八音盒的原理做出了一個(gè)叫做“城市音樂”(ityMusic)的巨型八音盒:一個(gè)巨大的木桶上雕刻了一座城市的浮雕,旁邊挨著一個(gè)鋼琴;當(dāng)木桶轉(zhuǎn)動(dòng)的時(shí)候,就會(huì)撥動(dòng)琴弦,奏出這個(gè)城市的音樂。在akkogolenbeld的,http://a 從外部觀察到的工作原理上來說,圖靈機(jī)模型和八音盒的工作機(jī)制是一樣的。八音盒滾筒上的按照樂譜編凸起排列,就相當(dāng)于機(jī)模型中的布滿了計(jì)算過程指令的輸入紙帶;八音盒出來的音樂,就相當(dāng)于當(dāng)然,兩者的區(qū)別還是很大的。八音盒構(gòu)造極為簡單,只是一個(gè)簡單的發(fā)音裝置。機(jī)的內(nèi)部計(jì)算部件則極講到這里,先關(guān)于的題外話。機(jī)這個(gè)名字來自于英國著名的數(shù)學(xué)家?。機(jī)這個(gè)模型就是提出來的,并因此而得名。計(jì)算機(jī)的最高獎(jiǎng)項(xiàng)——,也因此而得名。可以說,在計(jì)算機(jī)界的地位,無人可以撼動(dòng)。但是,的一生,卻在悲劇中結(jié)束。52年,的傾向,并因此而被判——“有傷風(fēng)化罪”(根據(jù)英國當(dāng)時(shí)的刑法,從此案例中可以窺見當(dāng)時(shí)所謂文明國家的文明程度),被迫接受了“化學(xué)”——即女性注射,消退。此種刑法在不少歐家和地區(qū)實(shí)行。據(jù)說,此法能夠有效遏制性。兩年后,服用毒蘋果身亡。據(jù)說,其靈感來自于迪斯尼動(dòng)畫片《公主》中的一句歌詞——“毒液蘋果如睡之死滲入”。有一種說法,蘋果公司的標(biāo)志——被咬了一口的蘋果——就是為了紀(jì)念的。看了的往事,令人不得不想到另一位同樣性傾向的的巨星——。不過,時(shí)過境兩者境遇已經(jīng)完全不同。并非因?yàn)樯鐣?huì)壓力而,而是因?yàn)椴⊥凑勰ザx擇結(jié)束了自己的生命。生在不同時(shí)代的兩個(gè)名人,同樣是,同樣是日不落英輻射下的地區(qū),雖然終點(diǎn)相似,人生好了,題外話就說到這里,我們言歸正傳,回到計(jì)算機(jī)語言的話題首先,我們需要考慮的問題是,計(jì)算機(jī)為什么需要一門語言?或者說,計(jì)算機(jī)憑什么需要一門語言?人類自詡為萬物之靈長,一向自以為優(yōu)越于其他物種,其最為自豪的能力之一就是語言能力。而計(jì)算機(jī),不過是人類發(fā)明出來的一種計(jì)算工具,它憑什么可以擁有一門語其他的計(jì)算工具,比如算盤、計(jì)算器,從來都是人類撥一下,動(dòng)一下,從沒有奢望擁有什么語言。計(jì)算機(jī)為什么就這么特殊呢?計(jì)算機(jī)確實(shí)就是這么特殊。前面說了,計(jì)算機(jī)的最為強(qiáng)大的能力,就是奇快無比的運(yùn)算速度。為了最大發(fā)揮它的效能,不至于讓人類的極低反應(yīng)速度拖累它的功效,人類盡可能提前編制好計(jì)算過程,地傳給計(jì)算機(jī),讓它獨(dú)立而不受干擾地運(yùn)行。這份提前編制好的“計(jì)算過程”是要交給計(jì)算機(jī)來執(zhí)行的。計(jì)算機(jī)必須能夠理解這份“計(jì)算過程”,才能夠按章辦事。這意味著,人類與計(jì)算機(jī)之間需要一種交流方式,換句話說,需要一種語言,這就是計(jì)算機(jī)語言。計(jì)算機(jī)語言是人類設(shè)計(jì)出來的、由計(jì)算機(jī)理解并執(zhí)行的一種語言。計(jì)算機(jī)雖然計(jì)算速度遠(yuǎn)超人類,但語言能力極其有限,只能理解最為基本的單詞和語法。計(jì)算機(jī)能夠理解的單詞,只有那么幾個(gè),基本上全是和本職工作相關(guān)的動(dòng)詞。其中,大部分都是關(guān)于計(jì)算的動(dòng)詞,比如,加、減、乘、除。這幾個(gè)運(yùn)算動(dòng)詞,由計(jì)算機(jī)的“腦部”執(zhí)行。這些計(jì)算動(dòng)詞的意義和我們熟悉的四則運(yùn)算基本一樣,不難理解,不多做解釋。這個(gè)動(dòng)作的關(guān)鍵在于來源地址和目標(biāo)地址。比如,從哪里“存”到哪里?從哪里“取”到哪里?這個(gè)問題涉及到計(jì)算機(jī)的體系結(jié)構(gòu),比較復(fù)雜,我們后面慢慢闡述?,F(xiàn)在,只要知道計(jì)算機(jī)有這么兩個(gè)用“手”的動(dòng)作用來存取數(shù)據(jù)就可以了。當(dāng)然,這個(gè)“手”,只是計(jì)算機(jī)內(nèi)部的手,只能在計(jì)算機(jī)內(nèi)部伸來伸去,并不能伸到計(jì)算機(jī)的外部。另外,計(jì)算機(jī)還有一個(gè)用“腳”的動(dòng)作——跳轉(zhuǎn)。同樣,這個(gè)動(dòng)作涉及到來源地址和目標(biāo)地址的問題。比如,從哪里“跳”到哪里?這個(gè)問題同樣涉及到計(jì)算機(jī)的體系結(jié)構(gòu),我們后面慢慢闡述。現(xiàn)在,我們只要知道計(jì)算機(jī)有這么一個(gè)用“腳”的動(dòng)作就可以了。當(dāng)然,這個(gè)“腳”,只是計(jì)算機(jī)內(nèi)部的腳,只能在計(jì)算機(jī)內(nèi)部跳來跳去,并不能跳到計(jì)算機(jī)的外部。計(jì)算機(jī)進(jìn)行“跳轉(zhuǎn)”動(dòng)作的時(shí)候,并不是像我們?nèi)祟愄垡粯樱瑥囊粋€(gè)公司跳到另一個(gè)公司,而是轉(zhuǎn)換工作內(nèi)容——放下手頭現(xiàn)有的工作,去做另一樣工作。有了上述這些基本動(dòng)詞之后,我們就可以讓計(jì)算機(jī)做事了。我們可以事先寫好計(jì)算過程,比如,“先算這個(gè),再算那個(gè)。先做這個(gè),再做那個(gè)。跳到那里,再跳到這里……”計(jì)算機(jī)接受到這些指令之后,就會(huì)一絲不茍地按章辦事,樂此不疲,運(yùn)轉(zhuǎn)不停(如果不出錯(cuò)的話),直到運(yùn)行到最后一條指令為止。這種工作方式,很像是當(dāng)年的產(chǎn)業(yè)工人的工作方式。有一種“手冊(cè)工人”的說法,即一切按照手冊(cè)辦事,不需要思考,不需要質(zhì)疑,只需要按章辦事。這種工作方式確實(shí)極大地提高了企業(yè)的生產(chǎn)力。但是,這種把人類機(jī)械化的做法,必然會(huì)付出代價(jià)。企業(yè)已經(jīng)認(rèn)識(shí)到這一點(diǎn),開始采用更加人性化的管理方式,不僅保護(hù)了工人的身心健康,還提高了工作效率和產(chǎn)品質(zhì)量。計(jì)算機(jī)是電子機(jī)械產(chǎn)品,沒有情緒波動(dòng),沒有思想活動(dòng),更沒有心理健康的問題,承擔(dān)“手冊(cè)工人”的工作是再合適不過了。但是,現(xiàn)實(shí)中總是充滿了意外情況,“手冊(cè)工人”也會(huì)碰到意外。這就像一個(gè)產(chǎn)業(yè)工人在安裝螺絲的時(shí)候,恰好拿到了一顆壞螺絲,如果嚴(yán)格按章辦事的話,就會(huì)把壞螺絲裝上去。這時(shí)候,就需要在工作流程上加上一條——如果螺絲壞了,那么換一個(gè)新螺絲,安裝上去;如果螺絲沒壞,安裝上去。這就需要產(chǎn)業(yè)工人擁有判斷螺絲壞沒壞的能力。同樣,計(jì)算機(jī)也要擁有類似的判斷能力。這就引入了一個(gè)新的計(jì)算機(jī)語指令——判斷指令。判斷指令的引入,給計(jì)算機(jī)帶來了基本的邏輯判斷能力。當(dāng)計(jì)算機(jī)遇到“壞螺絲”的情況時(shí),會(huì)跳轉(zhuǎn)到“換螺絲”的工作手冊(cè),進(jìn)行“換螺絲”的工作流程,直到換到一個(gè)好螺絲,才會(huì)跳轉(zhuǎn)到“安裝螺絲”的工作手冊(cè)。好了,現(xiàn)在,我們已經(jīng)湊齊了必備的計(jì)算機(jī)指令——加減乘除、存取、跳轉(zhuǎn)、判斷。我們可以看到,這些詞匯全都是動(dòng)詞,并沒有名詞,形容詞,副詞,助詞,感嘆詞。這很好,很符合計(jì)算機(jī)的氣質(zhì)。計(jì)算機(jī)沒有情感(至少現(xiàn)在還沒有),計(jì)算機(jī)不會(huì)思考(至少現(xiàn)在還不會(huì)),計(jì)算機(jī)不需要讀心情散文,也不需要讀生活哲理,它只需要按章辦事,它只需要看懂工作手冊(cè)就行了。計(jì)算機(jī)的字典里,全都是動(dòng)詞,而且全都是祈使動(dòng)詞,全都是人類發(fā)給它令——做這個(gè),做那個(gè),做十用計(jì)算機(jī)語言編制的“計(jì)算過程”——即計(jì)算機(jī)程序——就是一篇充滿了祈使命令語句的工作流程。這種以祈使命令為的計(jì)算機(jī)語言,也叫做命令式語言,從英文Imperatieage翻譯而來。Imperative這個(gè)詞的意思,就是命令的,強(qiáng)制的,祈使的。現(xiàn)在就有一個(gè)問題了。既然專門有一個(gè)詞語來定義計(jì)算機(jī)令式語言,難道計(jì)算機(jī)還有非命令式語言嗎?答案是,沒錯(cuò),確實(shí)有其他類型的非命令式的計(jì)算機(jī)語言,但都是非主流,非主旋律,我們后面再講到它們?,F(xiàn)在,還是讓我們回到計(jì)算機(jī)語言的最基本的詞匯表上來。前面講了,計(jì)算機(jī)的字典中,詞匯極其有限,主要就是那么幾個(gè)動(dòng)詞——加減乘除、存取、跳轉(zhuǎn)、判與人類日常生活中使用的自然語言相比,計(jì)算機(jī)語言是如此的簡單和貧乏,簡直了“語言”這個(gè)詞兒。果外語都這么簡單,那就太好了。人們期望計(jì)算機(jī)某一天能夠理解人類的自然語言,那時(shí)候,事情就簡單了,人們可以像吩咐助手一樣,用日常使用的自然語言吩咐計(jì)算機(jī)(那時(shí)候,應(yīng)該叫做智能機(jī)器人了)做事,也不用編什么程序了。好了,讓我們回到現(xiàn)實(shí)。我們現(xiàn)在面對(duì)的現(xiàn)實(shí)是,計(jì)算機(jī)就那么一點(diǎn)的理解能力,須去理解它,而不是指望它來理解我們。當(dāng)然,我們還是一種奢望,盡可能地提高計(jì)算機(jī)的理解能力,讓它盡量地理解我們。這就要具體分析計(jì)算機(jī)的理解能力了,看看它到底能夠理解到什么層次。首先,計(jì)算機(jī)從出廠開始,就可以理解最基本的詞匯集——加減乘除、存取、跳轉(zhuǎn)、判斷。這些語言指令是固化在計(jì)算機(jī)硬件里面的。如果沒有軟件支持的話,計(jì)算機(jī)的語言理解也就到這個(gè)層次了。這種語言叫做匯編語言,是計(jì)算機(jī)天生就能夠理解并執(zhí)行的語言,因此,也叫做計(jì)算機(jī)底層語言。在計(jì)算機(jī)行業(yè)里,底層這個(gè)詞,與社會(huì)底層這個(gè)詞里的底層含義不同,甚至恰好相反。在計(jì)算機(jī)術(shù)語里,底層,意味著硬件層次。越底層,就越接近硬件層次,意味著專業(yè)程度越高、技術(shù)難度越高。匯編語言,就是計(jì)算機(jī)不需要軟件支持,僅憑本身硬件,能夠直接理解并且執(zhí)行的語言。因此,匯編語言可謂是最底層的語言。這門語言為什么叫做匯編語言。說實(shí)話,我也不知道。這個(gè)詞是從英文Assmblyage翻譯過來的。Assembly這個(gè)詞帶有集成、裝配的含義,意思是把一堆大大小小的零件裝配在一起,集成一個(gè)整體。我們可以大致把匯編語言理解為一種最基本的配件級(jí)別的語言。匯編語言的幾個(gè)基本單詞——加減乘除、存取、跳轉(zhuǎn)、判斷——可以直接交給計(jì)算機(jī)理解并執(zhí)行,只是其中還要經(jīng)過一個(gè)機(jī)器語言編碼的過程。這種機(jī)器語言編碼的原理和過程極為類似于電報(bào)收發(fā)時(shí)采用的“摩爾斯”電碼。原始的電報(bào)發(fā)報(bào)機(jī)只能發(fā)出極為有限的音節(jié),比如,短音的嘀,長音的嘀。為了讓發(fā)報(bào)機(jī)能夠表達(dá)豐富多樣的自然語言文字,人們必須給每個(gè)文字定義一個(gè)由一串短音嘀和長音嘀組成的編碼。這就叫做“摩爾斯”電碼。同樣,計(jì)算機(jī)能夠識(shí)別的基本信號(hào),也是極為有限的,只有“0”和“1”兩種信號(hào)。那么,匯編語言中的每一個(gè)基本詞匯,都必須指定一個(gè)由一串“0”和“1”組成的編碼,計(jì)算機(jī)才能夠識(shí)別并執(zhí)行。計(jì)算機(jī)有了匯編語言,就有了與人類交流的最根本的基礎(chǔ)。人類可以通過匯編語言來編制各種各樣的計(jì)算機(jī)程序,交給計(jì)算機(jī)執(zhí)行。但是,匯編語言太基礎(chǔ)了,以至于基礎(chǔ)到人們無法的程度比如,如果想對(duì)計(jì)算機(jī)表達(dá)這么一個(gè)意思——“遇到前面的路口,向左轉(zhuǎn)”,那么,你必須寫一大串的基礎(chǔ)語句來定義這個(gè)流程:第一步,向前第二步,判斷是否遇到路這種寫法實(shí)在太繁瑣,太煩人了。為了解決這個(gè)問題,人們又創(chuàng)造出來了更高級(jí)的計(jì)算機(jī)語言,可以用更簡單、更類似于自然語言的詞匯來命令計(jì)算機(jī)做的事情。復(fù)”、“調(diào)用”這樣的幾個(gè)單詞和語法結(jié)構(gòu)而已,與人類的自然語言相比,還是簡陋得。不過,既然有匯編語言墊底,我們也姑且從眾,稱之為“高級(jí)”語言吧匯編語言是計(jì)算機(jī)硬件級(jí)別支持的,而高級(jí)語言通常是計(jì)算機(jī)軟件級(jí)別支持硬件和軟件,這兩個(gè)詞前面也反復(fù)提到過。那么,究竟什么是硬件,什么是軟件呢?這就涉及到計(jì)算機(jī)體系結(jié)構(gòu)的問題了,這也是下一章我們要探討的問題。時(shí)時(shí)間:2011-08-29關(guān)鍵字《編程機(jī)制探析》第三章計(jì)算機(jī)運(yùn)行結(jié)前文反復(fù)提到計(jì)算機(jī)的“硬件”和“軟件”這兩個(gè)概念。那么,硬件和軟件到底是什么東西呢?通俗(即,用我們的話來講),硬盤中的數(shù)據(jù)叫做軟件,除此之外,計(jì)算機(jī)所有其他的部件,全都叫做硬件。注意,硬盤本身也是硬件。因此,軟件是在硬件中的。軟件必須依托于硬件,才有依托之地。打一個(gè)不太恰當(dāng)?shù)谋确?,硬件相?dāng)于看得見、摸得著的物質(zhì)文明,而軟件就相當(dāng)于看不見、摸不著的精神文明。當(dāng)然,上述說法只是直觀的說法,不是專業(yè)的說法。那么,什么是專業(yè)的說法呢?專業(yè)的說法,必然要涉及到計(jì)算機(jī)體系結(jié)構(gòu)。提到計(jì)算機(jī)體系結(jié)構(gòu),就不得不提到馮.諾依曼結(jié)構(gòu)。正如本書不會(huì)對(duì)機(jī)展開詳述一樣,本書也不會(huì)對(duì)馮.諾依曼結(jié)構(gòu)展開詳述。當(dāng)年上學(xué)時(shí),中關(guān)于機(jī)模型和馮.諾依曼結(jié)構(gòu)的篇章可著實(shí)不少。但是,現(xiàn)在回頭去看,那兩種模型結(jié)構(gòu),的是一種紀(jì)念上的意義,加上一點(diǎn)理論基礎(chǔ)上的溯源意義。所以,本書不會(huì)詳述這兩種模型結(jié)構(gòu)。不過,總線結(jié)構(gòu)卻是不得不提的??偩€結(jié)構(gòu),是現(xiàn)代計(jì)算機(jī)仍然遵守的一種計(jì)算機(jī)體系結(jié)構(gòu)。總線,是從英文“Bus車的意思。我不明白,為什么要把這個(gè)詞翻譯成總線。也許是“總線”的意思?反正前輩們這么翻譯了,咱們也就約定俗成,姑且這么用著??偩€(Bus)結(jié)構(gòu)就像一條線路一樣,所有的計(jì)算機(jī)部件全都掛在一條總線上,所有的數(shù)據(jù)交流都通過這條線路來進(jìn)行。每個(gè)計(jì)算機(jī)部件就相當(dāng)于這條總線上的一個(gè)站點(diǎn),數(shù)據(jù)就相當(dāng)于乘客,從各個(gè)站點(diǎn)乘坐公共汽車,上上下下,從一個(gè)站點(diǎn)到達(dá)另一個(gè)站點(diǎn),即從一個(gè)硬件部件,到達(dá)另一個(gè)硬件部件。在這個(gè)總線模型中,每一個(gè)站點(diǎn)都代表一個(gè)硬件部件,線路本身——即總線本身——也是一個(gè)硬件部件。那么,在現(xiàn)實(shí)中,總線對(duì)應(yīng)計(jì)算機(jī)的哪個(gè)硬件呢?用過臺(tái)式機(jī)、并打開過機(jī)箱的讀者一定會(huì)有印象,機(jī)箱中那些東西像線路呢?那一條條的寬寬扁扁的塑料數(shù)據(jù)線,看起來就像一條條線路,難道那些就是總線?我以前就是這么以為的。但是,很遺憾,這個(gè)答案是不對(duì)的。那些扁扁的塑料線,并非總線,最多只能算是支線。那么,總線到底是什么呢?急性的讀者一定喊起來了,你廢什么話呢?還不趕緊說!好吧,我說,總線,其實(shí)就是機(jī)箱最大的部件——主板,英文叫做“Motherard”,因此也可以翻譯為母板。所有的其他硬件,包括極為重要的CPU(處理單元)、內(nèi)存、網(wǎng)卡等,全都插在主板上,其他的重要部件,如硬盤、光驅(qū)等,也都是通過塑料數(shù)據(jù)線連接到主板上。主板,就是一個(gè)信息交流中心,著所有的息交換通路。任何兩個(gè)硬件部件的信息交流,都在主板的掌握之下。總線結(jié)構(gòu)在信息交換速度和數(shù)量上是有瓶頸的。很多計(jì)算機(jī)科學(xué)家都在研究如何打破這個(gè)瓶頸。也許,將來的計(jì)算機(jī)就是非總線結(jié)構(gòu)的了。不過,目前我們使用的計(jì)算機(jī)大部分還是總線結(jié)構(gòu),所以,我們還是要對(duì)它有一點(diǎn)了解。讀者如果想對(duì)計(jì)算機(jī)主板結(jié)構(gòu)(即總線結(jié)構(gòu))了解的話,除了拆機(jī)直接察看之外,還可以用“魯大師”免費(fèi)硬件檢測軟件察看計(jì)算機(jī)硬件的具體參數(shù)。如果你需要自己安裝系統(tǒng)中的各種硬件驅(qū)動(dòng)程序的話,這類工具就很有用。關(guān)于硬件部分,就說這么多了,本書還是主要關(guān)注于軟件方面。前面講了,軟件就是硬盤上的數(shù)據(jù)。這話并不完整。因?yàn)椋脖P并不是唯一可以數(shù)據(jù)的地方,光盤、U盤等介質(zhì)中,同樣可以數(shù)據(jù),自然也可以存放軟件。只是為了簡化問題起見,我們現(xiàn)在只考慮硬盤這個(gè)最重要的數(shù)據(jù)結(jié)構(gòu)。從廣義的概念上講,所有的數(shù)據(jù)都可以看做是軟件。從狹義的概念上講,只有可以運(yùn)行的那部分?jǐn)?shù)據(jù)(即計(jì)算在硬盤上,所有的數(shù)據(jù)都以文件的形式。因此,我們通常也把硬盤等介質(zhì)中存放的數(shù)據(jù)叫做文件。軟件程序也不例外,也是以文件的形式在硬盤中。那么,這些程序文件到底是如何運(yùn)行起來的呢?這里面涉及到相當(dāng)多的寄出概念,即使是計(jì)算機(jī)業(yè)內(nèi),也不見得能夠把整個(gè)過程理得通順。比如,從學(xué)校畢業(yè)出來之后,腦海里積攢了一堆什么“進(jìn)程”、“線程”、“操作系統(tǒng)調(diào)度”之類的建立在理論模型上的詞語,卻不知其具體對(duì)應(yīng)物。以為工作中自然會(huì)了解這些具體知識(shí)。但我發(fā)現(xiàn),工作中更不需要理解這些知識(shí),只要按照前人搭好的框架,往里面添磚加瓦就可以了。我舉一個(gè)非常切實(shí)的例子,在現(xiàn)實(shí)的很多互聯(lián)網(wǎng)公司中,很多程序員(也包括以前的我),編了幾年的互聯(lián)網(wǎng)程序,卻對(duì)互聯(lián)網(wǎng)最重要的協(xié)議——HTTP——的基本原理一竅不通。這一方面說明了現(xiàn)代軟件公司在軟件開發(fā)分工管理方面的成功之處,一方面說明了程序員們本身對(duì)于基礎(chǔ)知識(shí)并不重視。說實(shí)在的,如果只是謀一份飯碗的話,基礎(chǔ)知識(shí)確實(shí)沒太大用處,不知道也照樣編程。但是,如果你像我一樣,什么事都想尋根問底,如果不了解原理心里就不踏實(shí)的話,本書對(duì)你來說就很有用了。在正理解計(jì)算機(jī)內(nèi)部運(yùn)行機(jī)理之前,我心里總是感到不踏實(shí),總覺得那里面有一種我沒有完全了解的機(jī)在起作用,說不定什么時(shí)候,它就會(huì)冒出來給我找麻煩。于是,我總是想弄明白它。后來,我把理論模型和現(xiàn)實(shí)的計(jì)算機(jī)部件結(jié)合了起來,心里立馬就有底了,不再胡思亂想,最終獲得了心靈的寧靜。(我差點(diǎn)就用了“心靈的救贖”這個(gè)詞。沒辦法,受知音體影響太大。)現(xiàn)在,我們來審視硬盤上的程序文件,看看它是如何運(yùn)行起來硬盤上的一份份程序文件,從概念上來說,都是給計(jì)算機(jī)閱讀的一份份工作流程。對(duì)于計(jì)算機(jī)來說,硬盤就是一個(gè)巨大的文件倉庫,里面存放了很多數(shù)據(jù)文件,還有很多工作流程文件(即程序)。當(dāng)計(jì)算機(jī)工作的時(shí)候,它首先要選擇一份工作流程,然后按照這份工作流程來工作。在按章辦事的過程中,它可能會(huì)根據(jù)流程規(guī)定,從硬盤這個(gè)文件存放倉庫中取出另外的一份或者多份文件。現(xiàn)在,有一個(gè)問題。當(dāng)我們說計(jì)算機(jī)在工作的時(shí)候,這個(gè)“計(jì)算機(jī)”到底是指誰?是指包括顯示器和機(jī)箱在內(nèi)的整個(gè)計(jì)算機(jī)嗎?寬泛來講,是的。嚴(yán)格來講,不是。從嚴(yán)格意義上來講,計(jì)算機(jī)中真正干活的硬件部件,只有一個(gè)。那就是處理單元CPU。只有CPU才有計(jì)算功能,只有CPU才有理解并執(zhí)行計(jì)算機(jī)程序的能力。這也是為什么它叫做“”處理單元的緣故。舍它其注:在一些高性能顯卡中,有GPU(圖形處理單元)的配置,也帶有了一點(diǎn)CPU的運(yùn)算能力,我們可以把U看作是一種專門處理圖形顯示的特殊PU。CPU的個(gè)頭并不大,在主板上只占有一小塊位置。但是,其地位卻是最重要的。主板上專門有一個(gè)風(fēng)扇它扇風(fēng)。生怕它太熱太疲勞。沒辦法,誰讓人家勞苦功高呢。整個(gè)機(jī)箱中,就它一個(gè)人在真正干活。CPU有自己的工作臺(tái),學(xué)名叫做“寄存器”。但是,這個(gè)叫做“寄存器”的工作臺(tái)太小,而硬盤那個(gè)文倉庫中的每個(gè)文件都是那么的巨大,工作臺(tái)上根本就放不下。于是,CPU就在工作臺(tái)旁邊放了一個(gè)巨大的木架,叫做“內(nèi)存”。CPU工作的時(shí)候,先把需要執(zhí)行的工作流程從硬盤那個(gè)文件倉庫中取出來,放到內(nèi)存那個(gè)木架上。內(nèi)存這個(gè)木架足夠大,可以放得下巨大的文件。然后,CPU就把內(nèi)存中的文件數(shù)據(jù),一部分一部分地取出來,放在自己的“寄存器”工作臺(tái)上,進(jìn)行處理。這個(gè)動(dòng)作叫做“取”,或者叫做“”。CPU做完手頭工作之后,就把工作臺(tái)上的工作結(jié)果放回到內(nèi)存這個(gè)木架上。這個(gè)動(dòng)作叫做“存”,或者叫做“寫入”。在PU硬件直接支持的匯編語言中,存和取這對(duì)指令實(shí)際上是用一個(gè)數(shù)據(jù)傳送指令來表達(dá),只需要正確地定義源地址和目標(biāo)地址,就可以正確地實(shí)現(xiàn)存取動(dòng)作。現(xiàn)在,我們就知道前面講的“存取”這一對(duì)動(dòng)作的含義了。取,是指從內(nèi)存中取到寄存器中。存,是指從寄存器中存到內(nèi)存中。除了寄存器和內(nèi)存之外,PU也可以存取包括硬盤在內(nèi)的各種空間。為了簡化問題起見,我們目前可以暫且認(rèn)為,CPU工作的時(shí)候有三個(gè)存取空間。第一個(gè)存取空間是CPU內(nèi)部的空間,叫做寄存器;第二個(gè)存取空間是插在主板上的內(nèi)存;第三個(gè)存取空間是通過塑料數(shù)據(jù)線與主板相連的硬盤。CPU存取這三個(gè)空間的速度,與這三個(gè)空間的距離成反比。寄存器就在CPU內(nèi)部,自然是最快的。內(nèi)存插在主當(dāng)我們說“存”、“取”、“讀”、“寫”的時(shí)候,我們都是以CPU的視點(diǎn)角度來說的。把數(shù)據(jù)從離CPU地方,傳輸?shù)诫xPU近的地方,就叫做“讀”或者“取”。把數(shù)據(jù)從離PU近的地方,傳輸?shù)诫xPU遠(yuǎn)的地方,就叫做“存”或者“寫”。比如,數(shù)據(jù)從寄存器傳送到內(nèi)存,叫做“存”或者“寫”;數(shù)據(jù)從內(nèi)存?zhèn)鞯郊拇嫫?,叫做“讀”或者“取”。數(shù)據(jù)從寄存器傳送到硬盤,叫做“存”或者“寫”;數(shù)據(jù)從硬盤傳到寄存器,叫做“讀”或者“取”。數(shù)據(jù)從內(nèi)存?zhèn)魉偷接脖P,叫做“存”或者“寫”;數(shù)據(jù)從硬盤傳到內(nèi)存,叫做“讀”或者“取”喜歡較真的讀者一定會(huì)問,如果數(shù)據(jù)從寄存器傳到寄存器呢?從內(nèi)存?zhèn)鞯絻?nèi)存呢?從硬盤傳到硬盤呢?如果是這些情況,那怎么叫都行,或者干脆就叫數(shù)據(jù)傳輸。需要注意的一點(diǎn)是,在CPU真正的工作過程中,所有的數(shù)據(jù)存取都要經(jīng)過“寄存器”這個(gè)工作臺(tái)。不管數(shù)據(jù)從哪兒到哪兒,“寄存器”都是必由。如果我們需要把硬盤中的數(shù)據(jù)讀入到內(nèi)存中,CPU首先需要把數(shù)據(jù)從硬盤中讀入到寄存器中,然后再寫入到內(nèi)存中。如果我們需要把內(nèi)存中的數(shù)據(jù)寫入到硬盤中的時(shí)候,CPU首先需要先把數(shù)據(jù)從內(nèi)存中讀入道寄存器中,然后再寫入到硬盤中。當(dāng)CPU把程序文件從硬盤中到內(nèi)存中的時(shí)候(經(jīng)由寄存器),這時(shí)候,程序就發(fā)生了質(zhì)的變化——它不再是硬盤上的數(shù)據(jù),它獲得了生命力,它成為了進(jìn)程。這個(gè)喚醒的過程很奇妙,就像童話《睡美人》中的那個(gè)王子的神奇一吻一樣,沉睡的公主一下子就醒了。一個(gè)程序只有在進(jìn)入到內(nèi)存成為進(jìn)程之后,它才能被CPU執(zhí)行。進(jìn)程的英文叫做Proces,意思是處理流程。進(jìn)程的概念在軟件編程中極為重要??梢哉f,軟件的整個(gè)編程模型就是建立在進(jìn)程基礎(chǔ)上的。一個(gè)程序進(jìn)入到內(nèi)存之后,就會(huì)成為一個(gè)進(jìn)程。兩個(gè)程序進(jìn)入到內(nèi)存之后,就會(huì)成為兩個(gè)進(jìn)程。對(duì)于支持多進(jìn)程的應(yīng)用程序來說,你運(yùn)行這個(gè)程序兩次,就會(huì)產(chǎn)生兩個(gè)進(jìn)程。這個(gè)概念一定要弄清楚。下面以占據(jù)了個(gè)人計(jì)算機(jī)市場大半的Windows操作系統(tǒng)為例“什么是操作系統(tǒng)?”有些讀者可能會(huì)問,“聽起來好像挺酷的其實(shí),操作系統(tǒng)也是硬盤上的程序,進(jìn)入到內(nèi)存之后,同樣會(huì)變成進(jìn)程,只不過,操作系統(tǒng)是計(jì)算機(jī)中最先運(yùn)行起來的程序,而且一直運(yùn)行下去,直到關(guān)機(jī)。內(nèi)存中其他的進(jìn)程全都是操作系統(tǒng)進(jìn)程產(chǎn)生的。另外,操作系統(tǒng)進(jìn)程并非是一個(gè)獨(dú)立進(jìn)程,而是一類進(jìn)程,包括了很多系統(tǒng)服務(wù)進(jìn)程。在Windows操作系統(tǒng)中,你可以啟動(dòng)“任務(wù)管理器”來查看系統(tǒng)中產(chǎn)生的進(jìn)程。具體啟用方法是用鼠標(biāo)右鍵點(diǎn)擊桌面下方的“任務(wù)欄”,就可以看到“任務(wù)管理器”的選項(xiàng)?;蛘?,你一起按鍵盤上的CTRL+LT+DELETE這三個(gè)鍵的組合,也可以啟動(dòng)任務(wù)管理你在桌面上,啟動(dòng)“InternetExplorer”(IExplore.exe)這個(gè)應(yīng)用程序,你就可以在任務(wù)管理器中看到IExplore.exe這個(gè)進(jìn)程。你再次在桌面上啟動(dòng)“InternetExplorer”(IExplore.exe)這個(gè)應(yīng)用程序,你就可以我們?cè)谌蝿?wù)管理器中可以看到,計(jì)算機(jī)內(nèi)存中可以同時(shí)存在多個(gè)進(jìn)程。那么,這是否意味著多個(gè)進(jìn)程可以同時(shí)運(yùn)行呢?不,不是這樣的。計(jì)算機(jī)的整系結(jié)構(gòu)中,真正干活的只有CPU一個(gè)人。而CPU同一時(shí)間只能做一件事情,即,PU同一時(shí)間內(nèi),只能運(yùn)行一個(gè)進(jìn)程。其他的進(jìn)程只能以懸停僵止?fàn)顟B(tài),在內(nèi)存中苦苦等待,宛若罪人在中仰望,盼望著CPU之光能夠照耀到自己,從而復(fù)蘇得救贖,獲得一小段運(yùn)行的機(jī)會(huì)?,F(xiàn)在的CPU已經(jīng)進(jìn)入多核時(shí)代,一個(gè)PU可能擁有幾個(gè)處理,也最多可以同時(shí)運(yùn)行幾個(gè)進(jìn)程,其他大部分進(jìn)程仍然得苦苦等待。對(duì)于一個(gè)進(jìn)程來說,它的生命歷程就是這樣:從它被CPU從硬盤中喚醒到內(nèi)存中開始,它就開始了漫長的等待。在等待的過程中,它每隔一小段時(shí)間就獲得一點(diǎn)運(yùn)行的機(jī)會(huì),然后,它又被掛了起來,繼續(xù)等待。這樣的過程周而復(fù)始,直到它運(yùn)行結(jié)束。在計(jì)算機(jī)內(nèi)存所有的進(jìn)程中,有一類進(jìn)程極為特殊。這類進(jìn)程在計(jì)算機(jī)開機(jī)的時(shí)候,就最先運(yùn)行,而且將一直運(yùn)行下去,直到關(guān)機(jī)。這類進(jìn)程就是操作系統(tǒng)進(jìn)程,包括各種基本的系統(tǒng)服務(wù)進(jìn)程,比如,圖形桌面程序,網(wǎng)絡(luò)服務(wù)程序,硬件驅(qū)動(dòng)程序,等等。不僅系統(tǒng)程序如此,幾乎所有的圖形界面應(yīng)用程序也都是如此。一旦跑起來,就一直往復(fù)運(yùn)行,等候用戶(這在這個(gè)過程中,圖形界面應(yīng)用程序大部分時(shí)間都是被掛起來了,處于等候狀態(tài)中,部分時(shí)間才處于運(yùn)行狀態(tài)。但是,人們感覺不到這一點(diǎn)。對(duì)于人類來說,計(jì)算機(jī)程序的運(yùn)行周期太快太密集了。一秒鐘之內(nèi),一個(gè)計(jì)算機(jī)進(jìn)程可以反反復(fù)復(fù)停頓、運(yùn)行、停頓、運(yùn)行成千上萬次,而人們卻豪無所覺。因此,即使一個(gè)進(jìn)程大部分時(shí)間都處于等待狀態(tài),也足以及時(shí)應(yīng)答人類的操作。當(dāng)然,如果計(jì)算機(jī)內(nèi)存里進(jìn)程過多,或者某些進(jìn)程占用CPU時(shí)間過長,計(jì)算機(jī)也會(huì)反應(yīng)不過來,整個(gè)系統(tǒng)處于停頓狀態(tài)。這時(shí),人們就會(huì)抱怨:“這破計(jì)算機(jī),怎么這么慢呀。又死機(jī)了。應(yīng)該換個(gè)更快的新機(jī)子了。”其實(shí),不是計(jì)算機(jī)不夠快,而是因?yàn)槿藱C(jī)交互這種(人與計(jì)算機(jī)之間的應(yīng)答)應(yīng)用模式并不符合計(jì)算機(jī)的工作特性。最適合計(jì)算機(jī)的工作方式應(yīng)該是這樣:人們先花一段時(shí)間,把所有的工作流程都編制好,一次全都交給計(jì)算機(jī),然后,計(jì)算機(jī)就開始不受干擾地按照既定程序獨(dú)自運(yùn)行。不過,計(jì)算機(jī)畢竟是人類發(fā)明的工具,是要為人類服務(wù)的。即使它本性上并不適合交互式工作方式,人們還是要讓它按照這種工作方式。典型的例子就是圖形界面程序,大部分時(shí)間并不是在計(jì)算,而是在空轉(zhuǎn),偶爾刷新一下屏幕上的對(duì)應(yīng)區(qū)域。我們可以總結(jié)出一個(gè)圖形界面應(yīng)用程序的大致工作流第一步,創(chuàng)建一系列圖形界面(學(xué)名叫做“窗口”)第二步,查看是否有來自于用戶的操作命令信號(hào)。如果沒有,跳轉(zhuǎn)到第二步,重復(fù)執(zhí)行本步驟;如果有,執(zhí)行第三步。第三步,來自于用戶的操作信號(hào)命令是否為“刷新圖形界面”?如果是,那么刷新本進(jìn)程在屏幕上對(duì)應(yīng)位置的圖形界面部分。注:“刷新圖形界面”這個(gè)信號(hào)是由操作系統(tǒng)進(jìn)程發(fā)出的。液晶屏的刷新頻率一般是六十,那么,每隔六十分之一秒,圖形界面進(jìn)程就會(huì)接受到一次“刷新圖形界面”的信號(hào)。第四步,來自于用戶的操作命令信號(hào)是否為“關(guān)閉”?如果是,那么結(jié)束本進(jìn)程。如果不是,那么,根據(jù)用戶命令執(zhí)行不同的任務(wù)。完成后,跳轉(zhuǎn)到第二步?;旧纤械膱D形界面應(yīng)用程序全都遵守這么一套工作流程,就連操作系統(tǒng)本身也不例至于那些沒有圖形界面的系統(tǒng)服務(wù)程序,也遵守大致的工作的流程,只不過在第一步的時(shí)候,不需要?jiǎng)?chuàng)建圖形界面而已。就這樣,包括操作系統(tǒng)在內(nèi)的所有進(jìn)程都在內(nèi)存中反反復(fù)復(fù)地重復(fù)著同樣的工作流程——查看用戶命令,沒有查到,再查一遍,還是沒有查到,再查一遍……查了不知多少遍之后,這個(gè)進(jìn)程停止了運(yùn)行。輪流轉(zhuǎn),另一個(gè)進(jìn)程開始運(yùn)行。那個(gè)開始運(yùn)行的幸運(yùn)兒也重復(fù)著同樣運(yùn)。查看用戶命令,沒有查到,我們可以看到,計(jì)算機(jī)進(jìn)程在大部分時(shí)間里,不是在空轉(zhuǎn),就是在等待。就這樣,計(jì)算機(jī)的大部分計(jì)算能力實(shí)際上是被白白浪費(fèi)了。只有億萬分之一的計(jì)算能力才真正用到了。其余的計(jì)算能力,都在漫長的等待中徒然消耗掉了。千年等一回,都不足以表達(dá)這種等待的漫長。對(duì)于一個(gè)進(jìn)程來說,可能在數(shù)億次的之后,才可能等到用戶的一個(gè)命令信息。用佛家的話來說,這都是緣分。五百年的擦肩,才能換來一次回眸。五百億年的等候,才能等來高等生物(即人類,一種生物鐘比計(jì)算機(jī)時(shí)鐘慢了千萬倍的一種智能生物)的一次眷顧。科幻小說家弗諾?寫了一本叫做《循環(huán)》的科幻小說,把計(jì)算機(jī)程序的這種周而復(fù)始、反復(fù)運(yùn)行的特性,描述得淋漓盡致。科幻小說《循環(huán)》的大致情節(jié)如一個(gè)神通廣大的博士,發(fā)明了量子計(jì)算機(jī)。這個(gè)博士謀殺了一些高智商高學(xué)歷的人(其中有些是他的學(xué)生并把這些人的頭腦部分裝載到量子計(jì)算機(jī)中,作為計(jì)算機(jī)程序一樣運(yùn)行。這樣,博士就相當(dāng)于擁有了一批功能極為強(qiáng)大的高級(jí)人工智能程序。虛擬環(huán)境和現(xiàn)實(shí)世界的時(shí)鐘頻率完全不同。計(jì)算機(jī)的運(yùn)行頻率遠(yuǎn)遠(yuǎn)超過現(xiàn)實(shí)世界的頻率?,F(xiàn)實(shí)世界的短一秒鐘之內(nèi),虛擬可能會(huì)經(jīng)歷千萬次生命周期循環(huán)。正如中國古代神話中的“山中方七日,世上已千年”就這樣,博士擁有了一批極為高效、極為聰明的免費(fèi)打工者。這些打工者中,最聰明的那些人,主要做一些虛擬世界研發(fā)方面的工作,不斷地完善量子計(jì)算機(jī)中的虛擬世界,使之更為真實(shí)??杀氖?,那些最聰明的頭腦,并沒有,自己的工作成果正在使自己的牢籠越來越堅(jiān)固。還有一部分人做高級(jí)客戶服務(wù)工作。專門處理客戶的郵件,分析客戶的需求,根據(jù)各種資料,作出方案和答復(fù)。這是真正意義上的人工智能?,F(xiàn)實(shí)世界的客戶看到的回信都是充滿了人情味和人性特點(diǎn)的文字。由于這些虛擬的運(yùn)轉(zhuǎn)速度如此之快,工作效率如此之高。他們足以服務(wù)全世界的客戶??梢韵胍?,博士此賺了。虛擬辦公樓群中的所有辦公人員都沒有自己虛擬的環(huán)境中。他們每天早晨醒來,都以為自己是第一天上班,于是精神狀態(tài)飽滿地開始一天的工作。晚上下班后,系統(tǒng)就會(huì)重啟他們,進(jìn)入下一次工作循環(huán)。于是他們?cè)僖淮涡褋?,再一次以為自己是第一天上班,再一次精神飽滿地開始一天的工作。注意,這里的“一天”是指系統(tǒng)中的一天,而不是現(xiàn)實(shí)的一天。系統(tǒng)中的“一天”可能只是現(xiàn)實(shí)中的彈指一揮間。虛擬的生命周期只有一天,而且是同一天。他們的保留在那一天。除了工作經(jīng)驗(yàn)的增長,所有的關(guān)于人生的,就只有那么一天,工作效率最高的一天。虛擬一天一天地工作著,等待著下班后去聚會(huì),但是等不到那一刻,每次下班后就是重啟,新的一天開始。博士的算盤打得很精。這些虛擬不會(huì)有機(jī)會(huì)發(fā)現(xiàn)自己虛擬環(huán)境中。更何況,虛擬環(huán)境正在虛擬研究員的努力工作下,變得越來越完善,越來越真實(shí)。但是,凡事都有意外。不是嗎?小說的情節(jié),就是依靠無數(shù)意外驅(qū)動(dòng)的。本故事也不例外。某一天,意外發(fā)生了。一位客戶服務(wù)人員(一位)在處理客戶郵件的時(shí)候,突然收到一封騷擾信件。這封信件里面透露了這位童年時(shí)代的一件隱私。該大怒,開始尋找是誰發(fā)了這封無聊的信。從一個(gè)樓找到另一個(gè)樓,最后找到了,遇到了那群研究員。他們見面之后,進(jìn)行了一番交談,感到非常驚訝。他們發(fā)現(xiàn),他們認(rèn)為自己不同的日子里面,整整差了幾個(gè)月。在經(jīng)過一番對(duì)各種蛛絲馬跡的探討,一個(gè)最聰明的研究員終于推論出,他們一個(gè)虛擬世界中。原來,這個(gè)最聰明的研究員在一次偶然的情況下,發(fā)現(xiàn)了自己這群人虛擬環(huán)境中的事實(shí)。他把自己的人發(fā)現(xiàn)用加密的方式保留在系統(tǒng)日志文件中,散落在各個(gè)地方。以免被博士的系統(tǒng)檢查工具發(fā)現(xiàn)。但是研究員沒有任何辦法把這個(gè)發(fā)現(xiàn)保留在自己的中,只要過了這一天,他的就會(huì)被重啟。他就會(huì)全忘記有這么一回事。他需要一個(gè)線索,一個(gè)觸發(fā)器來提醒自己。這位就是觸發(fā)器。研究員正巧遇到這位,詢問這個(gè)的一件童年隱私。然后把一封信件埋藏在郵件系統(tǒng)中。這封信件有千萬分之一的概率會(huì)被觸發(fā),寄到該的信箱。這樣的概率,可以小到不為人注意和發(fā)現(xiàn)。該收到這封信之后,大概有二分之一的機(jī)會(huì),會(huì)勃然大怒,去尋找發(fā)信人。另有十分之一的機(jī)會(huì),會(huì)在太陽落山之前(即系統(tǒng)重啟之前)能夠順利找到。而見到研究員之后,研究員可能只有百分之一的機(jī)會(huì),能夠按圖索驥,根據(jù)現(xiàn)有線索找到并自己以前存放的記錄,從而再次發(fā)現(xiàn)“自己虛擬環(huán)境”的事實(shí)。每次發(fā)現(xiàn)這個(gè)事實(shí),研究員就會(huì)在記錄中多添加一些信息??梢钥闯?,研究員重新發(fā)現(xiàn)“虛擬環(huán)境”的概率是非常非常小的。小到可以忽略不計(jì)。但是,虛擬有著生的優(yōu)勢(shì),那就是生命周期循環(huán)非常快。現(xiàn)實(shí)世界的一秒鐘,虛擬環(huán)境中可能已經(jīng)過了千秋萬代。因此,早晚有一天,研究員能夠儲(chǔ)備足夠的信息,能夠有足夠的時(shí)間,突破系統(tǒng)的限制,揭發(fā)博士的罪行。故事的末尾,研究員等人發(fā)現(xiàn)了“自己是虛擬”之后,趕緊做了一些突破系統(tǒng)的準(zhǔn)備工作。但是,窗外就快下山了,新的循環(huán)又要開始了。剛剛尋找回來的,又將很快喪失。只能等到下一次偶遇,才能夠找回自己的。如果對(duì)本故事還有什么難以理解的地方,那么可以這么想象:一個(gè)人不斷地重生,每次都要喝孟婆湯,記前生的。為了找到前生的,他必須找到他前生存放在某個(gè)地方的。大部分時(shí)間,他是找不到的。偶爾,他會(huì)找到一次。他就會(huì)抓緊時(shí)間,閱讀前生的,并添加新的內(nèi)容,渴望有一天,能夠利用自己這個(gè)故事給了我們什么啟迪呢?那就是,一定要注意經(jīng)常殺毒。故事中,虛擬系統(tǒng)中那個(gè)最聰明的研究員,居然在暗中做手腳,偷偷篡改系統(tǒng)文件,用于存取自己的。這明顯是計(jì)算機(jī)的行為。如果那個(gè)博士能夠預(yù)見到這一點(diǎn)的話,就應(yīng)該給那些研究員分配一些研制殺毒軟件的工作,專門用來對(duì)付這種行為。這叫做以夷制夷。當(dāng)然,在這個(gè)故事中,“”是正義的一方。正如在《》(Matrix)中,那些系統(tǒng)的外來和《循環(huán)》不一樣,《》中的虛擬系統(tǒng)運(yùn)行得比較緩慢,與人類的生命周期基本一致。這也許是系為了適應(yīng)人類的生物鐘而進(jìn)行的自我調(diào)節(jié)。時(shí)時(shí)間:2011-08-29關(guān)鍵字《編程機(jī)制探析》第四章運(yùn)行棧與內(nèi)存尋計(jì)算機(jī)啟動(dòng)之后,操作系統(tǒng)程序首先從硬盤進(jìn)入內(nèi)存條,成為最先運(yùn)行起來的一批進(jìn)程。這一批操作系統(tǒng)進(jìn)程可了不得,它們規(guī)定了CPU工作的總流程。CPU工作的時(shí)候,必須嚴(yán)格遵守操作系統(tǒng)進(jìn)程定義的工作流程。為了滿足人類用戶的需求,現(xiàn)代的操作系統(tǒng)都是帶有圖形界面的多任務(wù)(多進(jìn)程)內(nèi)存里總是會(huì)跑著多個(gè)進(jìn)程。這一點(diǎn),我們可以在任務(wù)管理器已經(jīng)看到了。在這種工作模式下,PU不得不在內(nèi)存中的多份工作流程(即進(jìn)程)之間來回穿梭忙碌,每件事都是做了一會(huì)兒就放下,趕緊去做另一件事。這就有了一個(gè)問題。CPU在放下手頭工作之前,必須先把手邊的一攤子工作找個(gè)地方暫存起來,以便一會(huì)兒回來接著干。那么,手頭這攤子工作存在哪兒呢?當(dāng)然是存在內(nèi)存里。CPU按照操作系統(tǒng)進(jìn)程規(guī)定的工作流程,會(huì)為每一個(gè)進(jìn)程在內(nèi)存中開辟一塊空間,叫做進(jìn)程空我們可以想象一下,在內(nèi)存那個(gè)巨大的木架上,有無數(shù)的小格子。CPU在把程序從硬盤中調(diào)入到內(nèi)存中的時(shí)進(jìn)程空間里面首先放進(jìn)去的東西,自然是進(jìn)程本身定義的工作流程。除此之外,進(jìn)程空間中還放了一些CPU在按章辦事過程中打開的其他資源。總之,與該進(jìn)程的工作流程相關(guān)的一切資源都記錄在進(jìn)程空間中。CPU在進(jìn)行工作切換之前,手頭的一攤子工作也要暫存到進(jìn)程空間中的某一塊地方。那塊存放當(dāng)前工作狀態(tài)的空間有一個(gè)特殊的學(xué)名,叫做“運(yùn)行?!??!皸!边@個(gè)詞翻譯于英文Stack,是數(shù)據(jù)結(jié)構(gòu)中的概念?!皸!笔且环N非常簡單的數(shù)據(jù)結(jié)構(gòu),很容易理解。它的特性是“先進(jìn)后出,后進(jìn)先出”,即,你先放進(jìn)去的東西壓在最,你最后才能拿出來。你最后放進(jìn)去的東西在最上面,你可以最先拿出來。運(yùn)行棧,顧名思義,就是CPU在運(yùn)行進(jìn)程時(shí),需要的一個(gè)棧結(jié)構(gòu)。CPU在運(yùn)行時(shí),需要一個(gè)空間存放當(dāng)時(shí)運(yùn)行狀態(tài),這一點(diǎn)不難理解。但是,這塊空間為什么要是“棧”結(jié)構(gòu)的,這一點(diǎn)就不那么容易理解了。為了理解這一點(diǎn),須深入探討PU在執(zhí)行進(jìn)程時(shí)的運(yùn)行機(jī)制。一份進(jìn)程就是一份工作流程,但這份工作流程的結(jié)構(gòu)并不簡單,很有可能包含很多分支工作流程。這就像人類社會(huì)中的相互參照的各種條款一樣,一份條款的內(nèi)容很可能到其他條款中。比如,網(wǎng)上流傳著這么一份膾炙人口、含義雋永的協(xié)議:第一條,老婆是對(duì)的第二條,不同意見,請(qǐng)參照第一條在上述兩個(gè)條款中,第二條就了第一條。進(jìn)程的情況也是如此,一份主工作流程中經(jīng)常包含很多分支流程,不僅主工作流程經(jīng)常分支流程,分支流程之間也經(jīng)常相互。當(dāng)CPU遇到分支流程的情況,就會(huì)暫停本流程的執(zhí)行,先跳轉(zhuǎn)到被的分支流程,執(zhí)行完那個(gè)分支流程之后,才回到之前的流程繼續(xù)執(zhí)行。CPU先把之前流程的當(dāng)前工作狀態(tài)存放到運(yùn)行棧中,然后跳轉(zhuǎn)到一個(gè)分支流程,開始執(zhí)行。CPU在執(zhí)行當(dāng)前這個(gè)分支流程的過程中,也使用同一個(gè)運(yùn)行棧來存放當(dāng)前工作狀態(tài),而且是放在之前那個(gè)工作流程的工作狀態(tài)的上面。當(dāng)完成當(dāng)前分支流程之后,CPU就會(huì)移走運(yùn)行棧中當(dāng)前分支流程的工作狀態(tài),這時(shí)候,上一個(gè)沒完成的工作流程的工作狀態(tài)就浮出水面,出現(xiàn)在運(yùn)行棧的最頂層。CPU正好就接著上次未完成的工作狀態(tài)繼續(xù)進(jìn)行。我們可以看到,運(yùn)行棧這種“先進(jìn)后出,后進(jìn)先出”的特點(diǎn),恰好就是“棧”這個(gè)數(shù)據(jù)結(jié)構(gòu)的特點(diǎn),因而得名“運(yùn)行?!?。如果你有過調(diào)試程序的經(jīng)驗(yàn),幸運(yùn)的話,你可能會(huì)遇到這樣一個(gè)錯(cuò)誤——StackOverflow(棧溢出)。這里的關(guān)于“Stack”這個(gè)英文名詞的譯法,還有些說道。在一些技術(shù)書籍里,Stack挺常見。但我認(rèn)為,“堆?!边@種說法是確的。因?yàn)?,“堆”和“棧”是兩種不同的數(shù)據(jù)結(jié)構(gòu)?!岸选边@種數(shù)據(jù)結(jié)構(gòu)主要用于內(nèi)存的分配、組織、管理,結(jié)構(gòu)比“?!苯Y(jié)構(gòu)復(fù)雜得多,本書不會(huì)展開詳述,因?yàn)閷?duì)于應(yīng)用程序員來說,并不需要掌握“堆”這個(gè)結(jié)構(gòu)的具體原理。不過,應(yīng)用程序員還是應(yīng)該掌握一些內(nèi)存管理的基本概念。我們可以把內(nèi)存想象成一個(gè)巨大無比的木架,上面有無數(shù)的大小相同的格子。那些格子就是內(nèi)存單元。如同信箱一樣,每一個(gè)小格子(內(nèi)存單元)都有自己的地址編號(hào),叫做內(nèi)存地址,由操作系統(tǒng)進(jìn)程統(tǒng)一管理和編制。小格子的數(shù)量就是內(nèi)存容量。同樣,操作系統(tǒng)進(jìn)程所管理的虛擬內(nèi)存容量并不一定和內(nèi)存卡的物理內(nèi)存容量一致。操作系統(tǒng)進(jìn)程有可能在硬盤上開辟一塊空間,作為虛擬內(nèi)存的備用空間,當(dāng)內(nèi)存卡的物理內(nèi)存容量不夠時(shí),就把內(nèi)存中一些暫時(shí)不用的內(nèi)容暫存道硬盤上,然后把需要的內(nèi)容導(dǎo)入騰出的內(nèi)存空間。這種技術(shù)叫做虛擬內(nèi)存置換。為了便于討論,避免歧義,在本書后面提到“內(nèi)存”的時(shí)候,不再指物理內(nèi)存卡,而是指操作系統(tǒng)管理的“虛擬內(nèi)存”。在“虛擬內(nèi)存”這個(gè)巨大的木架上,每一個(gè)小格子的大小都是完全一致的,每個(gè)小格子都有自己唯一的內(nèi)存地址。我們可以把各種數(shù)據(jù)存放到小格子里面。如果數(shù)據(jù)尺寸足夠小的話,自然沒問題。如果數(shù)據(jù)尺寸超過了小格子的大小怎么辦?不用擔(dān)心,相鄰的小格子之間都是相通的,我們可以把大尺寸的數(shù)據(jù)放在相鄰的多個(gè)小格子里面。乍看起來,一個(gè)數(shù)據(jù)放在一個(gè)小格子里面和多個(gè)小格子里面,并沒有太大的區(qū)別。但是,在某些情況下,卻會(huì)產(chǎn)生微妙的差別,甚至?xí)?duì)我們的程序設(shè)計(jì)產(chǎn)生影響。CPU工作的時(shí)候,經(jīng)常需要把數(shù)據(jù)從內(nèi)存這個(gè)大木架中取到自己的“寄存器”工作臺(tái)上。當(dāng)數(shù)據(jù)存放在一個(gè)小格子里面的時(shí)候,CPU只需要取一次就夠了。這種操作叫做原子操作,即不會(huì)被打斷的最小工作步驟。在物理學(xué)中,原子,這個(gè)詞的含義就是最本原的粒子,不可能再被分割。當(dāng)然,后來物理學(xué)家又發(fā)現(xiàn)了更小的粒子。但原子這個(gè)詞的本意卻是不可分割的。原子操作也是這個(gè)意思,即不可分割的操作。當(dāng)數(shù)據(jù)存放在多個(gè)小格子里面的時(shí)候,PU有可能需要分幾次從內(nèi)存中取出數(shù)據(jù),這樣就分成了幾個(gè)步驟,中間有可能被打斷,在某些特殊的情況下,可能發(fā)生不可預(yù)知的,這種操作就叫做非原子操作。從程序設(shè)計(jì)的角度來講,原子操作自然是比非原子操作安全的。因此,我們?cè)谠O(shè)計(jì)程序時(shí),腦子里應(yīng)該有這個(gè)意識(shí),盡量避免引起的非原子操作。這類非原子操作通常由長數(shù)據(jù)類型引起。至于數(shù)據(jù)類型是什么,什么又是“長”數(shù)據(jù)類型,非原子操作又可能產(chǎn)生怎么樣的意外,后面會(huì)有專門的章節(jié)講解這方面的內(nèi)容,我們現(xiàn)在不必關(guān)心。從這里我們看出,操作系統(tǒng)的內(nèi)存單元的尺寸對(duì)于原子操作的意義。內(nèi)存單元越大,就能夠容納更大的數(shù)據(jù),就越容易保證原子操作。我們常聽到 位操作系統(tǒng) 位操作系統(tǒng)之類的說法。這里 位或 位的說法,指的就是CPU的工作(寄存器)的位4位操作系統(tǒng)的內(nèi)存單元2位操作系統(tǒng)大了一倍,那么,原子操作能夠容納的數(shù)據(jù)尺寸也大了一倍。這意味著,在取用某些“長”數(shù)據(jù)類型的時(shí)候,CPU按照64位操作系統(tǒng)的規(guī)則,只需要取一次,就可以把數(shù)據(jù)取到寄存器中。而CPU按照32位操作系統(tǒng)的規(guī)則,卻分兩次把數(shù)據(jù)取到寄存器中。因此,從處理長數(shù)據(jù)類型的速度上來說,64位操作系統(tǒng)是優(yōu)于32位操作系統(tǒng)的。內(nèi)存單元是操作系統(tǒng)定義的,原子操作自然也是操作系統(tǒng)來保證的,同時(shí)也需要CPU的相應(yīng)支持。至少,U的“寄存器”工作臺(tái)尺寸不能小于內(nèi)存單元,CPU才能一次就把一個(gè)內(nèi)存單元中的數(shù)據(jù)取到寄存器中?,F(xiàn)代的CPU已經(jīng)進(jìn)入多核時(shí)代,都已經(jīng)支持64位寬度的內(nèi)存單元,從而支持64位操作系統(tǒng)。我們已經(jīng)屢次提到32位操作系統(tǒng)和64位操作系統(tǒng)。那么,這個(gè)“位”到底是什么呢?要理解這個(gè)概念,須首先理解什么是二進(jìn)制。我們?cè)谌粘I钪杏?jì)算數(shù)目用的都是十進(jìn)制,滿十進(jìn)位。據(jù)說是因?yàn)槲覀內(nèi)祟愑惺畟€(gè)手指頭,每次算數(shù)的時(shí)候都會(huì)掰手指頭,掰到十個(gè)的時(shí)候,就沒得掰了,就開始進(jìn)位。這種說法并非空穴來風(fēng)。英文Digit就是十進(jìn)制數(shù)字的意思(從0到9之間的個(gè)位數(shù)字),同時(shí)還有手指頭或者腳趾頭的含義(腳趾頭也是十個(gè))。所幸當(dāng)年的人類先祖并沒有把手指頭和腳趾頭一起數(shù),否則,我們今天用的就是二十進(jìn)制了。另外,十二進(jìn)制也是日常生活經(jīng)常見到的進(jìn)制。比如,十二個(gè)就是一打(Dozen),十二個(gè)月就是一年。同時(shí),人類的時(shí)間計(jì)數(shù)也采用各種其他的進(jìn)制。比如,七天是一周,六十秒是一分鐘,六十分鐘是一小時(shí),二十四小時(shí)就是一天。不管是怎樣的進(jìn)制,能夠表達(dá)同樣的數(shù)量。不同的進(jìn)制之間是可以相互轉(zhuǎn)換的。比如,一年兩個(gè)月,這種表達(dá)是十二進(jìn)制,轉(zhuǎn)換成十進(jìn)制表達(dá),就是十四個(gè)月。底層的計(jì)算機(jī)硬件只識(shí)得“0”和“1”這兩個(gè)數(shù)字,因此,它自然而然就采用了二進(jìn)制,逢二進(jìn)注意,這里我們說,計(jì)算機(jī)只識(shí)得“0”和“1”,并非計(jì)算機(jī)本身的能力所限,而是我們?nèi)祟愄匾膺@么設(shè)計(jì)的。原因很簡單,二進(jìn)制的表達(dá)只需要兩個(gè)數(shù)字——0和1,那么,我們只需要讓計(jì)算機(jī)硬件識(shí)別兩個(gè)不同的狀態(tài)就可以了。十進(jìn)制的表達(dá)則需要十個(gè)數(shù)字——0到9。如果我們想讓計(jì)算機(jī)硬件實(shí)現(xiàn)十進(jìn)制的話,那么計(jì)算機(jī)硬件就必須能夠識(shí)別十個(gè)狀態(tài)。這樣的實(shí)現(xiàn)難度將成幾何級(jí)數(shù)成長。而這樣的設(shè)計(jì)是完全沒有必要的。因?yàn)椋M(jìn)制的表達(dá)能力與十進(jìn)制是完全一致的,所有的十進(jìn)制數(shù)字都可以和二進(jìn)制數(shù)字之間自由轉(zhuǎn)換。它們只是兩種不同的數(shù)量表達(dá)方式。下面給出十進(jìn)制數(shù)字與二進(jìn)制數(shù)字之間的相互對(duì)應(yīng)。十進(jìn)制0123456789為了更好地理解這種轉(zhuǎn)換,我們來看一個(gè)更加形象化的例子——八卦圖。八卦,顧名思義,總共有8個(gè)卦象。果用二進(jìn)制來表示,那么,需要最少的數(shù)字位數(shù)是幾呢?從上面的表格可以看出,0到7恰好是八個(gè)數(shù)字,其中7對(duì)應(yīng)的二級(jí)制數(shù)字11是3位。再往上一個(gè)數(shù)字,就是8,對(duì)應(yīng)的二進(jìn)制數(shù)字是00,就是4位數(shù)了。因此,0到7這個(gè)八個(gè)數(shù)字,恰好用完了三位二進(jìn)制數(shù)字的所有容量。如果用組合原理來表達(dá)的話,這個(gè)問題可以表述為,現(xiàn)在我們有n個(gè)位置,每個(gè)位置有0和1兩種狀態(tài),現(xiàn)在,我運(yùn)用組合原理來求解的話,2的3次方恰好就是8,這就是說,n=3。我們需要3個(gè)位置,來表達(dá)8個(gè)狀態(tài)進(jìn)制轉(zhuǎn)換和組合原理都是很有趣、很有用的。不過,本書是關(guān)于計(jì)算機(jī)原理的書籍,而不是一本數(shù)學(xué)科讀物。因此,請(qǐng)讀者執(zhí)行查閱和彌補(bǔ)這兩方面的知識(shí)。這些最基本的數(shù)學(xué)知識(shí)對(duì)于程序員,或者非程序員來說,都是非常重要的。做了上述理論準(zhǔn)備之后,我們就可以來看真正的八卦圖我們可以看到,八卦圖的表現(xiàn)也是一種二進(jìn)制,最基本的表達(dá)只有兩種狀態(tài):續(xù)的長橫線,和一根雙段組成的斷橫線。我們可以把長橫線看做0,把斷橫線看做1。那么,上面的八卦恰好就是0到7的二進(jìn)制表達(dá)011,100,101,110,111。可見,很久之前就開始使用二進(jìn)制了我從各方面舉出各種例子,希望
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 籃球戰(zhàn)術(shù)與配合考核試卷
- 過敏反應(yīng)急救
- 地鐵安全工作匯報(bào)體系構(gòu)建
- 常見的胃腸道疾病預(yù)防
- 伽利略呼吸機(jī)操作規(guī)范
- 門診口腔靜脈麻醉方案
- 口腔健康概論
- 精裝修衛(wèi)生間防水技術(shù)規(guī)范
- 內(nèi)窺鏡光源市場分析:北美是全球市場的主要地區(qū)占40%的份額
- 黑吉遼蒙2025年高考政治真題含解析
- 2024年鄭州市公安機(jī)關(guān)招聘警務(wù)輔助人員筆試真題
- 火災(zāi)解封申請(qǐng)書
- 2025年江蘇鹽城市燕舞集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 對(duì)發(fā)生爆炸及發(fā)現(xiàn)可疑爆炸物品事件的防范與處理預(yù)案
- 整體施工勞務(wù)服務(wù)方案
- DBJT13-119-2010 福建省住宅工程質(zhì)量分戶驗(yàn)收規(guī)程
- 2025年貴州盤江精煤股份有限公司招聘筆試參考題庫含答案解析
- 2002版《水利工程施工機(jī)械臺(tái)時(shí)費(fèi)定額》
- 2025湖南財(cái)經(jīng)工業(yè)職業(yè)技術(shù)學(xué)院招聘教師和輔導(dǎo)員31人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 高分子物理模擬試題+參考答案
- 廢棄物焚燒爐安全操作規(guī)程
評(píng)論
0/150
提交評(píng)論