計(jì)算機(jī)組成原理:計(jì)算機(jī)的層次與編程語言
計(jì)算機(jī)基礎(chǔ)方面的知識(shí),對(duì)于一些非科班出身的同學(xué)來講,一直是他們心中的痛,而對(duì)于科班出身的同學(xué),很多同學(xué)在工作之后,也意識(shí)到自身所學(xué)知識(shí)的不足與欠缺,想回頭補(bǔ)補(bǔ)基礎(chǔ)知識(shí)。關(guān)于計(jì)算機(jī)基礎(chǔ)的課程很多,內(nèi)容繁雜,但無論是相關(guān)書籍還是大學(xué)課程,都有點(diǎn)脫離工作。特別地,計(jì)算機(jī)基礎(chǔ)知識(shí)體系龐雜,想要從零學(xué)習(xí)或者復(fù)習(xí)都耗時(shí)耗力。
有鑒于此,本系列文章將帶你更快的補(bǔ)足編程必備基礎(chǔ)知識(shí),涵蓋計(jì)算機(jī)領(lǐng)域三大基礎(chǔ)知識(shí):計(jì)算機(jī)組成原理、操作系統(tǒng)、計(jì)算機(jī)網(wǎng)絡(luò),這些都是大學(xué)計(jì)算機(jī)課程里面最重要的內(nèi)容。文章對(duì)這些內(nèi)容做了提煉和總結(jié),摒棄了作為程序員不需要掌握的知識(shí)。
目的是:
- 幫助大家形成計(jì)算機(jī)知識(shí)的結(jié)構(gòu)體系
- 幫助大家理解計(jì)算機(jī)底層原理
- 幫助大家在工作實(shí)踐中借鑒其中的優(yōu)秀設(shè)計(jì)
程序翻譯與程序解釋
計(jì)算機(jī)是無法直接理解人類語言的,它只認(rèn)識(shí)01010101...這樣的比特位,因此,我們需要進(jìn)行程序翻譯或程序解析,把人類語言翻譯或解析成計(jì)算機(jī)所能理解的語言。
那么程序翻譯和程序解析這兩者之間有什么區(qū)別和聯(lián)系呢?為了理解問題,我們引入兩個(gè)語言,一個(gè)是較為高級(jí)的計(jì)算機(jī)語言——L1,另一個(gè)是較為低級(jí)的計(jì)算機(jī)語言——L0,我們接下來會(huì)使用這兩個(gè)語言作為例子來理解什么是程序翻譯,什么是程序解析。
程序翻譯
假設(shè)我們現(xiàn)在使用較為高級(jí)的計(jì)算機(jī)語言L1來進(jìn)行程序的邏輯描述,也就是說我們使用L1來編寫程序,那么這個(gè)由L1編寫的程序是怎么樣執(zhí)行的呢?當(dāng)然了,它不是直接執(zhí)行的,而是在執(zhí)行的時(shí)候生成一個(gè)邏輯等價(jià)的由低級(jí)語言L0組成的程序,這個(gè)L0是計(jì)算機(jī)實(shí)際執(zhí)行的語言,那么由L1生成L0這個(gè)過程,我們稱之為程序翻譯,用于生成L0的工具叫編譯器。

程序翻譯過程
程序解析
同樣的,假如我們使用L1來進(jìn)行程序的邏輯描述,那么這個(gè)由L1編寫的程序是怎樣執(zhí)行的呢?為了執(zhí)行L1,我們還需要使用L0實(shí)現(xiàn)另外一個(gè)程序,這個(gè)程序把L1程序作為輸入來進(jìn)行執(zhí)行,每一句L1程序會(huì)在L0所實(shí)現(xiàn)的程序里面進(jìn)行等價(jià)的轉(zhuǎn)換,然后執(zhí)行,這就是程序的解析,其中,使用L0實(shí)現(xiàn)的程序叫做解釋器。

