對於程序員來講,最莫大的榮耀莫過於本身的軟件被大多數人使用了吧。java
歷史文章請戳ios
程序員須要瞭解的硬核知識之二進制github
本篇文章做爲操做系統的入門文章,可能入門都算不上吧,畢竟操做系統太龐大和複雜了。本篇文章主要帶你瞭解一下咱們經常使用的操做系統環境。小程序
程序中包含着運行環境
這一內容,能夠說 運行環境 = 操做系統 + 硬件 ,操做系統又能夠被稱爲軟件,它是由一系列的指令組成的。咱們不介紹操做系統,咱們主要來介紹一下硬件的識別。windows
咱們確定都玩兒過遊戲,你玩兒遊戲前須要幹什麼?是否是須要先看一下本身的筆記本或者電腦是否是能肝的起遊戲?下面是一個遊戲的配置(懷念一下 wow)api
圖中的主要配置以下
處理器:處理器指的就是 CPU,你的電腦的計算能力,通俗來說就是每秒鐘能處理的指令數,若是你的電腦以爲卡帶不起來的話,極可能就是 CPU 的計算能力不足致使的。想要加深理解,請閱讀博主的另外一篇文章:程序員須要瞭解的硬核知識之CPU
劍靈
開五檔(其實就是圖像變得更清晰)會卡,其實就是顯卡顯示不出來的緣由。內存:內存即主存,就是你的應用程序在運行時可以動態分析指令的這部分存儲空間,它的大小也能決定你電腦的運行速度,想要加深理解,請閱讀博主的另外一篇文章 程序員須要瞭解的硬核知識以內存
存儲空間:存儲空間指的就是應用程序安裝所佔用的磁盤空間,由圖中可知,此遊戲的最低存儲空間必需要大於 5GB,其實咱們都會遺留很大一部分用來安裝遊戲。
從程序的運行環境這一角度來考量的話,CPU 的種類是特別重要的參數,爲了使程序可以正常運行,必須知足 CPU 所需的最低配置。
CPU 只能解釋其自身固有的語言。不一樣的 CPU 能解釋的機器語言的種類也是不一樣的。機器語言的程序稱爲 本地代碼(native code)
,程序員用 C 等高級語言編寫的程序,僅僅是文本文件。文本文件(排除文字編碼的問題)
在任何環境下都能顯示和編輯。咱們稱之爲源代碼
。經過對源代碼進行編譯,就能夠獲得本地代碼
。下圖反映了這個過程。
計算機的硬件並不只僅是由 CPU 組成的,還包括用於存儲程序指令的數據和內存,以及經過 I/O 鏈接的鍵盤、顯示器、硬盤、打印機等外圍設備。
在 WIndows 軟件中,鍵盤輸入、顯示器輸出等並非直接向硬件發送指令。而是經過向 Windows 發送指令實現的。所以,程序員就不用注意內存和 I/O 地址的不一樣構成了。Windows 操做的是硬件而不是軟件,軟件經過操做 Windows 系統能夠達到控制硬件的目的。
接下來咱們看一下操做系統的種類。一樣機型的計算機,可安裝的操做系統類型也會有多種選擇。例如:AT 兼容機除了能夠安裝 Windows 以外,還能夠採用 Unix 系列的 Linux 以及 FreeBSD (也是一種Unix操做系統)等多個操做系統。固然,應用軟件則必須根據不一樣的操做系統類型來專門開發。CPU 的類型不一樣,所對應機器的語言也不一樣,一樣的道理,操做系統的類型不一樣,應用程序向操做系統傳遞指令的途徑也不一樣。
應用程序向系統傳遞指令的途徑稱爲 API(Application Programming Interface)
。Windows 以及 Linux 操做系統的 API,提供了任何應用程序均可以利用的函數組合。由於不一樣操做系統的 API 是有差別的。因此,如何要將一樣的應用程序移植到另外的操做系統,就必需要覆蓋應用所用到的 API 部分。
鍵盤輸入、鼠標輸入、顯示器輸出、文件輸入和輸出等同外圍設備進行交互的功能,都是經過 API 提供的。
這也就是爲何 Windows 應用程序不能直接移植到 Linux 操做系統上的緣由,API 差別太大了。
在同類型的操做系統下,不論硬件如何,API 幾乎相同。可是,因爲不一樣種類 CPU 的機器語言不一樣,所以本地代碼也不盡相同。
不知道你有沒有這個想法:「既然 CPU 不一樣會致使本地代碼不一樣,那爲什麼不將源代碼直接發送給程序呢?」這確實是一種解決辦法,Unix 系列的 FreeBSD
操做系統就使用了這種方式。
Unix 系列操做系統 FreeBSD 中,存在一種名爲 Ports
的機制。該機制可以結合當前運行環境的硬件環境來編譯應用的源代碼,進而獲得能夠運行的本地代碼。若是目標應用的源代碼在硬件上找不到,Ports 就會自動使用 FTP 鏈接到相應站點下載代碼。
全球有不少站點都提供適用於 FreeBSD 的應用源代碼。經過使用 Ports 能夠利用的程序源代碼,大約有 16000 種。根據不一樣的領域進行分類,能夠隨時使用。
FreeBSD 上應用的源代碼,大部分是用 C 語言來標註的,C 編譯器
能夠結合 FreeBSD 的運行環境來生成合適的本地代碼。
FTP( File Transfer Protocol) 是鏈接到互聯網上的計算機之間的傳送文件的協議。
即便不經過應用程序的移植,在同一個操做系統上仍然可使用其餘的操做系統,那就是使用 虛擬機軟件
。虛擬機(Virtual Machine)指經過軟件的具備完整硬件系統功能的、運行在一個徹底隔離環境中的完整計算機系統。在實體計算機中可以完成的工做在虛擬機中都可以實現。
總算是提到大 Java 了, Java 大法好,除了虛擬機的方法以外,還有一種方法可以提供不依賴於特定硬件和操做系統的程序運行環境,那就是 Java。
你們說的 Java 其實有兩層意思,一種是做爲編程語言的 Java;一種是做爲程序運行環境的 Java。Java 與其餘語言相同,都是經過源代碼編譯後運行的。不過,編譯後生成的不是特定 CPU 使用的本地代碼,而是名爲字節代碼
的程序。直接代碼的運行環境就稱爲 Java 虛擬機(Java Virtual Machine)
。Java 虛擬機是一邊把 Java 字節代碼逐一轉換爲本地代碼一邊在運行着。
程序運行時,將編譯後的字節代碼轉換爲本地代碼,這樣的操做看上去有些迂迴,但由此能夠實現相同的字節碼能夠在不一樣的操做系統環境下運行。
想象一下,你開發完成的應用部署到 Linux 環境下,是否是什麼都不用管?
Windows 有專門的 Windows 虛擬機,Macintosh 有 Macintosh 專門的虛擬機。從操做系統來看,Java虛擬機就是一個應用,從運行環境上來看,Java 虛擬機就是運行環境。
最後對一些比較基礎的部分作一些補充說明。程序的運行環境,存在着名爲 BIOS(Basic Input/Output System)
的系統。BIOS 存儲在 ROM 中,是預先內置在計算機主機內部的程序。BIOS 除了鍵盤、磁盤和顯卡等基本控制外,還有引導程序
的功能。引導程序是存儲在啓動驅動器啓示區域的小程序。操做系統的啓動驅動器通常硬盤。不過有時也多是 CD-ROM
或軟盤。
電腦開機後,BIOS 會確認硬件是否正常運行,沒有異常的話會直接啓動引導程序。引導程序的功能是把在硬盤等記錄的 OS 加載到內存中運行。雖然啓動應用是 OS 的功能,但 OS 不能啓動本身,是經過引導程序來啓動的。
文章參考:
《程序是怎樣跑起來的》第七章
關注公衆號後臺回覆 191106 便可得到《程序是怎樣跑起來的》電子書