【程序是怎樣跑起來的】

加載到內存中的機器語言程序,由CPU進行解析和運行铝条,進而計算機系統(tǒng)整體的控制和數(shù)據(jù)運算也開始運行。

寄存器 可用來暫存指令乞榨、數(shù)據(jù)等處理對象,可以將其看作是內存的一種。根據(jù)種類的不同,一個CPU內部會有20~100個寄存器宰僧。控制器負責把內存上的指令观挎、數(shù)據(jù)等讀入寄存器,并根據(jù)指令的執(zhí)行結果來控制整個計算機段化。運算器負責運算從內存讀入寄存器的數(shù)據(jù)嘁捷。時鐘負責發(fā)出CPU開始計時的時鐘信號。

匯編語言采用助記符(memonic)來編寫程序显熏,每一個原本是電氣信號的機器語言指令都會有一個與其相應的助記符雄嚣,助記符通常為指令功能的英語單詞的簡寫。
匯編語言和機器語言基本上是一一對應的喘蟆。

順序執(zhí)行是指按照地址內容的順序執(zhí)行指令缓升。條件分支是指根據(jù)條件執(zhí)行任意地址的指令。循環(huán)是指重復執(zhí)行同一地址的指令蕴轨。

函數(shù)的調用 需要在完成函數(shù)內部的處理后港谊,處理流程再返回到函數(shù)調用點(函數(shù)調用指令的下一個地址)。因此橙弱,如果只是跳轉到函數(shù)的入口地址歧寺,處理流程就不知道應該返回至哪里了。

函數(shù)調用使用的是call指令棘脐,而不是跳轉指令斜筐。在將函數(shù)的入口地址設定到程序計數(shù)器之前,call指令會把調用函數(shù)后要執(zhí)行的指令地址存儲在名為棧的主存內蛀缝。函數(shù)處理完畢后顷链,再通過函數(shù)的出口來執(zhí)行return命令。return命令的功能是把保存在棧中的地址設定到程序計數(shù)器中屈梁。

計算機處理信息的最小單位——位嗤练,就相當于二進制中的一位。位的英文bit是二進制數(shù)位(binary digit)的縮寫俘闯。

8位二進制數(shù)被稱為一個字節(jié)潭苞。字節(jié)是最基本的信息計量單位。位是最小單位真朗,字節(jié)是基本單位此疹。內存和磁盤都使用字節(jié)單位來存儲和讀寫數(shù)據(jù),使用位單位則無法讀寫數(shù)據(jù)。因此蝗碎,字節(jié)是信息的基本單位湖笨。

內存IC中有電源、地址信號蹦骑、數(shù)據(jù)信號慈省、控制信號等用于輸入輸出的大量引腳(IC的引腳),通過為其指定地址(address)眠菇,來進行數(shù)據(jù)的讀寫边败。

指針也是一種變量,它所表示的不是數(shù)據(jù)的值捎废,而是存儲著數(shù)據(jù)的內存的地址笑窜。

數(shù)組是指多個同樣數(shù)據(jù)類型的數(shù)據(jù)在內存中連續(xù)排列的形式。作為數(shù)組元素的各個數(shù)據(jù)會通過連續(xù)的編號被區(qū)分開來登疗,這個編號稱為索引(index)排截。指定索引后,就可以對該索引所對應地址的內存進行讀寫操作辐益。

在數(shù)組的各個元素中断傲,除了數(shù)據(jù)的值之外,通過為其附帶上下一個元素的索引智政,即可實現(xiàn)鏈表认罩。數(shù)據(jù)的值和下一個元素的索引組合在一起,就構成了數(shù)組的一個元素续捂。
如果不使用鏈表數(shù)組猜年,那么中途刪除或追加元素時,其后的元素就必須要全部移動疾忍。

