buaawhl編程機制探析注意由于發(fā)布時間問題第十四章跑到了最后一章_第1頁
buaawhl編程機制探析注意由于發(fā)布時間問題第十四章跑到了最后一章_第2頁
buaawhl編程機制探析注意由于發(fā)布時間問題第十四章跑到了最后一章_第3頁
buaawhl編程機制探析注意由于發(fā)布時間問題第十四章跑到了最后一章_第4頁
buaawhl編程機制探析注意由于發(fā)布時間問題第十四章跑到了最后一章_第5頁
已閱讀5頁,還剩161頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

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

評論

0/150

提交評論