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

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

如果你不清楚,或者瞭解的有點模糊,那麼今天這篇文章也許會幫到你,不妨來看一看,花不了你幾分鐘的時間,卻可以讓你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++再編譯成二進位制。

推薦閱讀:

985畢業,土木工程工作兩年後轉行java,摸爬滾打三年目前年薪40K