計算機與程序是怎樣跑起來的?這确實是一個十分有趣的話題。想想計算機功能是如此強大,程序能夠完成很多複雜的任務,是不是覺得很神奇?再想想我們這個紛繁的世界和宇宙,有其複雜性也有其簡單性,竟然都是由原子和虛空組成的,因為排列組合而變得複雜。計算機硬件、編程語言、程序也是如此。計算機硬件的基本邏輯元件隻是一個邏輯開關,用來表示兩個狀态(稱為二進制),經過組合來表示不同的數字,用數字便可以表示萬物。程序也是如此,一般隻是由幾十個關鍵字、運算符、三個基本控制結構按某種編程語言規範組合起來,由一個翻譯程序(按編程語言規範)将程序翻譯成二進制序列給計算機執行即可。
0 布爾代數隻需要使用一些簡單的運算規則和兩個符号,如二進制的0或1。布爾代數是英國人布爾(Boole)于1847年提出來的,是數學和邏輯學的結合。
1 布爾代數可以在開關電路中實現,這是美國人香農(Shannon)在1938年提出來的,結合了數學、邏輯學、電學。
2 開關電路中的邏輯開關可以是繼電器、或電子管、或晶體管。(是創建計算機最核心的邏輯元件,關系到速度、能耗、穩定性、以及由價格影響到的普及問題)
3 開關電路可以實現邏輯門電路,如與、或、異或電路。
4 邏輯門可以組合成半加器、加法器,由加法器可以實現其它算術和邏輯運算。
5 邏輯門組合也可以實現記憶電路,從而實現存儲功能。
6 以上就是計算機實現基本的理論與硬件基礎。
7 最早的計算機是專用的,然後具有了通用性,通過插拔電線和外部開關實現計算任務的改變。
8 1945年,美國人馮諾依曼(von Neumann)為了實現計算機全過程的自動化,減少人為在計算前和計算中的人工幹預,提出 了“存儲程序、程序控制”的概念。
馮諾依曼認為數據和指令同等存儲在存儲器(内存、寄存器)中,根據編碼規則解釋讀取,由控制器解釋指令并産生控制信号,從而實現了計算機的通用性。
如何來實現相同任務的自動化呢?剛開始的“直接編程”是不具有自動化的,即在計算一道題之前,先由操作人員手工把多個部件用電線按一定方式連接起來,再設置一些開關。第二種稱為“存儲程序”,即先把題目所需要的計算指令序列輸入到電腦中存起來,由這些指令來自動地聯接部件和設置開關。現今我們使用的計算機都是采用“存儲程序控制”的思路。
編碼可以分為機器指令編碼(組合機器指令編碼來解決任務稱為機器語言編程)、内存地址和寄存器編碼、字符編碼、圖形編碼、聲音編碼、視頻編碼等。
9 内存地址和寄存器編碼
數據和指令存儲到存儲器,需要通過地址來訪問。
最開始16位CPU内部有20根地址線,其編碼區間為:00000H~0FFFFFH,所以,它可直接訪問的物理空間為1M(220)字節。而16位CPU内部存放存儲單元偏移量的寄存器(如:IP、SP、BP、SI、DI和BX等)都是16位,它們的編碼範圍僅為:00000H~0FFFFH。這樣,如果用16位寄存器來訪問内存的話,則隻能訪問内存的最低端的64K,其它的内存将無法訪問。為了能用16位寄存器來有效地訪問1M的存儲空間,16位CPU采用了内存分段的管理模式,并引用段寄存器的概念。
存儲單元中所存放的二進制信息通常稱為該存儲單元的内容或值,根據數據類型的不同,通過一個或多個内存單元(字節)拼接而成,由其首地址表示。如一個雙字的内容是該字地址所指向的單元及其後繼三個單元的内容拼接而成。
數據可以是存儲中的立即數,也可以是内存單元、還可以是寄存器,可以有多種方法來表示内存單元地址,稱為尋址方式。
10 機器指令之操作碼編碼
一個完整的機器指令通常包含有操作碼和操作數(數據,同樣需要編碼)。
自然,計算機的操作可以通過邏輯開關來控制,n個指令可以通過log2n個二進制數(位,邏輯開關)來表示,如一個字節(8個位)便可以表示255個機器指令,如:
11 數據編碼之數值編碼
有表示整數的補碼、表示浮點數的IEEE754編碼方案等。
12 數據編碼之字符編碼
字符需要另外一套編碼規則,如ASCII、GB2312、Unicode等,用一個數字來表示一個字符(字符的顯示需要另外一套編碼規則來解釋,這就是圖形編碼,後面簡單解釋),字符越多,需要的數字越多(還要考慮規律的問題),也就是需要的二進制位(存儲空間)更多,所以如何經濟地存儲是需要考慮的問題,對于ASCII全碼,因為隻使用了一個字符,存儲沒什麼問題,但如果一套符号體系需考慮更多的字節呢?
1個字節 1-256
2個字節 1-65536
3個字節 1-16777216
就隻是理論上表示的字符數,因為要考慮規律的問題,實際用于編碼的序列号要少很多,如GB2312的規則之一就是兼容ASCII,将ASCII碼以外的字符的首位編碼都是1。
如果編碼的字符達幾十萬,如unicode,需要考慮的字節數可以就是4個或以上,毫無疑問,前面的字符一個字節就夠,隻有後面的字符才需要更多的字節,為此,又搞出了一套存儲方案uft-8、uft-16、utf-32,實現等長或不等長的存儲,但應有自己的規則和與unicode對應的規則。
對于字符編碼,除了表示、存儲、顯示的問題,還有輸入的問題,如果你要輸入字母a,是否需要考慮其ASCII編碼呢,a的ASCII編碼是97,為什麼不從十進制的101開始編小寫字母呢,其實97的二進制數1100001比十進制的100更有規律。A的編碼65也是如此(2^6=64)。ASCII可輸入字符可以直接從鍵盤輸入,其内部再做轉換。
多字節編碼的漢字就不行了,你又不能去記其編碼後,為此又搞出來了一些輸入的編碼方案,如五筆,拼音輸入等。
13 數據編碼之圖形圖像編碼
圖形圖像包括點陣表示的位圖和函數表示的矢量圖。
13.1 位圖
黑白圖像就好比在其表面劃分出精細的小方格,每一方格稱為一個像素。若把全白的像素設定為11111111,全黑的像素設定為00000000,具有不同明暗的灰色介于兩者之間,則8比特就具有256種灰度的一個像素數字化的基礎。你完全可以使用更多的比特來保存一個像素的信息,這些信息既可以代表黑白層次,也能夠代表不同的彩色。事實上,多媒體電腦屏幕上每一像素的顔色已經超過數百萬種之多,十分逼真地接近自然色澤。把所有的像素組合起來,圖像或照片也就“數字化生存”于電腦屏幕、數字電視屏幕或彩色打印機紙上。
如bmp,以及壓縮存儲的jpg、png等。
13.2 矢量圖:
如CAD的swf,由直接和曲線組成,可以直接用公式進行描述和繪制。
14 聲音編碼
聲音其實是一種空氣中的振動,聲音通過話筒(利用電磁感應原理)轉變為時間上連續的電流(電壓波),電流(電壓波)與引起電流(電壓波)的聲波的變化規律是一緻的,因此可以利用電流(電壓波)來模拟聲音信号,這種電流(電壓波)被稱為模拟音頻信号。對模拟信号采樣、量化,便可以将模拟音頻信号轉化為一組用來表示聲音的二進制數字序列-數字音頻。至此,我們就成功地将聲音數字化了。當我們聽音樂時則是一個相反的過程。隻要你聽過CD激光唱片播放的立體音樂,對此就會有切身的感受。CD激光盤上布滿了極其微波的凹坑,每一個凸凹分别表示“0”,“1”的信息,音樂或聲音就以這一系列的凸凹方式,“數字化生存于光盤表面。
聲音編碼也就是音頻,如mp3編碼标準。
15 視頻編碼
一幅一幅靜态的圖像連續播放,又可構成動态的卡通片。配上悅耳動聽的音樂,附上文字字幕,再經過壓縮和解壓,電影、電視和多媒體電子圖書既能在光盤或磁盤上“數字化生存”,也可以通過互聯網絡傳輸到每一角落,“數字化生存”于整個地球。
視頻編碼也就是音頻與圖形圖像的結合,如mp4标準。
16 從機器指令到彙編指令
一個機器指令通常包含有操作數,一個完整的機器指令編碼需要考慮操作碼、尋址方式、操作數,具體的編碼規則可以通過查表獲得。
查表不正是計算機所擅長的嗎?如果用更容易理解和記憶的英文單詞或英文縮寫去表示機器指令,這樣的單詞或英文縮寫就稱為彙編指令,并通過一個翻譯程序去将對應的彙編指令翻譯成機器指令,這樣的編程語言稱為彙編語言,相對于用機器語言(對應一個機器指令集),彙編語言更方便編寫、閱讀和維護。
簡單一點理解,彙編語言就是通過建立 機器指令與彙編指令的對照表,然後由彙編器去做查找、替換。
17 從彙編指令到高級語言指令
用彙編指令編程還是比較繁瑣,計算機的翻譯程序似乎可以代替程序員做更多的工作。這樣的翻譯程序就是現在的編譯器或解釋器,是一種更高程度上的抽象,稱為高級語言。一條高級語言語句一般可以對應一條或多條 的彙編語句(機器指令語句)。高級語言的設計者設計語法規則,程序員按規則編寫解決問題的代碼,編譯器(設計時要考慮高級語言的語法規則、操作系統(在機器指令集上構建的基礎應用))按規則翻譯,當然規則的設計有其合理性。
17.1 面向過程的控制結構
在彙編語言中,有通過有無條件或有條件跳轉(cmp指令影響标志寄存器實現)實現循環,或通過用ecx寄存器作為循環計數器來實現loop循環,也可以使用僞指令實現循環結構。
跳轉可以實現條件分支和循環的效果。
當計算機編程尚處于起步階段時,程序流程是由“GOTO”語句來控制。該類語句允許程序員對當前代碼行斷行,而直接進入另一個不同的代碼段。
編程語言後來引入了函數的概念,即允許程序對代碼進行斷行。如果已經完成,不再使用goto語句來表示代碼的斷行。函數調用後,函數将回到下一條指令。其中一個主要的原因是,一個遍布goto語句的程序會讓讓人很難抓住重心,不便于對程序的理解和維護。
GOTO語句一直是批評和争論的目标,主要的負面影響是使用GOTO語句使程序的可讀性變差,甚至成為不可維護的“面條代碼”。随着結構化編程在二十世紀六十年代到七十年代變得越來越流行,許多計算機科學家得出結論,即程序應當總是使用被稱為“結構化”控制流程的命令,如if, else, switch, while, for等關鍵字和代碼塊實現的條件分支與循環。
17.2 機器碼、彙編代碼、C代碼的比較
17.3 面向對象的封裝、繼承、多态
引入了控制結構的面向過程思路雖然有其優越性,但模塊性還是不強,因為大型程序的構建,如果能使用搭積木的方式是最好的,為此,在有了面向對象的編程思維,對象就像一塊塊的預制件,先創建預制架構模闆(類),按預制架構模闆創建預制件(對象)。
面向對象的封裝技術,分離了内部實現和外部接口,當程序擴充時,可以将代碼的變更産生的影響縮小到最小的範圍。
對于大型程序而言,相對于面向過程思想構建的代碼,面向對象在代碼的編寫、維護方面更有優勢。
17.4 面向過程與面向對象的對比
17.5 面向過程與面向對象的代碼比較
18 程序的編碼、連接
程序運行的硬件平台:CPU指令系統;
程序運行的操作系統平台;
需要處理的數據有哪些?找到數據的規律或讓其更有規律;(數據結構)
怎樣将數據輸入到内存?
數據如何處理?(算法實現)
數據如何從内存輸出到顯示屏或打印機、文件、數據庫、網絡?
選擇計算機高語言、開發框架和對應的開發工具,将上述的步驟用計算機高級語言描述出來(利用開發工具的編輯框編輯代碼)?
利用開發工具的編譯器編譯代碼,此過程還包括利用開發工具的預處理器進行編譯前的預處理(如宏展開、庫文件包含(靜态鍊接)、條件編譯),以及使用調試器進行代碼調試;
用計算機語言對應的的編譯器編譯成計算機能理解的由“0”和“1”組成的二進制代碼(也可是程序運行時直接用計算機語言對應的解釋器直接解釋成二進制代碼)。
編譯完成後形成一個exe文件,這個文件可能要求在運行時需要動态加載DLL庫;
19 程序安裝(如有需要,小程序及綠色程序可直接運行)
19.1 在硬盤的某一位置創建一個專門的文件夾;
19.2 将需要的文件從硬盤的另一位置(下載後存放位置)或光盤複制到上述文件夾;
19.3 拷貝和注冊相關DLL文件到自己的安裝目錄或相關系統目錄下;
19.4 軟件的設置參數與DLL文件的注冊信息寫進注冊表;
19.5 上述的大型軟件由于涉及的文件、配置較多,一般會采用專業安裝程序制作工具,這樣的安裝文件會有詳細的選項,綠色軟件則不需注冊,可直接運行;
19.6 以上創建文件夾,複制文件,寫入注冊表等操作為避免用戶的不便操作,程序開發人員會采用專業安裝程序制作工具制作安裝文件,由此也可以通過更改增加安裝包的适當參數讓程序安裝自動完成,也可以利用第三方軟件錄制一次軟件安裝過程然而讓軟件以後安裝時可以自動運行。
廣義的綠色就是指不需要專門的安裝程序,對系統的改變比較少,手工也可以方便的完成這些改變,比如拷貝幾個動态庫,或者導入注冊表,這裡的關鍵是手工可以方便的完成這些改變,或者可以借助于批處理等等腳本完成。
狹義的綠色可以叫做純綠色軟件,就是指這個軟件對現有的操作系統部分沒有任何改變,除了軟件現在安裝的目錄,應該不往任何地方寫東西,删除的時候,直接删除所在的目錄就可以了,就類似于以前的大多數DOS程序。
20 程序運行過程
20.1 雙擊exe文件,操作系統創建一個新的進程和一個初始線程;
20.2 應用程序代碼裝載到内存;
20.3 動态鍊接庫裝載到内存(加載時動态鍊接庫(指定路徑),如有需要及exe中有此功能代碼);
20.4 為數據和堆棧分配物理内存,并映射到虛拟内存;
20.5 應用程序開始執行(運行時動态鍊接庫(按順序搜索指定的幾個路徑),如有需要及exe中有此功能代碼)。
-End-
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!