雖然在這里我們主要關(guān)注的是操作系統(tǒng),但畢竟操作系統(tǒng)的目的就是能更好的運行用戶程序,而且該教程主要是站在程序員的角度來講解操作系統(tǒng),作為程序員是繞不開程序這個話題的,因此在深入理解操作系統(tǒng)之前還是有必要來聊一聊程序是怎么一回事。
究竟什么是程序?
我們引用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、匯編語言等等等等,只要是你寫出來的文本字符串能指揮計算機干活,這都叫程序。這些程序員認識的文本字符串就是可以指揮計算機完成特定任務(wù)的指令。你可能有點糊涂了,這些文本字符串真的就是計算機能用來完成特定任務(wù)的指令嗎?計算機不是只認識0和1這兩個數(shù)字嗎?
天才的榆木疙瘩
計算機其實是一個數(shù)學(xué)學(xué)得非常差的家伙,以至于差到只能認識兩個數(shù),0和1,其它的就都不能認識了,我們要面對的就是這樣一個榆木疙瘩。
雖然這個榆木疙瘩數(shù)學(xué)不好識數(shù)不多,但是這家伙有一個我們?nèi)祟愲y以望其項背的能力,不,對于人類來說簡直就是超能力,那就是這個榆木疙瘩算數(shù)非???,對于簡單的加法我們?nèi)祟惪赡芤话阋幻肽芩悴怀^10個,但是計算機一秒可以完成數(shù)十億次的計算,簡直是天才!雖然計算機能認識的數(shù)就只有0和1這么簡單,但是其計算速度體現(xiàn)出了簡單的威力。
從文本字符串到機器指令
至此,我們知道程序員(人類)和計算機是兩個完全不同的物種,不同的物種能理解的語言是完全不同的,就好比普通的人不會明白一群鳥語在說什么一樣,我們?nèi)祟愐膊荒艽蜷_vim或者宇宙無敵IDE——Visual Studio直接寫0和1吧(雖然這是可以的,早期的程序員確實就是這么干的,牛不牛)。
因此,我們需要某種魔法把人類認識的C/C++、Java、Python之類的翻譯出計算機可以認識二進制01指令。這樣的魔法就來自兩個東西,編譯器和解釋器。
翻譯官編譯器和解釋器
編譯器大家應(yīng)該都比較熟悉,我們寫好C/C++程序后第一步就是編譯,這里編譯工作就是編譯器來完成的。你可以簡單的理解為編譯器把C/C++程序直接翻譯成計算機可以認識的01二進制機器指令。
對于解釋器有的同學(xué)可能就不是那么熟悉了,寫Java、Python、C#程序的時候你從沒有聽說過要“編譯一下Java,編譯一下Python,編譯一下C#”吧。你可能會說C/C++程序我能理解了,編譯器把C/C++程序直接翻譯成了01二進制機器指令,那Java、Python一類的程序是怎么運行的呢?
大家可以想一想,你在寫Python、Java、C#程序之前是不是要安裝一堆東西,稱之為“運行時環(huán)境”?
如果你想不起來,趕緊重新搭一套環(huán)境試試是不是這么回事。
這里的運行時環(huán)境其實就是解釋器。你可以把這個解釋器簡單的理解為就是一個程序,只不過。。。注意注意!??!前方高能?。?!,只不過是解釋器這個程序可以運行你寫的Java、Python、C#的程序, 解釋器是一個可以運行程序的程序?。?! 那解釋器這個程序又是怎么來的呢?一般情況下這些解釋器其實是用C/C++寫出來的。只不過用C/C++寫的這個程序?qū)iT用來執(zhí)行你寫的Java、Python之類的程序,高能完畢。
偉大的C語言
希望到目前為止你還沒有暈,到這里我們知道了,不管我們用的是Java、Python、JavaScript什么的也好最終都逃不出C/C++(Go等語言除外),CPU不直接執(zhí)行Java、Python、JavaScript之類的解釋型語言程序,CPU可以直接執(zhí)行的是解釋器代碼,解釋器最終來執(zhí)行Java等程序,這就是解釋型語言效率不如編譯型語言效率高的原因。因為C/C++程序最終被編譯器翻譯成了01機器指令,CPU可以直接運行運行機器指令,而對于解釋型語言來說CPU首先執(zhí)行的是解釋器的程序,然后解釋器再執(zhí)行你寫的程序,性能上當然不及編譯型語言。
而C++程序其實在編譯過程中也會轉(zhuǎn)化為C程序然后再轉(zhuǎn)為01二進制機器指令,并且們使用的Windows、Linux、MacOS等操作系統(tǒng)同樣是用C語言來編寫的,從最底層的操作系統(tǒng)到上層的應(yīng)用程序?qū)嶋H上都逃脫不了C語言。
從這個角度看,C語言真是一門偉大的語言。
回到操作系統(tǒng)
饒了一大圈我們回到操作系統(tǒng),接下來關(guān)于操作系統(tǒng)的講解中涉及到示例程序沒有明確說明的話指的是C語言程序。請注意,如果你對C語言不熟悉也沒有關(guān)系,我們示例都非常簡單不會涉及到復(fù)雜的C語言相關(guān)概念與用法,有任何語言的使用經(jīng)驗都可輕松應(yīng)對。
C語言程序編譯好后生成的可執(zhí)行程序在Windows中就是我們熟悉的exe程序,在Linux下是elf程序,這些可執(zhí)行程序編譯好后和普通文件一樣存放在磁盤當中。
在接下來關(guān)于操作系統(tǒng)的討論當中,沒有明確說明的話,以下幾個詞匯,"程序","用戶程序","應(yīng)用程序"指的都是編譯好后放在磁盤上的可執(zhí)行程序。
操作系統(tǒng)也是程序
一定要認識到,操作系統(tǒng)也是程序,只不過這個程序不是簡單的往屏幕上打印helloworld,不能用來文字語音視頻聊天,不能用來上網(wǎng),不能用來看電影,不能用來玩游戲。那么這個貌似什么娛樂設(shè)施都提供不了的程序有什么用呢?這個程序的作用無比重要,該程序的作用是為以上用戶程序提供一個良好的運行環(huán)境,管理計算機硬件資源包括:CPU、內(nèi)存、磁盤、網(wǎng)卡、外設(shè)等等等等,這個程序就是該教程重點關(guān)注的操作系統(tǒng)。
總結(jié)
這是該教程的第一節(jié),在這一節(jié)中我們從各個方面講解了程序這一話題。
程序分為編譯型程序,比如C/C++,以及解釋型程序比如Java、Python、JavaScript等。編譯型程序被編譯器直接翻譯成CPU可以直接運行的機器指令,而解釋型程序無需編譯,其運行依靠的是解釋器,解釋器是一個可以執(zhí)行程序的程序,解釋器這個程序一般是由C/C++程序編寫的。
需要我們注意的是操作系統(tǒng)也是一個程序,只不過這個程序的作用比較特殊,這個程序是用來管理計算機系統(tǒng)中各種軟硬件資源的,比如提供進程、線程機制,管理CPU等等,這個程序也是接下來該教程的主角。
-
二進制
+關(guān)注
關(guān)注
2文章
795瀏覽量
41674 -
C語言
+關(guān)注
關(guān)注
180文章
7605瀏覽量
137001 -
程序
+關(guān)注
關(guān)注
117文章
3788瀏覽量
81105 -
C++
+關(guān)注
關(guān)注
22文章
2110瀏覽量
73688
發(fā)布評論請先 登錄
相關(guān)推薦
評論