一、計算機元件簡介

       現代計算機裝置主要有五個部分組成:運算器、控制器、儲存器、輸入裝置、輸出裝置。CPU是中央處理器,是控制和運算器,是一臺計算機的運算核心和控制核心。儲存器的主要功能是儲存程式和各種。輸入輸出裝置我們一般統稱I/O,用於連線計算機內外部。而這些元件的連線則需要匯流排和主機板來完成。


1、CPU

       中央處理器(CPU,Central Processing Unit)是一塊超大規模的積體電路,是一臺計算機的運算核心和控制核心。它的功能主要是解釋計算機指令以及處理計算機軟體中的資料。CPU從記憶體或cpu快取中取出指令,放入指令暫存器,並對指令譯碼。它把指令分解成一系列的微操作,然後發出各種控制命令,執行微操作系列,從而完成一條指令的執行。


1)主頻

主頻也叫時鐘頻率,用來表示CPU的運算、處理資料的速度。通常,主頻越高,CPU處理資料的速度就越快。

問:主頻越高速度一定越快嗎?

答:假設某個CPU在一個時鐘週期內執行一條運算指令,那麼當CPU執行在2GHz主頻時,將比它執行在1GHz主頻時速度快一倍。因為2GHz的時鐘週期比1GHz的時鐘週期佔用時間減少了一半,也就是工作在2GHz主頻的CPU執行一條運算指令所需時間比工作在1GHz主頻時的時間縮短了一半,自然運算速度也就快了一倍,所以目前很多人對於超頻樂此不疲。但是使用主頻的高低來衡量處理器的效能,需要在相同的條件下相互比較,比如核心與執行緒數量,核心工藝(指令集),核心快取等因素對於處理器來說也非常重要,我們不能拿一個過去的高主頻的落後處理器和現在先進的低主頻處理器相比較,效能方面顯然是現在的處理器效能要好。

2)CPU快取

CPU快取位於CPU與記憶體之間的臨時儲存器,它的容量比記憶體小但交換速度快。

CPU快取的出現主要是為了解決CPU運算速度與記憶體讀寫速度不匹配的矛盾,因為CPU運算速度要比記憶體讀寫速度快很多,這樣會使CPU花費很長時間等待資料到來或把資料寫入記憶體。在Cache中的資料是記憶體中的一小部分,但這一小部分是短時間內CPU即將訪問的,當CPU呼叫大量資料時,就可避開記憶體直接從Cache中呼叫,從而加快讀取速度。由此可見,在CPU中加入Cache是一種高效的解決方案,這樣整個記憶體儲器(Cache+記憶體)就變成了既有Cache的高速度,又有記憶體的大容量的儲存系統了。

按照資料讀取順序和與CPU結合的緊密程度,CPU快取可以分為一級快取,二級快取,部分高階CPU還具有三級快取,每一級快取中所儲存的全部資料都是下一級快取的一部分,這三種快取的技術難度和製造成本是相對遞減的,所以其容量也是相對遞增的。當CPU要讀取一個數據時,首先從一級快取中查詢,如果沒有找到再從二級快取中查詢,如果還是沒有就從三級快取或記憶體中查詢。一般來說,每級快取的命中率大概都在80%左右,也就是說全部資料量的80%都可以在一級快取中找到,只剩下20%的總資料量才需要從二級快取、三級快取或記憶體中讀取,由此可見一級快取是整個CPU快取架構中最為重要的部分。

2、Memory

儲存器分記憶體儲器和外儲存器,外存主要是U盤、硬碟等,一般意義上我們會講外存歸類於I/O裝置。所以這裡的儲存器我們僅僅指的是記憶體。

記憶體是計算機中重要的部件之一,它是與CPU進行溝通的橋樑,是CPU能直接定址的儲存空間。我們平常使用的程式,如Windows作業系統、打字軟體、遊戲軟體等,一般都是安裝在硬碟等外存上的,但僅此是不能使用其功能的,必須把它們調入記憶體中執行,才能真正使用其功能,我們平時輸入一段文字,或玩一個遊戲,其實都是在記憶體中進行的。就好比在一個書房裡,存放書籍的書架和書櫃相當於電腦的外存,而我們工作的辦公桌就是記憶體。通常我們把要永久儲存的、大量的資料儲存在外存上,而把一些臨時的或少量的資料和程式放在記憶體上。

