1. 程式人生 > >通俗理解計算機系統及編程思維

通俗理解計算機系統及編程思維

積木 ado mark 區域 log 物理工具 分享 將不 red

計算機系統是一個眾多軟件運行在諸多硬件模塊上的系統。

技術分享圖片

現代的大部分計算機系統都是符合馮諾依曼的“存儲程序”概念和體系結構的系統。

軟件系統和硬件系統都有分治法與模塊化思想的體現。組成程序的函數或類(對象),組成硬件的模塊,都有輸入、輸出及接口的實現。

世界最早的計算機ENIAC,與現代計算機有太多不同,首先是特別笨重,需要一個大房間才可以容納下來,原因是其邏輯部件不是現在普遍使用的很小的組成大規模集成電路的晶體管,而是電子管,自然其連線也不是印刷電路,而是電纜。程序指令被存入在機器的外部電路裏,其編程是通過重新連接電纜來完成的,就像搭積木一樣,通過重新組合連接線路(模塊),而讓整個計算機來完成特定的任務,這是一種“外插型計算程序”。

自然,這樣的硬連接費時費力,非常不友好。如何實現完全的“自動化”?我們可以類推要自動化生產一個產品。自然,首先要把整個生產的工藝流程(由一張張的工藝指令卡組成)描述出來,工藝指令卡的每個動作都是生產設備可以完成的動作。另外,需要的物料或部件可以通過地址自動直接拿到。還有,工藝流程卡能夠按順序直接拿取並按工藝流程卡的要求協調其它協作部分的工作。

這一整套的思想就是馮諾依曼的“存儲程序”(stored program)概念,改外插型計算程序為內置,程序也被他巧妙地當作數據存進了機器內部,以便電腦一條接著一條地依次執行指令,再也不必去接通什麽線路,從而使整個計算過程完全由電子計算機自動控制。符合其思想的計算機系統(馮諾依曼體系架構)必須由以下部件組成:

一組精確定義的指令集,並通過硬件(CPU)來實現這些指令。

符合某種程序語言規範要求的程序,這種程序的源代碼由這種程序語言的編譯器(或解釋器)來翻譯成二進制指令序列,這些指令序列是指令集的排序組合。不同的操作系統需要不同的編譯器(或解釋器),而操作系統也是與硬件(指令集)對應的。

用於存放程序和數據的存儲器(可以隨機訪問);

能夠按照程序預設的順序讀取和執行指令,產生控制信號的控制器;

這樣,硬件模塊的組合就由以前的硬連接實現了軟連接(控制器取址、譯碼、產生控制信號)。

另外,如果要與用戶進行交互,則還需要輸入、輸出設備;

人類機械物理工具介入人類智能活動的第一步,也是最基本的一步始終是有限字長二進制數字的基本計算或邏輯運算,以及對它們的存儲。

真正的電子器件做計算機的開拓過程,經歷了從制作部件到整機,從專用機到通用機,從“外加式程序”到“存儲程序”的演變。

也就形成了協同工作的電子計算機五大部件:

技術分享圖片

1 運算器:進行邏輯運算,最基本的構成就是由開關邏輯元件(晶體管)構成的加法器;

2 控件器:從存儲在內存的代碼區的程序代碼取碼、譯碼,產生控制信號,協調其它部件的操作;

3 內存:任何運行的程序都必須將代碼存儲到內存的代碼區,同時分配一個存入數據的內存空間,這個內存空間進一步細分為全局區(包括靜態區)、常量只讀區、棧區(存放局部變量,內存空間可重復利用)、堆區(運行時申請)。

4 輸入設備:數據輸入;

5 輸出設備:數據輸出;

用布爾代數來實現開關電路(把布爾代數的“真”與“假”和電路系統的“開”與“關”對應起來,並用1和0表示),才使得布爾代數成為數字電路的基礎,所有的數學和邏輯運算,加、減、乘、除、乘方、開方等,全都能轉換成二值的布爾運算。而且,邏輯電路不只是具有數據計算和處理能力,還能具有記憶能力,引入循環電路就可實現。當然實現的是電存儲,斷電則數據將不復存在。

硬盤是什麽?硬盤上存儲的文件是一種數據結構,既可以做為程序的輸入(輸入到內存),也可以做為程序的輸出(從內存輸出,存儲到硬盤的文件中)。

磁存儲:將磁粉附著在平滑的鋁合金或玻璃圓盤基上。這些磁粉被劃分成稱為磁道的若幹個同心圓,每個同心圓就好像有無數的小磁鐵,它們分別代表著0和1狀態。當小磁鐵受到來自磁頭的磁力影響時,其排列方向會隨之改變。

