天天看點

徹底了解作業系統:1,什麼是程式?

文章目錄

      • 那究竟是什麼是程式呢?
      • 程式是怎麼來的呢?
      • 天才的榆木疙瘩
      • 從文本字元串到機器指令
      • 翻譯官編譯器和解釋器
      • 偉大的C語言
      • 回到作業系統
      • 作業系統也是程式
      • 總結

雖然在這裡我們主要關注的是作業系統,但畢竟作業系統的目的就是能更好的運作使用者程式,而且該教程主要是站在程式員的角度來講解作業系統的,作為程式員是繞不開程式這個話題的。是以在深入了解作業系統之前還是有必要來聊一聊程式是怎麼一回事。

那究竟是什麼是程式呢?

我們引用Wikipedia對計算機程式的定義:

A computer program is a collection of instructions that performs a specific task when executed by a computer.

翻譯成大白話就是,能指揮計算機幹活的一堆指令就叫計算機程式。那怎樣才能寫出指揮計算機幹活的指令呢?這就涉及到程式是怎麼來的。

程式是怎麼來的呢?

程式是我們偉大的可敬的廣大程式員們用程式設計語言一個字元一個字元寫出來的文本字元串,隻不過這些文本字元串是人類可以認識的。無論用的什麼程式語言,C/C++、Java、Python、JavaScript、C#、Perl、Lua、Shell、彙編語言等等等等,隻要是你寫出來的文本字元串能指揮計算機幹活,這都叫程式。這些程式員認識的文本字元串就是可以指揮計算機完成特定任務的指令。你可能有點糊塗了,這些文本字元串真的就是計算機能用來完成特定任務的指令嗎?計算機不是隻認識0和1這兩個數字嗎?

天才的榆木疙瘩

計算機其實是一個數學學得非常差的家夥,以至于差到隻能認識兩個數,0和1,其它的就都不能認識了,我們要面對的就是這樣一個榆木疙瘩。

雖然這個榆木疙瘩數學不好識數不多,但是這家夥有一個我們人類難以望其項背的能力,不,對于人類來說簡直就是超能力,那就是這個榆木疙瘩算數非常快,對于簡單的加法我們人類可能一般一秒能算不超過10個,但是計算機一秒可以完成數十億次的計算,簡直是天才!雖然計算機能認識的數就隻有0和1這麼簡單,但是其計算速度展現出了簡單的威力。

從文本字元串到機器指令

至此,我們知道程式員(人類)和計算機是兩個完全不同的物種,不同的物種能了解的語言是完全不同的,就好比普通的人不會明白一群鳥語在說什麼一樣,我們人類也不能打開vim或者宇宙無敵IDE——Visual Studio直接寫0和1吧(雖然這是可以的,早期的程式員确實就是這麼幹的,牛不牛)。

是以,我們需要某種魔法把人類認識的C/C++、Java、Python之類的翻譯出計算機可以認識二進制01指令。這樣的魔法就來自兩個東西,編譯器和解釋器。

翻譯官編譯器和解釋器

編譯器大家應該都比較熟悉,我們寫好C/C++程式後第一步就是編譯,這裡編譯工作就是編譯器來完成的。你可以簡單的了解為編譯器把C/C++程式直接翻譯成計算機可以認識的01二進制機器指令。

對于解釋器有的同學可能就不是那麼熟悉了,寫Java、Python、C#程式的時候你從沒有聽說過要“編譯一下Java,編譯一下Python,編譯一下C#”吧。你可能會說C/C++程式我能了解了,編譯器把C/C++程式直接翻譯成了01二進制機器指令,那Java、Python一類的程式是怎麼運作的呢?

大家可以想一想,你在寫Python、Java、C#程式之前是不是要安裝一堆東西,稱之為“運作時環境”?

如果你想不起來,趕緊重新搭一套環境試試是不是這麼回事。