記憶體一般採用半導體儲存單元,包括隨機儲存器(RAM),只讀儲存器(ROM),以及快取記憶體(CACHE)。

ROM表示只讀儲存器(Read Only Memory),在製造ROM的時候,資訊(資料或程式)就被存入並永久儲存。這些資訊只能讀出,一般不能寫入,即使機器停電,這些資料也不會丟失。ROM一般用於存放計算機的基本程式和資料,如BIOS ROM。

RAM表示隨機儲存器(Random Access Memory)表示既可以從中讀取資料,也可以寫入資料。當機器電源關閉時,存於其中的資料就會丟失。我們通常購買或升級的記憶體條就是用作電腦的記憶體,記憶體條(SIMM)就是將RAM整合塊集中在一起的一小塊電路板,它插在計算機中的記憶體插槽上,以減少RAM整合塊佔用的空間。

高速緩衝儲存器(Cache)就是CPU快取,前文已經有介紹。

3、I/O

I/O(input/output),即輸入/輸出埠。每個裝置都會有一個專用的I/O地址,用來處理自己的輸入輸出資訊。常見的I/O裝置包括鍵盤、硬碟、印表機、滑鼠、鍵盤等。硬碟就是通過I/O介面,把資料送到記憶體中供CPU處理的。

4、BUS

匯流排(Bus)是由導線組成的傳輸線束。它是cpu、記憶體、輸入、輸出裝置傳遞資訊的公用通道,主機的各個部件通過匯流排相連線,外部裝置通過相應的介面電路再與匯流排相連線,從而形成了計算機硬體系統。


1)按照功能分類

資料匯流排:用於傳送資料資訊。資料匯流排是雙向三態形式的匯流排,即他既可以把CPU的資料傳送到儲存器或I/O介面等其它部件,也可以將其它部件的資料傳送到CPU。需要指出的是,資料的含義是廣義的,它可以是真正的資料,也可以是指令程式碼或狀態資訊,有時甚至是一個控制資訊,因此,在實際工作中,資料匯流排上傳送的並不一定僅僅是真正意義上的資料。常見的資料匯流排為ISA、EISA、VESA、PCI等。

地址匯流排:是專門用來傳送地址的,由於地址只能從CPU傳向外部儲存器或I/O埠,所以地址匯流排總是單向三態的,這與資料匯流排不同。地址匯流排的位數決定了CPU可直接定址的記憶體空間大小,比如8位微機的地址匯流排為16位,則其最大可定址空間為2^16=64KB,16位微型機的地址匯流排為20位,其可定址空間為2^20=1MB。一般來說,若地址匯流排為n位,則可定址空間為2^n位元組。

控制匯流排:用來傳送控制訊號和時序訊號。控制訊號中,有的是微處理器送往儲存器和I/O介面電路的,如讀/寫訊號,片選訊號、中斷響應訊號等;也有是其它部件反饋給CPU的,比如:中斷申請訊號、復位訊號、匯流排請求訊號、裝置就緒訊號等。因此,控制匯流排的傳送方向由具體控制訊號而定,一般是雙向的,控制匯流排的位數要根據系統的實際控制需要而定。

問:為什麼32位作業系統最大隻能支援4G記憶體?

答:32位代表地址匯流排位寬,匯流排的位寬指的是匯流排能同時傳送的二進位制資料的位數,而地址匯流排的位寬決定了CPU可直接定址的記憶體空間大小,由於二進位制每個位定址只有0、1兩種,所以32位作業系統的定址空間就是2^32=4GB。

2)按照層次分類

內部匯流排:在CPU內部,暫存器之間和算術邏輯部件ALU與控制部件之間傳輸資料所用的匯流排稱為片內匯流排(即晶片內部的匯流排),如I2C匯流排、SPI匯流排、SCI匯流排等。

系統匯流排:又稱內匯流排或板級匯流排,是微機中各外掛板與系統板之間的匯流排,用於外掛板一級的互聯。因為該匯流排是用來連線微機各功能部件而構成一個完整微機系統的,所以稱之為系統匯流排。人們平常所說的微機匯流排就是指系統匯流排,如ISA匯流排、PCI匯流排等。

