給大家講一個計算機基礎知識,關於程序的編譯和解釋!

程序的編譯和解釋,你知道是什麼嗎?

如果你不清楚,或者瞭解的有點模糊,那麼今天這篇文章也許會幫到你,不妨來看一看,花不了你幾分鐘的時間,卻可以讓你get到一些新的知識點或者加深你的理解!

先來簡單瞭解下

我們是要說程序的編譯和解釋,也就是要搞清楚,編譯是個啥,解釋又是個啥,以及它們之間有啥關係和區別,知道這些啥用,基礎知識,可以幫助你更好的編程和學習新的技術知識。

正所謂基礎不牢,地動山搖啊,來,先來看看編譯和解釋是個啥:

編譯和解釋都屬於翻譯,翻譯的最終目的是把程序源代碼變成計算機可以執行的機器語言,也就是二進制的形式.
編譯的話是把源程序一次性的翻譯成機器語言,這樣的話計算機執行起來速度就比較快.
解釋的話是程序在執行的時候,一條條的把源碼翻譯成機器語言,這樣的速度就不如編譯了.

你要是理解能力超強的話,那看上面這些就基本能掌握今天要說的大部分知識了,只不過這其中牽涉到一些細節性的知識點,以及考慮到大部分人的理解能力不是特別的超強,所以我還是有必要繼續的詳細的解釋一下,如果你覺得只看上面明白的有點不知所以,那不妨跟着我繼續往下。

說所低級語言和高級語言

學過編程的你們對這兩個概念也許並不陌生,啥是低級語言,就是機器語言,彙編語言這些吧,那你說C語言是不是低級語言,其實吧,人家C語言不能算作是低級語言,但是高級語言又算不上,介於兩者之間吧。

高級語言就是我們常說的也是大家經常學的這些了,比如Java,Python和C++這些語言。

低級語言 : 最基本的低級語言就是機器語言了,早期的編程就是使用機器語言,這樣的難度是很大的,也就是0和1那種形式,對,是二進制的形式,二進制就是0和1組成的,不同的組合代表不同的含義或者指令,時代在進步,技術在發展,後來發展了一種把0和1組成的這種機器代碼指令用一些助記符號來表示,這就形成了彙編,彙編依然是低級語言,它是需要翻譯成機器代碼纔可以執行

其實可以將彙編代碼翻譯成不同平臺上的機器代碼,這叫做交叉彙編技術,不知道講到這大家理解的怎麼樣,如果覺得讀的酣暢淋漓,很爽的那種,那可以繼續往下看,但凡是有點不明不白,那可以稍微停下來,重讀一遍,不明白的地方儘量多讀幾遍,還好理解,既然花時間看這篇文章,還是希望大家有所收穫,不能是看完了,啥也沒有了。

再來看看高級語言。

上面也大致說了,所謂的高級語言也就是我們熟知的那些Java和跑Python等等,爲啥說是高級語言,因爲這些語言的設計邏輯大多是按照我們人的正常思維角度去設計的,所以看起啦門檻比較低,大部分高級語言都有自己的解釋器,這個解釋器就是把源碼翻譯成目標平臺代碼去執行。

狀態還ok?我們接着往下。

翻譯和執行(主要針對Java)

這裏我想帶大家瞭解兩個概念,一個是翻譯,一個是執行,就是簡單看看這倆貨是個啥,這有助於你對編譯和解釋的理解。

翻譯的目的是生成另外一套格式的代碼,是將A變成B ,生成的這個B可以直接被計算機執行 ,那就是翻譯一步到位,生成目標機器代碼,可直接運行 ,這個就叫做編譯。

當然 ,生成的B也有可能是個半成品,不能被計算機直接執行,是一種中間代碼 需要再次翻譯成目標機器代碼 ,這個再次翻譯的過程稱爲解釋 ,前者從A生成B的過程,也就是生成中間代碼的過程也是編譯 所以編譯可以直接一步到位 ,也可以編譯成一箇中間代碼,再進行解釋成計算機可以直接執行的目標代碼。

因此,翻譯包括兩種,一是編譯,二是解釋。

上面瞭解了什麼是翻譯,那執行嘞,對於代碼而言,執行的最終目的就是代碼要在計算機中運行起來,要想運行起來,那就得經過前面的翻譯過程,需要得到目標機器代碼,纔可以執行。

翻譯由上面知道分爲編譯個解釋,那麼也即是會有編譯執行和解釋執行了。

編譯執行和解釋執行

編譯執行就是把源程序一步到位翻譯成目標機器代碼,然後直接運行。

解釋執行是把生成的中間代碼,就是不是源程序了,然後把中間代碼一條一條的翻譯成目標機器代碼,翻譯一條執行一條,邊翻譯邊執行 ,Java就是這樣的。

這其實就是在告訴你什麼是編譯,什麼是解釋。編譯強調的是一次性做好準備工作,就是先把源碼全部翻譯成機器代碼,想要運行的可以直接讀取進行執行,但是解釋則不同,強調的是用的話再翻譯,也就是逐條翻譯,翻譯一點執行一點,邊翻譯邊執行的這種。