程序保存在存儲設備中乔外,通過有序地被讀出來實現(xiàn)運行,這一點大家都很清楚一罩。這一機制稱為存儲程序方式(程序內置方式)杨幼,現(xiàn)在看來這是理所當然的,但在當時它的提出可以說是一個里程碑聂渊。為什么這么說呢差购?因為在此以前的程序都是通過改變計算機的布線等來變更程序的。

Windows的操作系統(tǒng)本身也是多個DLL文件的集合體汉嗽。有時在安裝新應用時欲逃,DLL文件也會被追加。應用則會通過利用這些DLL文件的功能來運行饼暑。

不管是硬盤還是軟盤稳析,不同的文件是不能存儲在同一個簇中的洗做,否則就會導致只有一方的文件不能被刪除。因此彰居,不管是多么小的文件诚纸,都會占用1簇的空間。

在任何情況下陈惰,文件中的字節(jié)數(shù)據(jù)都是連續(xù)存儲的畦徘,大家一定要認識到這一點

把文件內容用“數(shù)據(jù)×重復次數(shù)”的形式來表示的壓縮方法稱為RLE(Run Length Encoding,行程長度編碼)算法抬闯。

JAVA 虛擬機是運行 JAVA 應用的字節(jié)代碼解析井辆。
只要分別為各個環(huán)境安裝專用的Java虛擬機,同樣的字節(jié)代碼就能在各種環(huán)境下運行了溶握。

機器語言的程序稱為本地代碼(native code)掘剪。程序員用C語言等編寫的程序,在編寫階段僅僅是文本文件奈虾。文本文件(排除文字編碼的問題)在任何環(huán)境下都能顯示和編輯。我們稱之為源代碼廉赔。通過對源代碼進行編譯肉微,就可以得到本地代碼。

最初應用軟件的功能中蜡塌,存在著直接操作計算機硬件的部分碉纳。而這又是為什么呢?原因主要有兩點馏艾,一是當時MS-DOS的功能尚不完善劳曹,二是為了提高程序的運行速度。

應用軟件則必須根據(jù)不同的操作系統(tǒng)類型來專門開發(fā)琅摩。CPU的類型不同铁孵,所對應的機器語言也不同,同樣的道理房资,操作系統(tǒng)的類型不同蜕劝,應用程序向操作系統(tǒng)傳遞指令的途徑也是不同的。

大家說的Java轰异,有兩個層面的意思岖沛。一個是作為編程語言的Java,另一個是作為程序運行環(huán)境的Java搭独。
字節(jié)代碼的運行環(huán)境就稱為Java虛擬機(JavaVM, Java Virtual Machine)婴削。Java虛擬機是一邊把Java字節(jié)代碼逐一轉換成本地代碼一邊運行的。
編譯器會將程序員編寫的源代碼(sample.java)轉換成字節(jié)代碼(sample.class)牙肝。而Java虛擬機(java.exe)則會把字節(jié)代碼變換成x86系列CPU適用的本地代碼唉俗,然后由x86系列CPU負責實際的處理嗤朴。

Java虛擬機每次運行時都要把字節(jié)代碼變換成本機代碼,這一機制是造成運行速度慢的原因互躬。為此播赁,目前業(yè)界也在努力改善這一問題,比如把首次變換后的本地代碼保存起來吼渡,第2次以后直接利用本地代碼容为,或是對字節(jié)代碼中處理較為費時的部分進行優(yōu)化(改善生成的本地代碼質量)等。

用某種編程語言編寫的程序就稱為源代碼寺酪,保存源代碼的文件稱為源文件坎背。

CPU能直接解析并運行的不是源代碼而是本地代碼的程序。即使是用不同編程語言編寫的代碼寄雀,轉換成本地代碼后得滤,也都變成用同一種語言(機器語言)來表示了。

能夠把C語言等高級編程語言編寫的源代碼轉換成本地代碼的程序稱為編譯器盒犹。每個編寫源代碼的編程語言都需要其專用的編譯器懂更。將C語言編寫的源代碼轉換成本地代碼的編譯器稱為C編譯器。讀入的源代碼還要經過語法解析急膀、句法解析沮协、語義解析等,才能生成本地代碼卓嫂。