固態硬盤的閃存儲電路:以浮空柵極是否帶電來表示存1或者0,浮空柵極帶電後(譬如負電荷),就在其下面,源極和漏極之間感應出正的導電溝道,使MOS管導通,即表示存入0。若浮空柵極不帶電,則不形成導電溝道,MOS管不導通,即存入1。

光存儲:一次性記錄的CD-R光盤主要采用(酞菁)有機染料,當此光盤在進行燒錄時,激光就會對在基板上塗的有機染料,進行燒錄,直接燒錄成一個接一個的"坑",這樣有"坑"和沒有"坑"的狀態就形成了‘0‘和‘1‘的信號,這一個接一個的"坑"是不能恢復的,也就是當燒成"坑"之後,將永久性地保持現狀,這也就意味著此光盤不能重復擦寫。這一連串的"0"、"1"信息,就組成了二進制代碼,從而表示特定的數據。對於可重復擦寫的CD-RW而言,所塗抹的就不是有機染料,而是某種碳性物質,當激光在燒錄時,就不是燒成一個接一個的"坑",而是改變碳性物質的極性,通過改變碳性物質的極性,來形成特定的"0"、"1"代碼序列。這種碳性物質的極性是可以重復改變的,這也就表示此光盤可以重復擦寫。

我們知道,數據在計算機系統內部的流動是通過三種總線實現的,分別是數據總線、控制總線、地址總線,地址總線的寬度決定了其可以訪問的內存的總的大小。就像一個國家郵政編碼的長度一樣,一定長度的郵政編碼只能訪問一定數量以內的的地區,如我們現在的郵政編碼是6位數,則最多可以編碼的區域就是10^6。如果地址總線的寬度是32位,則最多可以訪問的地址空間就是2^32≈4G。

技術分享圖片

這樣,需要解決某一個問題時,就可以用某種編程語言,考慮合適的數據結構和算法來編寫一個程序,由這種語言的特定操作系統的編譯器編譯為exe文件,將這個文件存儲到電腦的硬盤,運行後,在內存開辟存儲區,控制器取指令,翻譯指令,產生控制信號,協調其它部件工作,最終運行到程序的最後一條指令,完成程序的運行。

問題要數字化,既有數字編碼的問題,也有數據表示的問題。數據編就是字符表示成二進制的一種編碼方案(如ASCII、Unicode等)。數據表示也就是實現數據結構,數據結構既體現數據元素本身,也體現數據元素的相互邏輯關系,同時要體現數據在內存中的存儲實現。數據元素的相互邏輯關系可以是一對一的線性關系,如排隊的隊列,也可以是一對多的樹型關系,如親屬關系,也可以是多對多的圖形網狀關系,如一個國家以城市為節點的公路網絡。而在內存中的存儲關系主要有順序存儲和鏈式存儲兩種方式(通過元素的存儲地址體現出來)。

至於算法,不同領域,不同的問題有不同的算法,當然也有通用的算法,如貪婪法、分治法、窮舉法、回溯法等。另外,由一些編程大牛也實現了一些特定的高效的算法,如迪傑斯特拉的最短路徑算法、排序的快速排序法、查找的二分查找法等。

分治法是最基本的一種編程思維,面向過程的結構化程序設計最基本的思路就是自上而下,將問題逐漸分解為一個個子問題,子問題用函數去實現。面向對象的程序設計卻是自下而上,考慮問題涉及到的主體(對象),將對象涉及到的與問題相關的數據和對這些數據的操作封裝到對象中,由下而上,逐漸抽象為類,並形成繼承和多態關系。類與對象之間通過公共接口實現交互。在GUI程序設計中,通過消息映射、事件響應實現與用戶的交互。

技術分享圖片

編程需要一種機械思維,即站在計算機的角度去思考問題,按計算機能理解的語言逐步描述,程序的描述不能有二義性。

到於計算機語言,不同的計算機語言在設計時肯定有某一領域的側重,采用不同的編程範式,但總某些方法肯定有相同的地方,如程序控制結構,用類型系統進行數據的表示。

程序控制結構:

順序結構:代碼存放在內存的代碼區就是一種用地址表示的線性結構,控制器的程序計數器就是利用這種線性結構確定每條指令(代碼)的存放地址來實現讀取代碼的。順序結構以外的其它結構的實質都是通過跳轉實現的。

選擇結構:通常用if……else……、switch……case……來實現;

循環結構:通常用for……、while……、do……while來實現;

跳轉結構:如goto、continue、break、return等。

用類型系統進行數據的表示:

基本數據類型:一些數據值的類型;]

復合(結構)數據類型:數據聚集成一個集合,如數組、結構體;

類:一些對象的類型(如果是面向對象的語言);

模板:一些類或函數的類型;

以及數據的操作:各類型的運算符,函數庫,以及面向對象語言的運算符重載和類庫。

技術分享圖片

通俗理解計算機系統及編程思維