單獨看看解釋

其實我覺得編譯比解釋好理解點,比較純粹,也就是把源程序一次性翻譯成目標機器代碼,直接給你全部一次性搞成你想要的,運行的話直接讀取就行了,但是解釋就稍顯麻煩。

如果你是學Java的很可能對編譯和解釋就停留在上面的認知了,其實對於Java來說,上述理解很正確,編譯和解釋理解的也很到位,但是脫離Java放到其他高級語言之中,對於編譯的理解沒啥問題,但是對於解釋的理解就有點偏差,這是因爲在Java中,會編譯生成中間碼,也就是字節碼,然後字節碼依靠虛擬機解釋成平臺的目標機器碼。

因爲並不是其他語言也像java那樣會生成中間碼,先編譯字節碼,再解釋成目標機器碼,所以對於Java這門高級編程語言來說,既不能說是編譯型語言也不能說是解釋型語言,而是兩者都包含。

談到大家熟知的另外一門語言Python,它的翻譯模式就跟Java很像,也是先編譯成中間碼碼,然後再交由解釋器去解釋執行,但是像PHP這門語言就不同,它就是一門解釋型語言。

對於PHP來說,就是把源程序直接進行逐條翻譯成目標機器碼然後執行 中間沒有編譯啥的,直接就是解釋一條執行一條的這種,說的專業點也就是PHP將代碼解釋爲opcode之後再交由Zend引擎執行。

像C和C++,就是編譯型的語言,它會首先把源程序一次性編譯成目標機器代碼,然後再執行。

重要理解點,兩者區別

這裏說一個編譯額解釋兩者的一個區別,因爲個人覺得知道這點,對理解編譯和解釋之間的不同是有很大幫助的。

我們看編譯,經過上述的闡述,你應該知道了,編譯講究的是把源程序一次性翻譯成目標機器代碼,然後交由計算機去執行,這裏面很重要的一點就是,程序代碼經過編譯之後會生成另外一種可存儲的代碼,計算機執行是去讀取這些生成的代碼,一般就是目標機器代碼。

我們看Java的編譯過程,它是生成中間碼,也就是字節碼,這個字節碼你是可以看到的吧,就是javac命令之後的字節碼文件,這是可見的可存儲的另外一套代碼,生成的是可存儲的,這是編譯的一個特徵。

再反觀解釋,解釋一般就是翻譯和執行一起進行,逐條翻譯,然後邊翻譯邊執行,這個過程是不生成可存儲的目標代碼的。

對於編譯來說,它的翻譯和執行是分來的,先翻譯成一份代碼,然後再執行,但是對於解釋則不同,它的翻譯和執行是不分開的,翻譯和執行同步進行的。

知道什麼是編譯和解釋了嗎

到了這裏,不知道你搞清楚編譯和解釋了嗎?如果還是有點模糊,看看我下面的總結。

總結

我們寫的代碼最終想要在計算機上運行,是要轉換成計算機可以識別的機器代碼的,這個過程叫做翻譯,翻譯的方式分爲兩種,一種是編譯,一種解釋:

1、編譯:把源代碼或者是源程序一次性的翻譯成目標機器代碼,然後再執行,速度比較快,類似喫火鍋,先全部下完,然後再一起喫。
2、解釋:把源碼或者源程序逐條進行翻譯,就是翻譯一條執行一條,類似喫火鍋, 下着喫着。

最後提一點,關於編譯和解釋的一個背後的本質現象,就是在編譯的過程中,控制權在原始程序,也就是源碼或者源程序,因爲是要把源程序一次編譯成目標代碼的,所以你源程序決定了編譯後的最終機器代碼,而解釋則不同,它的控制權在於解釋器,因爲是讀一條解釋一條,這個中間解釋的過程是解釋器在主導。

再說回喫火鍋,邊喫邊下,相當於你是那個解釋器,你可以決定我喫啥,想喫啥就下啥,但是編譯那種,就像喫火鍋,一次性都放進鍋裏,你並不能決定你想喫啥就下啥,而是取決於你的食材,全部下在鍋裏,你也就只能喫那麼多了,也就是隻能在鍋裏選擇了。

咋樣,這下清楚了嗎?如果還是不明白,那我建議再讀一遍,或者留言說出你的疑惑。

另外由於本人技術能力有限,如果文章說的有不對的地方,煩請指正,大家一起學習!

ps:其實現在不能再那麼肯定說什麼什麼語言是解釋型還是編譯型,畢竟技術在進步,比如大家都覺得C語言就是編譯型語言,使用gcc編譯,但是實際上在TCC上可以直接解釋執行。再比如PHP真的就是解釋型語言嘛,Facebook很早就搞過一個hiphop編譯器,可以將PHP編譯成C++再編譯成二進制。

好啦,今天的分享就到這啦,覺得不錯的,期待你的在看和轉發哦!

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