計算機的軟、硬件都是一種排列組合的藝術。硬件是晶體管(邏輯門)的排列組合(包括由邏輯開關組合的加法器和記憶電路,基本邏輯門可以組合成簡單的加法器,加法器可以組合成復雜的邏輯模塊,可以逐級組合。每一個模塊都可以完成一些基本的操作,這些操作用0、1描述就是指令,全部模塊便可以對應一個指令集);軟件是基本指令或語句的組合,一個指令序列就是一個程序。從這個意義上理解,硬件可以理解為基本模塊的硬組合(固定連線),程序可以理解為基本模塊的軟組合(動態(tài)連線),這也是在現(xiàn)在計算機系統(tǒng)中,軟、硬件的界限模糊的原因所在。
計算機硬件的基本模塊雖然只能完成簡單的操作,但是其速度非???,1秒可以完成上億次的操作(對一些機械重復性的操作特別有優(yōu)勢)。另外,構成計算機基本單元的邏輯開關(晶體管)可以做到特別小,一個指甲大的芯片可以集成上億個晶體管(最近IBM的5nm技術可達300億個)。
所有裝有CPU芯片的機器都有一張操作命令清單(指令集),讓你可以控制它。有時這個清單非常簡短,如電水壺就只允許兩種操作:打開和關閉;CD播放器稍微復雜點,除了打開和關閉以外,還能調節(jié)音量、播放、暫停、快進、快退、隨機播放等。計算機和其他機器一樣,也有一張操作命令清單。比如,可以命令計算機把兩個數(shù)相加。這種操作命令的總和就是計算機的機器語言(machine language),直接面對機器,無須任何解釋,可以直接執(zhí)行。
如果計算機再安裝一個操作系統(tǒng),不但方便和簡化計算機的操作,還可以完成更復雜的任務,編程也可以調用操作系統(tǒng)的資源。
根據(jù)馮·諾依曼的內(nèi)部存儲程序概念,不管是指令、還是由指令處理的數(shù)據(jù)都保存到計算機的存儲體系中,同等對等。如1001,可以是一個數(shù)字,也可以是一個指令,或代表一個字符(到于具體代表什么,需要根據(jù)指令規(guī)范或計算機語言規(guī)范去在上下文中理解)。
一個程序(指令序列)運行時,全部的指令序列代碼存儲在內(nèi)存的代碼區(qū),全部指令都有地址對應;指令序列中定義的數(shù)據(jù)(或數(shù)據(jù)結構)存儲在內(nèi)存的數(shù)據(jù)區(qū)中,同樣有地址對應。不管是指令,還是指令中定義的數(shù)據(jù),都可以通過地址碼被訪問到。
在計算機系統(tǒng)中,指令集中的具體操作功能主要是由CPU的運算器去完成;對指令和和數(shù)據(jù)的存儲,由存儲器或寄存器去完成,對指令的和數(shù)據(jù)的調取、對指令的解釋,則由控制器去完成。
計算機系統(tǒng)(軟硬件大廈)的各個層次的基本特點可以概括為:
硬件:運算器在控制器的調度下操作存儲器(主存或寄存器)中的數(shù)據(jù);
機器語言:用操作碼處理地址碼;
匯編語言:用操作符號處理變量名字;
高級語言:用語句處理各種數(shù)據(jù)結構;
操作系統(tǒng):用系統(tǒng)命令處理文件;
計算機是數(shù)據(jù)處理的機器,具體的處理是由控制器調度和解釋操作碼、或操作符號、或語句、或系統(tǒng)命令,由運算器具體操作。處理的對象就是數(shù)據(jù),可以是表示數(shù)據(jù)的地址碼、或變量名字、或數(shù)據(jù)結構、或文件。對比到工廠的產(chǎn)品加工,就如同加工的具體動作、步驟、工藝、加工的對象,或是零件、或是物料。
寫程序也叫編代碼,用什么語言編呢?用機器語言編的01串,機器可以直接運行,運行效率高,但編寫和維護都很困難。有人想到,如果保留機器指令的結構,用便于記憶和理解的符號和名字(字母和10進制數(shù)字組成的字符串),去一一對應操作碼和地址,寫好后再通過查指令清單去轉換為01串,肯定要易于編寫和維護。至于如何查找和轉換,其實這正是計算機所擅長的,編寫一個這樣的轉換程序即可,這種思想下的語言就是匯編語言,轉換程序就是匯編器(匯編語言操作符號的字符串與機器語言操作碼的01串是一一對應的關系)。更進一步,用更抽象更接近自然語言的語句和數(shù)據(jù)結構來描述操作符號和變量名字,就是高級語言和編譯器(或解釋器)。
三種語言對指令序列的描述,可以對比一下:
上面說到,計算機的神奇之處在于速度特別快,特別擅長作機械重復性的工作。具體到語言,同樣的,通過跳轉或控制結構,也可以實現(xiàn)代碼的循環(huán)運行,實行重復操作。也就是說,假設要實現(xiàn)從1到10000連加,不需要編寫10000行代碼,只需要通過跳轉或控制結構,通過定義一個變量(對應一個內(nèi)存單元的數(shù)據(jù)),讓這一行或少數(shù)幾行代碼重復執(zhí)行10000次即可。如匯編語言的JMP、Basic的goto、C語言的for或while等循環(huán)結構都可以實現(xiàn)這種跳轉。(當然也可以實現(xiàn)按條件選擇執(zhí)行部分代碼,實現(xiàn)分支結構。)
1 機器語言:用操作碼處理地址碼
計算機的指令集是廠家編寫的,一份描述CPU芯片可完成的一些基本操作的清單,編程人員可以依據(jù)這份清單來編寫程序,組織一個指令序列。
指令集的指令從功能上一般可以區(qū)分分為:算術運算、邏輯運算、代碼傳送、控制指令、停機等。
每條指令都由操作碼(具體動作)和地址碼(指向具體數(shù)據(jù))組成。每條指令中無論是數(shù)據(jù)還是操作碼,全部都是0和1的串,對應邏輯開關的開與關。由指令序列構成的每個程序,也全部都是0和1。
機器語言(machine language)是機器指令的一個列表,其中的每個指令都能直接被處理器理解。它也可以理解成機器指令的一個執(zhí)行序列。
2 匯編語言:用操作符號處理變量名字
匯編語言(assembly language)是一種用于電子計算機、微處理器、微控制器或其他可編程器件的低級語言,亦稱為符號語言。在匯編語言中,用助記符(Mnemonics)代替機器指令的操作碼,用地址符號(Symbol)或標號(Label)代替指令或操作數(shù)的地址。在不同的設備中,匯編語言對應著不同的機器語言指令集,通過匯編過程轉換成機器指令。普遍地說,特定的匯編語言和特定的機器語言指令集是一一對應的,不同平臺之間不可直接移植。
3 高級語言:用語句處理各種數(shù)據(jù)結構;
由于匯編語言依賴于硬件體系,且助記符量大難記,于是人們又發(fā)明了更加易用的所謂高級語言。在這種語言下,其語法和結構更類似漢字或者普通英文,且由于遠離對硬件的直接操作,使得一般人經(jīng)過學習之后都可以編程。
高級語言又主要是相對于匯編語言而言的,它是較接近自然語言和數(shù)學公式的編程,基本脫離了機器的硬件系統(tǒng),用人們更易理解的方式編寫程序。編寫的程序稱之為源程序。
高級語言并不是特指的某一種具體的語言,而是包括很多編程語言,如流行的java,c,c++,C#,pascal,python,lisp,prolog,F(xiàn)oxPro,易語言,中文版的C語言習語言等等,這些語言的語法、命令格式都不相同。根據(jù)不同的抽象方式,還可以分為命令式語言、函數(shù)式語言、邏輯式語言、面向對象語言等。
不論何種高級語言,都有一些共同的指導思想。任何數(shù)據(jù)處理任務都應當分解成可以適當重復進行的許多過程,例如函數(shù)和子程序。程序中可以有平鋪直敘的“串行模塊”,反復執(zhí)行的“循環(huán)模塊”,以及根據(jù)情況判斷下一步往何處去的“分支模塊”。使用這三種模塊便可實現(xiàn)任何數(shù)據(jù)處理,這就是所謂的“結構化程序設計”(Procedure Oriented Programming,POP)。
在POP程序中,數(shù)據(jù)結構都是具體的,形式上沒有規(guī)定各個過程(對數(shù)據(jù)結構的操作)和數(shù)據(jù)結構的關系。這種“自由度”反而使程序的運行方式變得相當不自由。運行一個POP程序,基本上就是按事先設計好的順序,依次調用各個過程。過程的調用順序可以在運行中做適當改動,但這都要預先在程序中設計好,采用判斷或“中斷”的方式實現(xiàn)。程序員或用戶不能靈機一動,就在運行中隨意改變各個過程的組織方式。
到了20世紀80年代,出現(xiàn)了一套新的程序設計思想,即“面向對象的程序設計”(Object Oriented Programming,OOP)。OOP的基本思想是數(shù)據(jù)結構抽象化。在定義數(shù)據(jù)結構時,就要做好兩方面的規(guī)定,一是數(shù)據(jù)結構的性質、狀態(tài)或屬性;二是規(guī)定在此數(shù)據(jù)結構上允許實現(xiàn)的操作,凡是沒有事先規(guī)定的操作以后都不許使用。這樣的數(shù)據(jù)結構稱為一個對象或一個“類”。對象是帶有操作(方法或事件)的數(shù)據(jù)結構,或者說由操作刻畫的數(shù)據(jù)結構。從形式上看,數(shù)據(jù)結構和操作的關系不自由了。然而,這些對象是抽象地定義的,運行中可以隨時形成新的、同類的數(shù)據(jù)結構。這樣一來,就有了相當自由的程序運行環(huán)境。程序設計就是分別定義各種對象,把對象在調度程序中進行登記,而程序的運行就是動態(tài)地激活和調用各種對象。對象的調用順序和同時激活的對象數(shù)目都是相當自由的。
4 操作系統(tǒng):用系統(tǒng)命令處理文件
操作系統(tǒng)(Operating System,簡稱OS)是管理和控制計算機硬件與軟件資源的計算機程序,是直接運行在“裸機”上的最基本的系統(tǒng)軟件,任何其他軟件都必須在操作系統(tǒng)的支持下才能運行。
操作系統(tǒng)是用戶和計算機的接口,同時也是計算機硬件和其他軟件的接口。操作系統(tǒng)的功能包括管理計算機系統(tǒng)的硬件、軟件及數(shù)據(jù)資源,控制程序運行,改善人機界面,為其它應用軟件提供支持,讓計算機系統(tǒng)所有資源最大限度地發(fā)揮作用,提供各種形式的用戶界面,使用戶有一個好的工作環(huán)境,為其它軟件的開發(fā)提供必要的服務和相應的接口等。實際上,用戶是不用接觸操作系統(tǒng)的,操作系統(tǒng)管理著計算機硬件資源,同時按照應用程序的資源請求,分配資源,如:劃分CPU時間,內(nèi)存空間的開辟,調用打印機等。
一個用戶或編程人員如果面對一臺沒有操作系統(tǒng)的裸機,會是一個什么樣的情況呢?一是計算機的資源不會得到充分利用;二是計算機很難操作;三是編程也會變更異常困難。就像一人去了一個沒有基礎設施的城市,生活寸步難行。
首先從資源的角度去理解。從時間看,一臺計算機系統(tǒng)至少涉及三類相差懸殊的處理速度。主機的節(jié)拍每秒可以執(zhí)行上億的指令,而帶有電動機、繼電器等電機械成分的外部設備,1秒只能完成上千次動作,而人呢,速度更慢了。從空間來看,計算機有大量主存和外部設備,一般一個應用只占這些資源很小的一部分。如果一次只有一個應用運行,則從空間和時間來說,都是資源很大的一個浪費。
因此,操作系統(tǒng)便應運而生了,操作系統(tǒng)對計算機資源和用戶作業(yè)的調度管理,是重要的是“文件”概念。首先,有一大批供一切用戶共享的“系統(tǒng)文件”,其中包括操作系統(tǒng)本身和各種語言的編譯、解釋程序,以及產(chǎn)生和修改文件用的編輯程序、連接程序等。還有用戶在工作過程中逐步建立和積累的“用戶文件”。同時,文件也并不限于文字或編碼的信息,有些外部設備也可以當作“文件”看待。例如,鍵盤是一種“只讀文件”,打印機則是“只寫文件”。
文件的生成、修改、編輯、合并、刪除和目錄管理是操作系統(tǒng)最重要的功能之一。用戶眾多或文件成堆時還必須實行分層次的管理,允許建立和取消各級“子目錄”,這些都是文件管理系統(tǒng)的任務。
輸入和輸出設備的管理是操作系統(tǒng)的另一項重要任務。用戶所有的輸入輸出操作,都只能是向操作系統(tǒng)提出申請,由操作系統(tǒng)做出排隊處理的安排。
還有實時操作系統(tǒng)的時鐘管理、通信和網(wǎng)絡管理、提供程序調試手段、窗口管理、虛擬存儲管理、提供“中斷”服務,以及作業(yè)和“進程”的排隊調度等。
當然,還可以用操作系統(tǒng)命令編寫腳本,然后把腳本名字當成新的操作系統(tǒng)命令一樣使用。