2.1 編程語言
創(chuàng)新互聯(lián)公司于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元迎江做網(wǎng)站,已為上家服務(wù),為迎江各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
從本質(zhì)上來說,CPU只能運(yùn)行二進(jìn)制格式的指令,也就是CPU內(nèi)指令集限定的二進(jìn)制指令。
如果讓程序員通過二進(jìn)制進(jìn)行編程,那就太困難了,很少有人能夠通過二進(jìn)制進(jìn)行編程。但是人類又需要很多人能夠進(jìn)行編程,所以必須讓編程代碼能夠接近人類所能理解的思維方式才行。所以編程語言有所謂高級(jí)語言和低級(jí)語言之分。
一種編程語言離機(jī)器越近我們就說它越低級(jí),離人越近我們就說它越高級(jí)。高級(jí)并不是說功能強(qiáng),也不是指性能強(qiáng)大,而是指它越接近于人類的自然語言。
高級(jí)語言人類容易看懂了,但是計(jì)算機(jī)看不懂,所以要想使用高級(jí)語言寫的程序能夠在CPU中執(zhí)行,必須先將其轉(zhuǎn)換成CPU所能夠理解的二進(jìn)制指令。
如圖所示,從機(jī)器到人之間通常有三層,分別為機(jī)器語言-->匯編語言(微碼語言)-->高級(jí)語言。
2.1.1 高級(jí)語言編寫的程序的執(zhí)行過程
用高級(jí)語言編寫的程序要想執(zhí)行通常有2個(gè)過程:
a) 把高級(jí)語言轉(zhuǎn)換成匯編語言(轉(zhuǎn)換成對(duì)應(yīng)的CPU芯片所支持的匯編語言)
b) 把匯編語言轉(zhuǎn)換成對(duì)機(jī)器指令的調(diào)用
如果是C語言,第一步我們稱之為編譯的過程。
從高級(jí)語言轉(zhuǎn)換成匯編語言的過程取決于底層的CPU芯片是什么格式的。不同廠商所生產(chǎn)的不同型號(hào)的CPU是不一樣的。
2.1.2 編程語言的使用場(chǎng)景
匯編語言(微碼編程):用于編寫系統(tǒng)中某些與硬件相關(guān)的特有代碼、驅(qū)動(dòng)程序開發(fā)等
高級(jí)語言C,C++:用于編寫系統(tǒng)級(jí)應(yīng)用、對(duì)性能要求非常高的應(yīng)用、驅(qū)動(dòng)程序開發(fā)等
高級(jí)語言java,python,php:用于開發(fā)應(yīng)用程序
2.2 通用軟件
2.2.1 通過軟件的背景
上面已經(jīng)說過,不同廠商生產(chǎn)的CPU,其內(nèi)含的指令集是不一樣的。同樣,一個(gè)程序在512M內(nèi)存中運(yùn)行和在4G內(nèi)存中運(yùn)行,其所能夠使用的內(nèi)存資源也是不一樣的。因此寫程序時(shí)必須要告訴程序有多少內(nèi)存資源可以用,任何一個(gè)程序員寫任何一個(gè)程序都要考慮底層的機(jī)器是誰,是什么廠商的芯片,運(yùn)行的速度如何,擁有多少資源等等。寫一個(gè)程序是512M內(nèi)存的,就只能在512M內(nèi)存的機(jī)器上運(yùn)行,稍微換一個(gè)就不行了。這是非常麻煩的,因此,我們要達(dá)到靈活使用的目的,就必須將這些底層的差異給消除。那么如何消除這些底層的差異呢?
比如我們要去很多個(gè)國(guó)家旅游,每個(gè)國(guó)家的語言都不一樣,若想獨(dú)自旅行就要學(xué)多種語言,若我們不會(huì)這些國(guó)家的語言就可以找個(gè)懂這些國(guó)家語言的翻譯隨行。
同理,為了避免程序員寫程序時(shí)要應(yīng)付各種機(jī)器的不同情況,就找了一個(gè)翻譯,它本身能夠應(yīng)付各種底層的不同情況,但是向上輸出的接口是統(tǒng)一的。這就是通用軟件。
通用軟件是一種將底層計(jì)算機(jī)所提供的各種計(jì)算能力給抽象為一種統(tǒng)一接口的程序。無論底層是AMD的CPU還是Intel的CPU,都可以統(tǒng)一成一種提供計(jì)算能力的接口。無論內(nèi)存是多少G的,統(tǒng)一規(guī)定32位系統(tǒng)最多支持4G內(nèi)存,64位系統(tǒng)最多支持4G個(gè)4G的內(nèi)存。
有了通用軟件(操作系統(tǒng))以后,程序員寫程序就不用考慮底層的實(shí)現(xiàn)了,只需要針對(duì)操作系統(tǒng)的接口進(jìn)行編程。如此一來就大大的簡(jiǎn)化了編程的過程,效率自然提高了。
2.2.2 OS(Operation System)
OS是一種通用軟件程序。
在上一章我們說過,任何情況下,一個(gè)普通程序要想完成一個(gè)特權(quán)操作,是沒辦法直接進(jìn)行的,它必須向內(nèi)核申請(qǐng)。
當(dāng)系統(tǒng)運(yùn)行起來以后,操作系統(tǒng)隨時(shí)監(jiān)控在特權(quán)指令上,一旦發(fā)現(xiàn)有要執(zhí)行特權(quán)指令的程序,只能向操作系統(tǒng)發(fā)請(qǐng)求,由操作系統(tǒng)代理完成特權(quán)操作。所以操作系統(tǒng)必須能夠隨時(shí)接收程序發(fā)來的請(qǐng)求。那么操作系統(tǒng)允許接收哪些請(qǐng)求呢?以下這些就是操作系統(tǒng)完成的工作:
a) 硬件驅(qū)動(dòng)
b) 進(jìn)程管理
c) 內(nèi)存管理
d) 網(wǎng)絡(luò)管理
e) 安全管理
每一個(gè)被操作系統(tǒng)所允許接收的請(qǐng)求,都稱之為系統(tǒng)調(diào)用(System Call)。
2.3 編程層次
硬件規(guī)格(hardware specifiacation):面向硬件編程
系統(tǒng)調(diào)用(system call):面向操作系統(tǒng)編程
庫調(diào)用(library call):把非常多的底層功能整合出來,提供成離最終目標(biāo)更近的功能
程序員寫程序要么面向硬件規(guī)格,要么面向操作系統(tǒng)。而操作系統(tǒng)又過于底層,于是就有人把操作系統(tǒng)向上又抽象出來一層,也就是上面所說的庫調(diào)用。此時(shí)程序員編程的過程就簡(jiǎn)化多了。
下圖是編程層次的一個(gè)架構(gòu)圖:
2.3.1 ABI與API
眾所周知,windows下的應(yīng)用程序拿到Linux下是無法運(yùn)行的。
一個(gè)應(yīng)用程序一旦制作成了二進(jìn)制格式,其適用的操作系統(tǒng)平臺(tái)也就定下來了。編譯成了exe格式的就只能在windows下運(yùn)行,編譯成了elf格式的就只能在類Unix的系統(tǒng)下運(yùn)行。這是由應(yīng)用二進(jìn)制接口規(guī)定的,也就是ABI(Application Binary Interface)
ABI是一種操作系統(tǒng)接口格式,是一種規(guī)范,定義了系統(tǒng)平臺(tái)所屬。
面向不同操作系統(tǒng)的應(yīng)用程序,編譯成二進(jìn)制格式以后在不同平臺(tái)是無法兼容的。但是在沒有編譯的情況下,如果應(yīng)用程序的源代碼是針對(duì)不同平臺(tái)的相同接口進(jìn)行編寫的,那么該源程序就可以跨平臺(tái)編譯。也就是說源程序可以在windows下編譯,也可以在類Unix系統(tǒng)下編譯,編譯后的二進(jìn)制程序格式是不一樣的。
這里說的不同平臺(tái)的相同接口,這個(gè)接口是指應(yīng)用編程接口API(Application Programming Interface)。
API是一種應(yīng)用編程接口,程序員一般都是針對(duì)API進(jìn)行編程。
windows和linux的應(yīng)用程序格式不一樣,但是編程接口API卻可能是可以兼容的。這也就意味著,程序員在windows系統(tǒng)下以兼容模式寫的程序源代碼在linux下是兼容的。雖然源代碼是兼容的,但是一旦編譯成了二進(jìn)制格式,若是在linux下編譯的就只能在linux下運(yùn)行,若是在windows下編譯的就只能在windows下運(yùn)行。
面向庫的編程時(shí),程序員寫應(yīng)用程序源代碼是面向API進(jìn)行的,一旦編譯成二進(jìn)制格式了,就是面向ABI了。
2.3.2 UI(User Interface)
GUI(Graphic User Interface):圖形用戶接口,如windows桌面
CLI(Command Line Interface):命令行接口,如Unix/Linux下的命令行終端