第二章 計算機編程

2.1 編程語言

  從本質上來說,CPU只能運行二進制格式的指令,也就是CPU內指令集限定的二進制指令。

  如果讓程序員通過二進制進行編程,那就太困難了,很少有人能夠通過二進制進行編程。但是人類又需要很多人能夠進行編程,所以必須讓編程代碼能夠接近人類所能理解的思維方式才行。所以編程語言有所謂高級語言和低級語言之分。

  一種編程語言離機器越近我們就說它越低級,離人越近我們就說它越高級。高級並不是說功能強,也不是指性能強大,而是指它越接近於人類的自然語言。

  高級語言人類容易看懂了,但是計算機看不懂,所以要想使用高級語言寫的程序能夠在CPU中執行,必須先將其轉換成CPU所能夠理解的二進制指令。

wKiom1i2XYPiiZlNAAArC6h4roM361.jpg

  如圖所示,從機器到人之間通常有三層,分別爲機器語言-->彙編語言(微碼語言)-->高級語言。

2.1.1 高級語言編寫的程序的執行過程

  用高級語言編寫的程序要想執行通常有2個過程:

    a) 把高級語言轉換成彙編語言(轉換成對應的CPU芯片所支持的彙編語言)

    b) 把彙編語言轉換成對機器指令的調用

  如果是C語言,第一步我們稱之爲編譯的過程。

  從高級語言轉換成彙編語言的過程取決於底層的CPU芯片是什麼格式的。不同廠商所生產的不同型號的CPU是不一樣的。

2.1.2 編程語言的使用場景

  彙編語言(微碼編程):用於編寫系統中某些與硬件相關的特有代碼、驅動程序開發等

  高級語言C,C++:用於編寫系統級應用、對性能要求非常高的應用、驅動程序開發等

  高級語言java,python,php:用於開發應用程序


2.2 通用軟件

2.2.1 通過軟件的背景

  上面已經說過,不同廠商生產的CPU,其內含的指令集是不一樣的。同樣,一個程序在512M內存中運行和在4G內存中運行,其所能夠使用的內存資源也是不一樣的。因此寫程序時必須要告訴程序有多少內存資源可以用,任何一個程序員寫任何一個程序都要考慮底層的機器是誰,是什麼廠商的芯片,運行的速度如何,擁有多少資源等等。寫一個程序是512M內存的,就只能在512M內存的機器上運行,稍微換一個就不行了。這是非常麻煩的,因此,我們要達到靈活使用的目的,就必須將這些底層的差異給消除。那麼如何消除這些底層的差異呢?

  比如我們要去很多個國家旅遊,每個國家的語言都不一樣,若想獨自旅行就要學多種語言,若我們不會這些國家的語言就可以找個懂這些國家語言的翻譯隨行。

  同理,爲了避免程序員寫程序時要應付各種機器的不同情況,就找了一個翻譯,它本身能夠應付各種底層的不同情況,但是向上輸出的接口是統一的。這就是通用軟件。

wKiom1i2XjOznCuzAAAf54meGDw024.jpg

  通用軟件是一種將底層計算機所提供的各種計算能力給抽象爲一種統一接口的程序。無論底層是AMD的CPU還是Intel的CPU,都可以統一成一種提供計算能力的接口。無論內存是多少G的,統一規定32位系統最多支持4G內存,64位系統最多支持4G個4G的內存。

  有了通用軟件(操作系統)以後,程序員寫程序就不用考慮底層的實現了,只需要針對操作系統的接口進行編程。如此一來就大大的簡化了編程的過程,效率自然提高了。

2.2.2 OS(Operation System)

  OS是一種通用軟件程序。

  在上一章我們說過,任何情況下,一個普通程序要想完成一個特權操作,是沒辦法直接進行的,它必須向內核申請。

  當系統運行起來以後,操作系統隨時監控在特權指令上,一旦發現有要執行特權指令的程序,只能向操作系統發請求,由操作系統代理完成特權操作。所以操作系統必須能夠隨時接收程序發來的請求。那麼操作系統允許接收哪些請求呢?以下這些就是操作系統完成的工作:

  a) 硬件驅動

  b) 進程管理

  c) 內存管理

  d) 網絡管理

  e) 安全管理

  每一個被操作系統所允許接收的請求,都稱之爲系統調用(System Call)。


2.3 編程層次

  硬件規格(hardware specifiacation):面向硬件編程

  系統調用(system call):面向操作系統編程

  庫調用(library call):把非常多的底層功能整合出來,提供成離最終目標更近的功能

  程序員寫程序要麼面向硬件規格,要麼面向操作系統。而操作系統又過於底層,於是就有人把操作系統向上又抽象出來一層,也就是上面所說的庫調用。此時程序員編程的過程就簡化多了。

  下圖是編程層次的一個架構圖:

wKiom1i2YbiDUXvHAABYMBlqqe8846.jpg

2.3.1 ABI與API

  衆所周知,windows下的應用程序拿到Linux下是無法運行的。

  一個應用程序一旦製作成了二進制格式,其適用的操作系統平臺也就定下來了。編譯成了exe格式的就只能在windows下運行,編譯成了elf格式的就只能在類Unix的系統下運行。這是由應用二進制接口規定的,也就是ABI(Application Binary Interface)

  ABI是一種操作系統接口格式,是一種規範,定義了系統平臺所屬。

  面向不同操作系統的應用程序,編譯成二進制格式以後在不同平臺是無法兼容的。但是在沒有編譯的情況下,如果應用程序的源代碼是針對不同平臺的相同接口進行編寫的,那麼該源程序就可以跨平臺編譯。也就是說源程序可以在windows下編譯,也可以在類Unix系統下編譯,編譯後的二進制程序格式是不一樣的。

  這裏說的不同平臺的相同接口,這個接口是指應用編程接口API(Application Programming Interface)。

  API是一種應用編程接口,程序員一般都是針對API進行編程。

  windows和linux的應用程序格式不一樣,但是編程接口API卻可能是可以兼容的。這也就意味着,程序員在windows系統下以兼容模式寫的程序源代碼在linux下是兼容的。雖然源代碼是兼容的,但是一旦編譯成了二進制格式,若是在linux下編譯的就只能在linux下運行,若是在windows下編譯的就只能在windows下運行。

  面向庫的編程時,程序員寫應用程序源代碼是面向API進行的,一旦編譯成二進制格式了,就是面向ABI了。

2.3.2 UI(User Interface)

  GUI(Graphic User Interface):圖形用戶接口,如windows桌面

  CLI(Command Line Interface):命令行接口,如Unix/Linux下的命令行終端

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章