這裡的運作時環境其實就是解釋器。你可以把這個解釋器簡單的了解為就是一個程式,隻不過。。。注意注意!!!前方高能!!!,隻不過是解釋器這個程式可以運作你寫的Java、Python、C#的程式,**解釋器是一個可以運作程式的程式!!!**那解釋器這個程式又是怎麼來的呢?一般情況下這些解釋器其實是用C/C++寫出來的。隻不過用C/C++寫的這個程式專門用來執行你寫的Java、Python之類的程式,高能完畢。

偉大的C語言

希望到目前為止你還沒有暈,到這裡我們知道了,不管我們用的是Java、Python、JavaScript什麼的也好最終都逃不出C/C++(Go等語言除外),CPU不直接執行Java、Python、JavaScript之類的解釋型語言程式,CPU可以直接執行的是解釋器代碼,解釋器最終來執行Java等程式,這就是解釋型語言效率不如編譯型語言效率高的原因。因為C/C++程式最終被編譯器翻譯成了01機器指令,CPU可以直接運作運作機器指令,而對于解釋型語言來說CPU首先執行的是解釋器的程式,然後解釋器再執行你寫的程式,性能上當然不及編譯型語言。

而C++程式其實在編譯過程中也會轉化為C程式然後再轉為01二進制機器指令,并且們使用的Windows、Linux、MacOS等作業系統同樣是用C語言來編寫的,從最底層的作業系統到上層的應用程式實際上都逃脫不了C語言。

從這個角度看,C語言真是一門偉大的語言。

回到作業系統

饒了一大圈我們回到作業系統,接下來關于作業系統的講解中涉及到示例程式沒有明确說明的話指的是C語言程式。請注意,如果你對C語言不熟悉也沒有關系,我們示例都非常簡單不會涉及到複雜的C語言相關概念與用法,有任何語言的使用經驗都可輕松應對。

C語言程式編譯好後生成的可執行程式在Windows中就是我們熟悉的exe程式,在Linux下是elf程式,這些可執行程式編譯好後和普通檔案一樣存放在磁盤當中。

在接下來關于作業系統的讨論當中,沒有明确說明的話,以下幾個詞彙,“程式”,“使用者程式”,"應用程式"指的都是編譯好後放在磁盤上的可執行程式。

作業系統也是程式

一定要認識到,作業系統也是程式,隻不過這個程式不是簡單的往螢幕上列印helloworld,不能用來文字語音視訊聊天,不能用來上網,不能用來看電影,不能用來玩遊戲。那麼這個貌似什麼娛樂設施都提供不了的程式有什麼用呢?這個程式的作用無比重要,該程式的作用是為以上使用者程式提供一個良好的運作環境,管理計算機硬體資源包括:CPU、記憶體、磁盤、網卡、外設等等等等,這個程式就是該教程重點關注的作業系統。

總結

這是該教程的第一節,在這一節中我們從各個方面講解了程式這一話題。

程式分為編譯型程式,比如C/C++,以及解釋型程式比如Java、Python、JavaScript等。編譯型程式被編譯器直接翻譯成CPU可以直接運作的機器指令,而解釋型程式無需編譯,其運作依靠的是解釋器,解釋器是一個可以執行程式的程式,解釋器這個程式一般是由C/C++程式編寫的。

需要我們注意的是作業系統也是一個程式,隻不過這個程式的作用比較特殊,這個程式是用來管理計算機系統中各種軟硬體資源的,比如提供程序、線程機制,管理CPU等等,這個程式也是接下來該教材的主角。

更多計算機内功文章,歡迎關注微信公共賬号:碼農的荒島求生。

徹底了解作業系統:1,什麼是程式?

徹底了解作業系統系列文章

1,什麼程式?

2,程序?程式?傻傻分不清

3,程式員應如何了解記憶體:上篇

4,程式員應如何了解記憶體:下篇

5,程式員應如何了解記憶體:下篇

6,程式員應如何了解CPU:上篇

7,程式員應如何了解CPU:下篇

8,作業系統是如何看待程序的

9,系統調用是如何實作的

10,程式員應如何了解系統調用:上篇

11,程式員應如何了解系統調用:下篇

12,以發展的眼光來看待作業系統

13,作業系統是如何擷取鍵盤按鍵的

14,作業系統是如何擷取鍵盤按鍵的

計算機内功決定程式員職業生涯高度