棧中對數(shù)據(jù)進行存儲和舍棄(清理處理)的代碼慷暂,是由編譯器自動生成的,因此不需要程序員的參與晨雳。使用棧的數(shù)據(jù)的內存空間行瑞,每當函數(shù)被調用時都會得到申請分配,并在函數(shù)處理完畢后自動釋放餐禁。與此相對血久,堆的內存空間,則要根據(jù)程序員編寫的程序帮非,來明確進行申請分配或釋放洋魂。

垃圾回收機制(garbage collection)指的是對處理完畢后不再需要的堆內存空間的數(shù)據(jù)和對象進行清理,釋放它們所使用的內存空間喜鼓。這里把不需要的數(shù)據(jù)比喻為了垃圾副砍。

C語言用的是free()函數(shù),C++用的是delete運算符庄岖。在C++的基礎上開發(fā)出來的Java及C#這些編程語言中豁翎,程序運行環(huán)境會自動進行垃圾回收。這樣就可以避免由于程序員的疏忽(忘了記述內存的釋放處理)而造成內存泄露了隅忿。

操作系統(tǒng)的硬件控制功能心剥,通常是通過一些小的函數(shù)集合體的形式來提供的邦尊。這些函數(shù)及調用函數(shù)的行為統(tǒng)稱為系統(tǒng)調用(system call)

多任務指的是同時運行多個程序的功能。Windows是通過時鐘分割技術來實現(xiàn)多任務功能的优烧。
時鐘分割指的是在短時間間隔內蝉揍,多個程序切換運行的方式。在用戶看來畦娄,就是多個程序在同時運行又沾。

操作系統(tǒng)和中間件合在一起,也稱為系統(tǒng)軟件熙卡。應用不僅可以利用操作系統(tǒng)杖刷,也可以利用中間件的功能。

即插即用(Plug-and-Play)指的是新的設備連接(Plug)后立刻就可以使用(Play)的機制驳癌。

匯編語言指令的語法結構是操作碼opcode+操作數(shù)oprand(也存在只有操作碼沒有操作數(shù)的指令)滑燃。操作碼表示的是指令動作,操作數(shù)表示的是指令對象颓鲜。用匯編語言來分析“Give me money”這個英文指令的話表窘,Give就是操作碼,me和money就是操作數(shù)甜滨。

寄存器是CPU中的存儲區(qū)域乐严。不過,寄存器并不僅僅具有存儲指令和數(shù)據(jù)的功能艳吠,也有運算功能。寄存器的名稱會通過匯編語言的源代碼指定給操作數(shù)孽椰。內存中的存儲區(qū)域是用地址編號來區(qū)分的昭娩。CPU內的寄存器是用eax及ebx這些名稱來區(qū)分的。此外黍匾,CPU內部也有程序員無法直接操作的寄存器栏渺。例如,表示運算結果正負及溢出狀態(tài)的標志寄存器及操作系統(tǒng)專用的寄存器等锐涯,都無法通過程序員編寫的程序直接進行操作磕诊。

局部變量是臨時保存在寄存器和棧中的。函數(shù)內部利用的棧纹腌,在函數(shù)處理完畢后會恢復到初始狀態(tài)霎终,因此局部變量的值也就被銷毀了,而寄存器也可能會被用于其他目的升薯。因此莱褒,局部變量只是在函數(shù)處理運行期間臨時存儲在寄存器和棧上。

顯示器中顯示的信息一直存儲在某內存中涎劈。該內存稱為VRAM(Video RAM)广凸。在程序中阅茶,只要往VRAM中寫入數(shù)據(jù),該數(shù)據(jù)就會在顯示器中顯示出來谅海。實現(xiàn)該功能的程序脸哀,是由操作系統(tǒng)或BIOS提供,并借助中斷來進行處理的扭吁。