外部匯流排:是計算機和外部裝置之間的匯流排,如IDE匯流排、USB匯流排、SCSI匯流排等。

3)按照傳輸方式分類

序列匯流排:所有訊號複用一對訊號線,序列匯流排通訊速率比較低,但在資料通訊量不是很大的微處理器電路中,顯得更加便捷、靈活。如USB匯流排、SPI匯流排、I2C匯流排等。

並行匯流排:每個訊號都有自己的訊號線,並行匯流排通訊速度快,實時性好,但由於佔用的口線多,成本上會有所增加。如ISA匯流排、PCI匯流排等。

5、主機板

主機板提供一系列接合點,供處理器、顯示卡、聲效卡、硬碟、儲存器、I/O裝置等裝置接合。它們通常直接插入有關插槽,或用線路連線。主機板上最重要的構成元件是晶片組。而晶片組通常由北橋和南橋組成,這些晶片組為主機板提供一個通用平臺供不同裝置連線,控制不同裝置的溝通。

晶片組(Chipset)是主機板的核心組成部分,幾乎決定了這塊主機板的功能,進而影響到整個電腦系統效能的發揮。按照在主機板上的排列位置的不同,通常分為北橋晶片和南橋晶片。北橋晶片提供對CPU的型別和主頻、記憶體的型別和最大容量、ISA/PCI/AGP插槽、ECC糾錯等支援。南橋晶片則提供對KBC(鍵盤控制器)、RTC(實時時鐘控制器)、USB(通用序列匯流排)、Ultra DMA/33(66)EIDE資料傳輸方式和ACPI(高階能源管理)等的支援。其中北橋晶片起著主導性的作用,也稱為主橋(Host Bridge)。


二、計算機系統層次總述


1、第一級是微程式級。這級的機器語言是微指令集,程式設計師用微指令編寫的微程式,一般是直接由硬體直接執行的。

2、第二級是傳統機器級,這級的機器語言是該機的指令集,程式設計師用機器指令編寫的程式可以由微程式進行解釋

3、第三級是作業系統級,從作業系統的基本功能來看,一方面它要直接管理傳統機器中的軟硬體資源,另一方面它又是傳統機器的延伸。

4、第四級是組合語言級,這級的機器語言是組合語言,完成組合語言翻譯的程式叫做彙編程式。

5、第五級是高階語言級,這集的機器語言就是各種高階語言,通常用編譯程式來完成高階語言翻譯的工作。

總結:不同層級的程式設計都是由不同的語言來完成了,越低階的語言越接近機器,越高階的語言越接近人類,所以我們大多數應用程式設計師都工作在高階語言級。而作業系統可以看做是一箇中間層,起到機器語言和人類自然語言承上啟下的作用,所以作業系統非常重要,也是我們後面學習的重點。

三、作業系統

1、作業系統作用:

1)遮蔽硬體物理特性和操作細節,向上輸出統一介面,為使用者使用計算機提供了便利

作業系統將底層計算機所提供的的各種計算能力抽象為一種統一介面的軟體,無論底層是AMD的cpu還是Inter的cpu,都統一成一個提供計算能力的,也不管記憶體是1G、2G、4G、8G都統一成32位系統4G記憶體,64位系統4G*4G的記憶體。所以程式設計師寫程式就大大的簡化了,不管底層到底硬體如何,我直觀面對linux或者window這種作業系統,或者32位、64位作業系統寫程式即可。這就是我們為什麼買了電腦第一件事情是裝作業系統,然後才能裝各種軟體,因為一般來說程式設計師寫程式是面對作業系統寫的,而不是面對機器寫的,沒有作業系統軟體沒法執行。

問:是不是軟體一定要在作業系統上才能執行?

答:並不是那麼絕對,如果程式設計師願意按照底層的機器語言去寫程式,是不需要作業系統的,但是底層的機器語言太過複雜,難以滿足現在應用軟體的需求。

2)有效管理系統資源,提高系統資源使用效率。如何有效地管理、合理地分配系統資源,提高系統資源的使用效率是作業系統必須發揮的主要作用。比如:硬體驅動、CPU時間片切割分配(程序管理)、記憶體管理、網路管理等等。

2、作業系統組成:


1)核心(Kernel)

