計算機的軟、硬件都是一種排列組合的藝術。硬件是晶體管(邏輯門)的排列組合(包括由邏輯開關組合的加法器和記憶電路,基本邏輯門可以組合成簡單的加法器,加法器可以組合成復雜的邏輯模塊,可以逐級組合。每一個模塊都可以完成一些基本的操作,這些操作用0、1描述就是指令,全部模塊便可以對應一個指令集);軟件是基本指令或語句的組合,一個指令序列就是一個程序。從這個意義上理解,硬件可以理解為基本模塊的硬組合(固定連線),程序可以理解為基本模塊的軟組合(動態連線),這也是在現在計算機系統中,軟、硬件的界限模糊的原因所在。
計算機硬件的基本模塊雖然只能完成簡單的操作,但是其速度非常快,1秒可以完成上億次的操作(對一些機械重復性的操作特別有優勢)。另外,構成計算機基本單元的邏輯開關(晶體管)可以做到特別小,一個指甲大的芯片可以集成上億個晶體管(最近IBM的5nm技術可達300億個)。
所有裝有CPU芯片的機器都有一張操作命令清單(指令集),讓你可以控制它。有時這個清單非常簡短,如電水壺就只允許兩種操作:打開和關閉;CD播放器稍微復雜點,除了打開和關閉以外,還能調節音量、播放、暫停、快進、快退、隨機播放等。計算機和其他機器一樣,也有一張操作命令清單。比如,可以命令計算機把兩個數相加。這種操作命令的總和就是計算機的機器語言(machine language),直接面對機器,無須任何解釋,可以直接執行。
如果計算機再安裝一個操作系統,不但方便和簡化計算機的操作,還可以完成更復雜的任務,編程也可以調用操作系統的資源。
根據馮·諾依曼的內部存儲程序概念,不管是指令、還是由指令處理的數據都保存到計算機的存儲體系中,同等對等。如1001,可以是一個數字,也可以是一個指令,或代表一個字符(到于具體代表什么,需要根據指令規范或計算機語言規范去在上下文中理解)。
一個程序(指令序列)運行時,全部的指令序列代碼存儲在內存的代碼區,全部指令都有地址對應;指令序列中定義的數據(或數據結構)存儲在內存的數據區中,同樣有地址對應。不管是指令,還是指令中定義的數據,都可以通過地址碼被訪問到。
在計算機系統中,指令集中的具體操作功能主要是由CPU的運算器去完成;對指令和和數據的存儲,由存儲器或寄存器去完成,對指令的和數據的調取、對指令的解釋,則由控制器去完成。
計算機系統(軟硬件大廈)的各個層次的基本特點可以概括為:
硬件:運算器在控制器的調度下操作存儲器(主存或寄存器)中的數據;
機器語言:用操作碼處理地址碼;
匯編語言:用操作符號處理變量名字;
高級語言:用語句處理各種數據結構;
操作系統:用系統命令處理文件;
計算機是數據處理的機器,具體的處理是由控制器調度和解釋操作碼、或操作符號、或語句、或系統命令,由運算器具體操作。處理的對象就是數據,可以是表示數據的地址碼、或變量名字、或數據結構、或文件。對比到工廠的產品加工,就如同加工的具體動作、步驟、工藝、加工的對象,或是零件、或是物料。
寫程序也叫編代碼,用什么語言編呢?用機器語言編的01串,機器可以直接運行,運行效率高,但編寫和維護都很困難。有人想到,如果保留機器指令的結構,用便于記憶和理解的符號和名字(字母和10進制數字組成的字符串),去一一對應操作碼和地址,寫好后再通過查指令清單去轉換為01串,肯定要易于編寫和維護。至于如何查找和轉換,其實這正是計算機所擅長的,編寫一個這樣的轉換程序即可,這種思想下的語言就是匯編語言,轉換程序就是匯編器(匯編語言操作符號的字符串與機器語言操作碼的01串是一一對應的關系)。更進一步,用更抽象更接近自然語言的語句和數據結構來描述操作符號和變量名字,就是高級語言和編譯器(或解釋器)。
三種語言對指令序列的描述,可以對比一下:

