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