核心,是一個作業系統的核心。從不同的角度來看,核心擔任的角色不同。從純技術角度來看,核心只是軟體和硬體的一箇中間層,它把從軟體發來的請求傳送給硬體,完成定址等操作,還充當了底層驅動。從應用程式角度來看,核心是對硬體的一個高層次的抽象,應用程式與硬體沒有聯絡,只與核心有聯絡,核心是應用程式知道的最底層。從多個併發的程序的角度來看,核心是一個資源管理器,它完成對程序的切換,排程,共享計算機資源(CPU,記憶體,磁碟,網路等)。還可以把核心看成一個庫,通過系統呼叫向核心傳送各種請求。

2)系統呼叫(System Calls)

在CPU的所有指令中,有一些指令是非常危險的,如果所有的程式都能使用這些指令,一旦錯用指令將導致整個系統崩潰,比如:清記憶體、設定時鐘等。所以,CPU將指令分為特權指令和非特權指令,對於那些危險的特權指令,只允許作業系統的核心使用,普通的應用程式只能使用那些不會造成災難的非特權指令。

但是一個應用程式肯定是特權指令和非特權指令都需要使用的,這時怎麼辦?

作業系統將程式的執行空間分為核心空間使用者空間(即核心態和使用者態),他們分別執行在不同的級別上,邏輯上是相互隔離的。使用者程序在通常情況下是不允許訪問核心資料的,它也就無法使用核心函式,它們只能在使用者空間操作使用者資料,呼叫使用者空間的函式。Intel的CPU將特權級別分為4個級別:RING0,RING1,RING2,RING3。Linux使用了Ring3級別執行使用者態,Ring0作為核心態,沒有使用Ring1和Ring2。Ring3狀態不能訪問Ring0的地址空間,包括程式碼和資料。而系統呼叫正是作業系統向用戶程式提供支援的介面,系統呼叫把應用程式的請求傳給核心,呼叫相應的的核心函式完成所需的處理,將處理結果返回給應用程式。注意,系統呼叫並非每一個時刻都會發生,只有那些特權指令才需要通過系統呼叫介面去請求核心。而一些非特權指令並不需要呼叫核心而直接可以執行在CPU上。

問:應用程式如何在使用者態和核心態之間切換?

答:當程序在執行使用者自己的程式碼時,我們稱其處於使用者態。即此時處理器在特權級最低的使用者程式碼中執行。每當使用者程序使用系統呼叫時,都自動地將執行模式從使用者級轉為核心級,此時程序在核心的地址空間中執行。當一個程序執行系統呼叫而陷入核心程式碼中執行時,我們就稱程序處於核心態。此時處理器處於特權級最高的核心程式碼中執行。當程序處於核心態時,執行的核心程式碼會使用當前程序的核心棧,每個程序都有自己的核心棧。

問:為什麼應用程式不能直接呼叫核心?

答:現代的作業系統通常都具有多工處理的功能,通常靠程序來實現。由於作業系統快速的在每個程序間切換執行,所以一切看起來就會像是同時的。同時這也帶來了很多安全問題,例如,一個程序可以輕易的修改程序的記憶體空間中的資料來使另一個程序異常或達到一些目的,因此作業系統必須保證每一個程序都能安全的執行。這一問題的解決方法是在處理器中加入基址暫存器和界限暫存器。這兩個暫存器中的內容用硬體限制了對儲存器的存取指令所訪問的儲存器的地址。這樣就可以在系統切換程序時寫入這兩個暫存器的內容到該程序被分配的地址範圍,從而避免惡意軟體。為了防止使用者程式修改基址暫存器和界限暫存器中的內容來達到訪問其他記憶體空間的目的,這兩個暫存器必須通過一些特殊的指令來訪問。通常,處理器設有兩種模式:“使用者模式”與“核心模式”,通過一個標籤位來鑑別當前正處於什麼模式。一些諸如修改基址暫存器內容的指令只有在核心模式中可以執行,而處於使用者模式的時候硬體會直接跳過這個指令並繼續執行下一個。同樣,為了安全問題,一些I/O操作的指令都被限制在只有核心模式可以執行,因此作業系統有必要提供介面來為應用程式提供諸如讀取磁碟某位置的資料的介面,這些介面就被稱為系統呼叫。當作業系統接收到系統呼叫請求後,會讓處理器進入核心模式,從而執行諸如I/O操作,修改基址暫存器內容等指令,而當處理完系統呼叫內容後,作業系統會讓處理器返回使用者模式,來執行使用者程式碼。