程序解釋的過程
簡(jiǎn)要的總結(jié)程序翻譯和程序解析:
- 對(duì)于前面的兩個(gè)例子而言,計(jì)算機(jī)執(zhí)行的指令都是L0
- 翻譯過程生成新的L0程序,解釋過程不生成新的L0程序
- 解釋過程由L0編寫的解釋器去解釋L1程序
理解了程序翻譯和程序解釋,我們來看下常見的編程語言,哪些語言是翻譯型語言,哪些是解釋型語言,如下圖:

翻譯型語言和解釋型語言
對(duì)于常見的,我們還有Java和C#,它們又屬于哪種語言呢?其實(shí),嚴(yán)格的來說,它們既不屬于翻譯型語言,也不屬于解釋型語言,它們是屬于翻譯+解釋型語言。
如何理解翻譯+解釋型語言呢?以Java程序的運(yùn)行過程為例,Java程序首先會(huì)被編譯器編譯成JVM字節(jié)碼,然后會(huì)通過解釋器解釋成機(jī)器碼,從而被計(jì)算機(jī)執(zhí)行。

計(jì)算機(jī)的層次與編程語言
按層次來劃分計(jì)算機(jī)系統(tǒng)的話,我們可以劃分成七個(gè)層次。

計(jì)算機(jī)的層次
下面逐一介紹每一層。
硬件邏輯層:主要由門電路、觸發(fā)器等邏輯電路組成,屬于電子工程的領(lǐng)域,這里就不展開介紹了。
微程序機(jī)器層:編程語言主要是微指令集,微指令所組成的微程序直接交由硬件執(zhí)行,主要是由生產(chǎn)硬件的公司的程序員來編寫的。
傳統(tǒng)機(jī)器層:編程語言主要是CPU指令集(機(jī)器指令),和硬件是直接相關(guān)的,程序員所用機(jī)器指令編寫的程序可以交由微程序直接進(jìn)行解析,而這里提到的指令集,存儲(chǔ)在CPU內(nèi)部,對(duì)CPU的運(yùn)算進(jìn)行指導(dǎo)和優(yōu)化,擁有指令集,CPU就可以有效地運(yùn)行。我們知道,CPU的制造商分為AMD和Intel兩大陣營,那么這兩大廠商生產(chǎn)的CPU最大的區(qū)別是——指令集不同,Intel的CPU所使用的指令集不適合AMD的CPU,同樣的,AMD的CPU所使用的指令集也不適合Intel。除了不同廠商以后,同一個(gè)廠商也可以生產(chǎn)不同指令集的CPU,即不同架構(gòu)的CPU使用不同的CPU指令集。

微指令、微程序、機(jī)器指令的概念
操作系統(tǒng)層:操作系統(tǒng),一方面,向上提供了簡(jiǎn)易的操作界面,使得用戶能夠容易地操作計(jì)算機(jī);同時(shí),向下對(duì)接了指令系統(tǒng),管理硬件資源。操作系統(tǒng)對(duì)用戶程序所使用機(jī)器的各種資源進(jìn)行管理和分配,包括CPU、存儲(chǔ)器等等,比如說,當(dāng)一個(gè)用戶程序需要運(yùn)行的時(shí)候,首先由操作系統(tǒng)將其加載到內(nèi)存中,這就需要操作系統(tǒng)首先為其分配內(nèi)存空間來進(jìn)行存儲(chǔ)。再比如說,某一個(gè)程序需要使用某一個(gè)輸出設(shè)備進(jìn)行結(jié)果輸出的時(shí)候,需要操作系統(tǒng)為其提供該設(shè)備的控制權(quán)。由此可見,操作系統(tǒng)是在軟件和硬件之間的適配層。
匯編語言層:編程語言是匯編語言,匯編語言可以翻譯成可直接執(zhí)行的機(jī)器語言,完成這個(gè)翻譯過程的程序就是匯編器。從這一層開始,它們所使用的編程語言就是人類比較容易理解的語言了。
高級(jí)語言層:編程語言就是為廣大程序員所接受的高級(jí)語言,種類非常多,由幾百種,常見的編程語言有Python、Java、C/C++、Golang等。
應(yīng)用層:計(jì)算機(jī)針對(duì)某種用途而設(shè)計(jì)的應(yīng)用,像Word、Excel等。