控制就是指CPU和各種設備之間配合進行數(shù)據(jù)的輸入輸出處理撞蜂。

石頭、剪刀智末、布分別用數(shù)值0谅摄、1、2來表示系馆。

我們用0~9這10個隨機數(shù)送漠,0~4時表示石頭,5~7表示剪刀由蘑,8~9表示布闽寡,這樣規(guī)定后,石頭尼酿、剪刀爷狈、布的百分比率就分別變成了50%、30%裳擎、20%涎永。

由于借助公式產生的隨機數(shù)具有一定的規(guī)律性,因此并不是真正的隨機數(shù)鹿响,通常稱為偽隨機數(shù)羡微。

計算機中預先被定義過的位數(shù)和精度稱為數(shù)據(jù)類型。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末惶我,一起剝皮案震驚了整個濱河市妈倔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绸贡,老刑警劉巖盯蝴,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異听怕,居然都是意外死亡捧挺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門尿瞭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來松忍,“玉大人,你說我怎么就攤上這事筷厘∶停” “怎么了宏所?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摊溶。 經常有香客問我爬骤,道長,這世上最難降的妖魔是什么莫换? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任霞玄,我火速辦了婚禮,結果婚禮上拉岁,老公的妹妹穿的比我還像新娘坷剧。我一直安慰自己,他們只是感情好喊暖,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布惫企。 她就那樣靜靜地躺著,像睡著了一般陵叽。 火紅的嫁衣襯著肌膚如雪狞尔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天巩掺,我揣著相機與錄音偏序,去河邊找鬼。 笑死胖替,一個胖子當著我的面吹牛研儒,可吹牛的內容都是我干的。 我是一名探鬼主播独令,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼端朵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了记焊?” 一聲冷哼從身側響起逸月,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤栓撞,失蹤者是張志新(化名)和其女友劉穎遍膜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓤湘,經...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡瓢颅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了弛说。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挽懦。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖木人,靈堂內的尸體忽然破棺而出信柿,到底是詐尸還是另有隱情冀偶,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布渔嚷,位于F島的核電站进鸠,受9級特大地震影響,放射性物質發(fā)生泄漏形病。R本人自食惡果不足惜客年,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漠吻。 院中可真熱鬧量瓜,春花似錦、人聲如沸途乃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽欺劳。三九已至唧取,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間划提,已是汗流浹背枫弟。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鹏往,地道東北人淡诗。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像伊履,于是被迫代替她去往敵國和親韩容。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容

  • 開篇補充 這篇文章大概寫于兩三個月前唐瀑,但一直忘記發(fā)布文章群凶。今天用了半小時把這篇文章大概瀏覽了下,依然感覺能學到很多...
    ZhengYaWei閱讀 3,517評論 3 32
  • 程序是如何跑起來的 內存和磁盤的親密關系 磁盤緩存是指:從磁盤中讀出的數(shù)據(jù)在內存中哄辣,當該數(shù)據(jù)再次被讀取時请梢,不是從磁...
    Mjericho閱讀 516評論 0 1
  • 程序是怎樣跑起來的 本文主要學習自 《c程序是怎樣跑起來》一書,再添加了一些自己的理解和注釋力穗,請各位觀者支持原版 ...
    Mjericho閱讀 564評論 0 2
  • 學習筆記 第8章 從源文件到可執(zhí)行文件 本章問題: 本章重點: 編譯器的功能毅弧;程序從源代碼到可執(zhí)行文件的流程;程序...
    c747190cc2f5閱讀 1,108評論 0 0
  • 作者:矢澤久雄[日]譯者:李逢俊 ??本文為對《程序是怎樣跑起來的》一書內容的整理和概括当窗,部分圖片够坐,文字摘選自書籍...
    SouthBegonia閱讀 417評論 0 1