3)庫函式呼叫(Library Calls)

系統呼叫雖然是核心和使用者應用程式之間的溝通橋樑,是使用者應用程式訪問核心的入口點,但通常情況下,系統呼叫並不直接和程式設計師打交道,它僅僅是一個通過軟中斷機制(X86中的int 0x80)向核心提交請求以獲取核心服務的介面。應用程式是通過作業系統提供的應用程式設計介面(API)而不是直接通過系統呼叫來程式設計。作業系統API的主要作用是把作業系統的功能完全展示出來,提供給應用程式,基於該作業系統,與檔案、記憶體、時鐘、網路、圖形、各種外設等互操作的能力。此外,作業系統API通常還提供許多工具類的功能,比如操縱字串、各種資料型別、時間日期等。

在Linux中,API遵循了在UNIX中最流行的應用程式設計介面標準——POSIX標準,該標準基於當時現有的UNIX 實踐和經驗,描述了作業系統的系統呼叫程式設計介面(即API),用於保證應用程式可以再原始碼一級多種作業系統上移植執行,這些系統呼叫程式設計介面主要是通過 C 庫(libc)實現的。庫函式(library function)是由使用者或組織自己開發的,具有一定功能的函式集合,一般具有較好平臺移植性,通過庫檔案(靜態庫或動態庫)向程式設計師提供功能性呼叫。程式設計師無需關心平臺差異,由庫來遮蔽平臺差異性。

C庫(libc)提供了POSIX的絕大部分API,同時,核心提供的每個系統呼叫在C庫中都具有相應的封裝函式。系統呼叫與其C庫封裝函式的名稱常常相同,比如,read系統呼叫在C庫中的封裝函式即為read函式。實際上,從使用者的角度看,系統呼叫和C庫之間的區別並不重要,他們只需通過C庫函式完成所需功能。相反,從核心的角度看,需要考慮的則是提供哪些針對確定目的的系統呼叫,並不需要關注它們如何被使用。

4)系統呼叫和函式庫呼叫的聯絡和區別

系統呼叫和函式庫呼叫的聯絡:

    1、庫函式是在系統呼叫上的一層包裝,執行在使用者態(user mode),打個比方,庫函式相當於包工頭,系統呼叫是工人,我們可以自己找工人分任務,但一般是把任務攤給包工頭,包工頭再去給工人分任務。

    2、函式庫中的某些函式呼叫了系統呼叫介面,程式設計人員可以通過函式庫呼叫系統呼叫介面,當然高階程式設計也可以直接採用int 0x80進入系統呼叫,而不必通過函式庫作為中介;

    3、很多函式庫中的函式名與系統呼叫的名稱一樣,是因為該函式本身其實就是呼叫的系統呼叫,放到函式庫就是為了使用者態的使用,這樣可以減少使用者態到核心態的切換開銷。但系統呼叫和庫函式之間並不是一一對應的關係,可能幾個不同的函式會呼叫到同一個系統呼叫,也有可能一個函式呼叫多個系統呼叫。更有些函式並不依賴於任何系統呼叫,因為它們並不需要向核心請求任何服務。

系統呼叫和函式庫呼叫的區別:


問:一個程式需要執行核心程式碼最終都是要系統呼叫,但是為什麼我們通常的做法是呼叫庫函式而不是直接系統呼叫?

答: 1、庫函式呼叫不依賴於作業系統,平臺移植性好;

       2、庫函式給我們提供的介面更人性化,所以呼叫起來更方便;

       3、呼叫庫函式更安全,記憶體管理不用自己太操心;

       4、呼叫庫函式效率更高,雖然庫函式最終是呼叫系統函式,但是庫函式會比我們用更好的方式方法呼叫系統函式(比如說使用緩衝池)。

問:系統呼叫在各個作業系統是不同的,而庫函式呼叫最終還是會進行系統呼叫,那如何實現庫函式的可移植呢?

