加載到內存中的機器語言程序,由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ù)類型。