上面說到,計算機的神奇之處在于速度特別快,特別擅長作機械重復性的工作。具體到語言,同樣的,通過跳轉或控制結構,也可以實現代碼的循環運行,實行重復操作。也就是說,假設要實現從1到10000連加,不需要編寫10000行代碼,只需要通過跳轉或控制結構,通過定義一個變量(對應一個內存單元的數據),讓這一行或少數幾行代碼重復執行10000次即可。如匯編語言的JMP、Basic的goto、C語言的for或while等循環結構都可以實現這種跳轉。(當然也可以實現按條件選擇執行部分代碼,實現分支結構。)
1 機器語言:用操作碼處理地址碼
計算機的指令集是廠家編寫的,一份描述CPU芯片可完成的一些基本操作的清單,編程人員可以依據這份清單來編寫程序,組織一個指令序列。
指令集的指令從功能上一般可以區分分為:算術運算、邏輯運算、代碼傳送、控制指令、停機等。
每條指令都由操作碼(具體動作)和地址碼(指向具體數據)組成。每條指令中無論是數據還是操作碼,全部都是0和1的串,對應邏輯開關的開與關。由指令序列構成的每個程序,也全部都是0和1。
機器語言(machine language)是機器指令的一個列表,其中的每個指令都能直接被處理器理解。它也可以理解成機器指令的一個執行序列。

2 匯編語言:用操作符號處理變量名字
匯編語言(assembly language)是一種用于電子計算機、微處理器、微控制器或其他可編程器件的低級語言,亦稱為符號語言。在匯編語言中,用助記符(Mnemonics)代替機器指令的操作碼,用地址符號(Symbol)或標號(Label)代替指令或操作數的地址。在不同的設備中,匯編語言對應著不同的機器語言指令集,通過匯編過程轉換成機器指令。普遍地說,特定的匯編語言和特定的機器語言指令集是一一對應的,不同平臺之間不可直接移植。


3 高級語言:用語句處理各種數據結構;
由于匯編語言依賴于硬件體系,且助記符量大難記,于是人們又發明了更加易用的所謂高級語言。在這種語言下,其語法和結構更類似漢字或者普通英文,且由于遠離對硬件的直接操作,使得一般人經過學習之后都可以編程。
高級語言又主要是相對于匯編語言而言的,它是較接近自然語言和數學公式的編程,基本脫離了機器的硬件系統,用人們更易理解的方式編寫程序。編寫的程序稱之為源程序。
高級語言并不是特指的某一種具體的語言,而是包括很多編程語言,如流行的java,c,c++,C#,pascal,python,lisp,prolog,FoxPro,易語言,中文版的C語言習語言等等,這些語言的語法、命令格式都不相同。根據不同的抽象方式,還可以分為命令式語言、函數式語言、邏輯式語言、面向對象語言等。