答:在各個作業系統之間,基於大部分需求會抽象出一箇中間層。在中間層中,中間層用了遮蔽底層細節,在程式設計師看來C言語庫就是這樣一箇中間層的作用。在各個平臺下,我們預設C標準庫中的函式都是一樣的,這樣基本可以實現可移植。但是對於C庫本身而言,在各種作業系統平臺下其內部實現是完全不同的,也就是說C庫封裝了系統呼叫介面在其內部的實現細節(編譯器來負責庫函式到系統呼叫之間的轉換)。  因此,C語言提供了我們在程式碼級的可移植性,即這種可移植是通過C語言這個中間層來完成的。

問:如果程式設計師寫的程式是面向API而非作業系統,具有可移植性,那為什麼一般情況下windows上的程式在linux上無法執行?

答:這裡說的可移植,是原始碼可移植,並非程式可移植,可執行程式是經過原始碼編譯而成的,編譯後原始碼就變成了機器語言二進位制程式碼,而不同作業系統編譯出來的二進位制程式碼是不同的,不同作業系統對二進位制程式碼的解釋也是不一樣的,並且編譯後的可執行檔案在各個作業系統中也是不一樣的。通俗的說如果把原始碼比喻成一篇中文文章,那麼用德語翻譯的文章只有德國人能看懂,用法語翻譯的文章只有法國人才能看懂。(編譯器是把原始碼整個編譯成目的碼,執行時不在需要編譯器,直接在支援目的碼的平臺上執行,這樣執行效率比解釋執行快很多。比如C語言程式碼被編譯成二進位制程式碼exe程式,在windows平臺上執行。)

關於更多系統呼叫和庫函式呼叫知識請參考:

四、組合語言

組合語言(assembly language)是一種用於電子計算機、微處理器、微控制器或其他可程式設計器件的低階語言,亦稱為符號語言。在不同的裝置中,組合語言對應著不同的機器語言指令集,通過彙編過程轉換成機器指令。

組合語言優點:

1、因為用匯編語言設計的程式最終被轉換成機器指令,故能夠保持機器語言的一致性,直接、簡捷,並能像機器指令一樣訪問、控制計算機的各種硬體裝置,如磁碟、儲存器、CPU、I/O埠等。使用匯編語言,可以訪問所有能夠被訪問的軟、硬體資源;

2、目的碼簡短,佔用記憶體少,執行速度快,是高效的程式設計語言,經常與高階語言配合使用,以改善程式的執行速度和效率,彌補高階語言在硬體控制方面的不足,應用十分廣泛。

組合語言缺點:

1、組合語言指令是機器指令的一種符號表示,而不同型別的CPU 有不同的機器指令系統,也就有不同的組合語言,所以,組合語言程式與機器有著密切的關係。所以,除了同系列、不同型號CPU 之間的組合語言程式有一定程度的可移植性之外,其它不同型別(如:小型機和微機等)CPU 之間的組合語言程式是無法移植的,也就是說,組合語言程式的通用性和可移植性要比高階語言程式低;

2、難於從組合語言程式碼上理解程式設計意圖,可維護性差,即使是完成簡單的工作也需要大量的組合語言程式碼,很容易產生bug,難於除錯;

3、使用匯編語言必須對某種處理器非常瞭解,而且只能針對特定的體系結構和處理器進行優化,開發效率很低,週期長且單調。

組合語言的運用場景:

歷史上,組合語言曾經是非常流行的程式設計語言之一。但隨著現代軟體系統越來越龐大複雜,大量經過了封裝的高階語言如C/C++,Pascal/Object Pascal也應運而生。這些新的語言使得程式設計師在開發過程中能夠更簡單,更有效率,使軟體開發人員得以應付快速的軟體開發的要求。而組合語言由於其複雜性使得其適用領域逐步減小。

但這並不意味著彙編已無用武之地。由於彙編更接近機器語言,能夠直接對硬體進行操作,生成的程式與其他的語言相比具有更高的執行速度,佔用更小的記憶體,因此在一些對於時效性要求很高的程式、許多大型程式的核心模組以及工業控制方面大量應用。

1、組合語言的大部分語句直接對應著機器指令,執行速度快,效率高,程式碼體積小,在那些儲存器容量有限,但需要快速和實時響應的場合比較有用,比如儀器儀表和工業控制裝置中。

