《作業系統真象還原》——0.18編譯型程式與解釋型程式的區別

非同步社群發表於2017-05-02

本節書摘來自非同步社群《作業系統真象還原》一書中的第0章,第0.18節,作者:鄭鋼著,更多章節內容可以訪問雲棲社群“非同步社群”公眾號檢視

0.18 編譯型程式與解釋型程式的區別

解釋型語言,也稱為指令碼語言,如JavaScript、Python、Perl、PHP、Shell指令碼等。它們本身是文字檔案,是某個應用程式的輸入,這個應用程式是指令碼直譯器。

由於只是文字,這些指令碼中的程式碼在指令碼直譯器看來和字串無異。也就是說,指令碼中的程式碼從來沒真正上過CPU去執行,CPU的cs:ip暫存器從來沒指向過它們,在CPU眼裡只看得到指令碼直譯器,而這些指令碼中的程式碼,CPU從來就不知道有它們的存在。這些指令碼程式碼看似在按照開發人員的邏輯執行,本質上是指令碼直譯器在時時分析這個指令碼,動態根據關鍵字和語法來做出相應的行為。因此指令碼中若出現錯誤,先前正確的部分也會被正常執行,這和編譯型程式有很大區別。

順便猜想一下解釋型語言是如何執行的。我們在執行一個PHP指令碼時,其實就是啟動一個C語言編寫出來的直譯器而已,這個直譯器就是一個程式,和一般的程式是沒有區別的,只是這個程式的輸入則是這個php指令碼,在php直譯器中,這個指令碼就是個長一些的字串,根本不是什麼指令程式碼之類。只是這種直譯器瞭解這種語法,按照語法規則來輸出罷了。

舉個例子,假設下面是檔名為a.php的PHP程式碼。

<?php    這是php語法中的固定開始標籤
    echo "abcd"; 輸出字串abcd
?>    固定結束標籤

PHP直譯器分析文字檔案a.php時,發現裡面的echo關鍵字,將其後面的引數獲取後就呼叫C語言中提供的輸出函式,如printf((echo的引數))。PHP直譯器對於PHP指令碼,就相當於瀏覽器對於JavaScript一樣,不過這個可完全是我猜測的,我不知道PHP直譯器裡面的具體工作,以上為了說清楚我的想法,請大家辯證地看。

而編譯型語言編譯出來的程式,執行時本身就是一個程式。它是由作業系統直接呼叫的。也就是由作業系統載入到記憶體後,作業系統將CS:IP暫存器指向這個程式的入口,使它直接上CPU執行。總之排程器在就緒佇列中能看到此程式。而解釋型程式是無法讓排程器“入眼”的,排程器只會看到該指令碼語言的直譯器。


相關文章