不論何種高級語言,都有一些共同的指導思想。任何數據處理任務都應當分解成可以適當重復進行的許多過程,例如函數和子程序。程序中可以有平鋪直敘的“串行模塊”,反復執行的“循環模塊”,以及根據情況判斷下一步往何處去的“分支模塊”。使用這三種模塊便可實現任何數據處理,這就是所謂的“結構化程序設計”(Procedure Oriented Programming,POP)。
在POP程序中,數據結構都是具體的,形式上沒有規定各個過程(對數據結構的操作)和數據結構的關系。這種“自由度”反而使程序的運行方式變得相當不自由。運行一個POP程序,基本上就是按事先設計好的順序,依次調用各個過程。過程的調用順序可以在運行中做適當改動,但這都要預先在程序中設計好,采用判斷或“中斷”的方式實現。程序員或用戶不能靈機一動,就在運行中隨意改變各個過程的組織方式。
到了20世紀80年代,出現了一套新的程序設計思想,即“面向對象的程序設計”(Object Oriented Programming,OOP)。OOP的基本思想是數據結構抽象化。在定義數據結構時,就要做好兩方面的規定,一是數據結構的性質、狀態或屬性;二是規定在此數據結構上允許實現的操作,凡是沒有事先規定的操作以后都不許使用。這樣的數據結構稱為一個對象或一個“類”。對象是帶有操作(方法或事件)的數據結構,或者說由操作刻畫的數據結構。從形式上看,數據結構和操作的關系不自由了。然而,這些對象是抽象地定義的,運行中可以隨時形成新的、同類的數據結構。這樣一來,就有了相當自由的程序運行環境。程序設計就是分別定義各種對象,把對象在調度程序中進行登記,而程序的運行就是動態地激活和調用各種對象。對象的調用順序和同時激活的對象數目都是相當自由的。
4 操作系統:用系統命令處理文件
操作系統(Operating System,簡稱OS)是管理和控制計算機硬件與軟件資源的計算機程序,是直接運行在“裸機”上的最基本的系統軟件,任何其他軟件都必須在操作系統的支持下才能運行。
操作系統是用戶和計算機的接口,同時也是計算機硬件和其他軟件的接口。操作系統的功能包括管理計算機系統的硬件、軟件及數據資源,控制程序運行,改善人機界面,為其它應用軟件提供支持,讓計算機系統所有資源最大限度地發揮作用,提供各種形式的用戶界面,使用戶有一個好的工作環境,為其它軟件的開發提供必要的服務和相應的接口等。實際上,用戶是不用接觸操作系統的,操作系統管理著計算機硬件資源,同時按照應用程序的資源請求,分配資源,如:劃分CPU時間,內存空間的開辟,調用打印機等。
一個用戶或編程人員如果面對一臺沒有操作系統的裸機,會是一個什么樣的情況呢?一是計算機的資源不會得到充分利用;二是計算機很難操作;三是編程也會變更異常困難。就像一人去了一個沒有基礎設施的城市,生活寸步難行。
首先從資源的角度去理解。從時間看,一臺計算機系統至少涉及三類相差懸殊的處理速度。主機的節拍每秒可以執行上億的指令,而帶有電動機、繼電器等電機械成分的外部設備,1秒只能完成上千次動作,而人呢,速度更慢了。從空間來看,計算機有大量主存和外部設備,一般一個應用只占這些資源很小的一部分。如果一次只有一個應用運行,則從空間和時間來說,都是資源很大的一個浪費。
因此,操作系統便應運而生了,操作系統對計算機資源和用戶作業的調度管理,是重要的是“文件”概念。首先,有一大批供一切用戶共享的“系統文件”,其中包括操作系統本身和各種語言的編譯、解釋程序,以及產生和修改文件用的編輯程序、連接程序等。還有用戶在工作過程中逐步建立和積累的“用戶文件”。同時,文件也并不限于文字或編碼的信息,有些外部設備也可以當作“文件”看待。例如,鍵盤是一種“只讀文件”,打印機則是“只寫文件”。
文件的生成、修改、編輯、合并、刪除和目錄管理是操作系統最重要的功能之一。用戶眾多或文件成堆時還必須實行分層次的管理,允許建立和取消各級“子目錄”,這些都是文件管理系統的任務。
輸入和輸出設備的管理是操作系統的另一項重要任務。用戶所有的輸入輸出操作,都只能是向操作系統提出申請,由操作系統做出排隊處理的安排。
還有實時操作系統的時鐘管理、通信和網絡管理、提供程序調試手段、窗口管理、虛擬存儲管理、提供“中斷”服務,以及作業和“進程”的排隊調度等。
當然,還可以用操作系統命令編寫腳本,然后把腳本名字當成新的操作系統命令一樣使用。