2、在系統程式的核心部分,以及與系統硬體頻繁打交道的部分,可以使用匯編語言。比如作業系統的核心程式段、I/O介面電路的初始化程式、外部裝置的低層驅動程式,以及頻繁呼叫的子程式、動態連線庫、某些高階繪圖程式、視訊遊戲程式等等。拿Linux核心來講,雖然絕大部分程式碼是用C語言編寫的,但仍然不可避免地在某些關鍵地方使用了彙編程式碼。由於這部分程式碼與硬體的關係非常密切,即使是C語言也會顯得力不從心,而組合語言則能夠很好揚長避短,最大限度地發揮硬體的效能。

3、組合語言可以用於軟體的加密和解密、計算機病毒的分析和防治,以及程式的除錯和錯誤分析等各個方面。

4、通過學習組合語言,能夠加深對計算機原理和作業系統等課程的理解。通過學習和使用匯編語言,能夠感知、體會和理解機器的邏輯功能,向上為理解各種軟體系統的原理,打下技術理論基礎;向下為掌握硬體系統的原理,打下實踐應用基礎。

五、高階語言

由於組合語言依賴於硬體體系,且助記符量大難記,於是人們又發明了更加易用的所謂高階語言.高階語言(High-level programming language)是高度封裝了的程式語言,與低階語言相對。它是以人類的日常語言為基礎的一種程式語言,使用一般人易於接受的文字來表示(例如漢字、不規則英文或其他外語),從而使程式編寫員編寫更容易,亦有較高的可讀性,以方便對電腦認知較淺的人亦可以大概明白其內容。由於早期電腦業的發展主要在美國,因此一般的高階語言都是以英語為藍本。正因為高階語言是經過封裝的程式語言,所以不能直接被計算機所識別,並需經過轉化才能被執行,按轉換方式可以講他們分成兩類:

1、編譯型語言

編譯型語言包括C、C++等。這裡說的編譯是指在應用源程式執行之前,就將程式原始碼“翻譯”成組合語言,然後進一步的根據硬體環境被變成符合執行需要的機器語言的目標檔案。

2、解釋型語言

解釋型語言包括Python、Perl、ruby、JavaScript等。解釋型語言的實現中,翻譯器並不產生機器語言的目標檔案,而是產生易於執行的中間程式碼,這種中間程式碼與機器程式碼是不同的,中間程式碼的解釋是由直譯器軟體支援的,不能直接使用硬體。(我們不難發現在編譯型和解釋型中都沒有找到java,因為java既需要編譯又需要解釋,可以算是一種混合型的,只是java沒有直接編譯成為機器語言,而是編譯成為位元組碼,然後在Java虛擬機器上用解釋方式執行位元組碼。)


3、編譯型語言和解釋型語言的比較

1)執行效率

編譯語言需要編譯一次,執行直接執行、不需要翻譯,所以編譯型語言的程式執行效率高;

解釋語言的程式不需要編譯,在執行程式的時候才翻譯,這樣解釋性語言每執行一次就要翻譯一次,效率比較低。

2)使用方便

編譯型語言編寫的應用程式一旦需要修改,必須先修改原始碼,再重新編譯生成新的目標檔案才能執行,只有目標檔案而沒有原始碼,幾乎是沒法修改的;

解釋型語言編寫的應用程式是由另一個可以理解中間程式碼的解釋程式執行的,所以當語句出現語法錯誤時,可以立即引起程式設計師注意,而程式設計師在程式開發期間就能進行校正。

3)跨平臺性

編譯型語言需要依賴編譯器,而編譯器是基於作業系統,所以平臺移植性差;

解釋型語言需要依賴直譯器,而直譯器不基於作業系統,所以平臺移植性好。

4)應用場景

編譯型語言由於其執行效率高,所以一般用於一些底層的開發上,如驅動,網路裝置,作業系統核心等等。

解釋型語言由於其接近人類自然語言且相對簡單,所以一般用於開發應用程式、遊戲、網站等。

總結:從機器語言、組合語言、再到不同型別的高階語言,縱觀整個計算機系統語言體系,我們會發現越靠近人類自然語言的就越簡單,用的也越多,但是執行效率也越低。而越靠近機器語言的就越複雜,用的也越少,但是執行效率越高。因此在計算機體系下不同的層次和場景,需要選擇不同的語言對其進行程式設計