《作業系統真象還原》——0.18編譯型程式與解釋型程式的區別
本節書摘來自非同步社群《作業系統真象還原》一書中的第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執行。總之排程器在就緒佇列中能看到此程式。而解釋型程式是無法讓排程器“入眼”的,排程器只會看到該指令碼語言的直譯器。
相關文章
- 編譯程式與解釋程式區別?編譯
- 解釋型語言與編譯型語言的區別?編譯
- 解釋型語言、編譯型語言 區別編譯
- 《作業系統真象還原》核心記憶體分佈與載入作業系統記憶體
- 編譯型語言和解釋型語言的區別編譯
- 編譯型語言與解釋型語言編譯
- 概念區別 【編譯型語言與解釋型語言、動態型別語言與靜態型別語言、強型別語言與弱型別語言】編譯型別
- 獲取作業系統型別作業系統型別
- python---之編譯型語言和解釋型語言的區別Python編譯
- 作業系統——3、型別(7種)作業系統型別
- 你知道「編譯」與「解釋」的區別嗎?編譯
- python程式碼是解釋型語言,為什麼還有編譯過程?Python編譯
- 高階語言——編譯型、解釋型、混合型編譯
- 解釋和編譯的區別編譯
- 作業系統-執行緒和程式的區別作業系統執行緒
- 作業系統_程式和執行緒的區別作業系統執行緒
- PHP快速獲取作業系統型別PHP作業系統型別
- python 判斷作業系統型別Python作業系統型別
- 羅素悖論 型別系統與程式語言型別
- 作業系統系列----程式與程式 程式的描述作業系統
- 值型別與引用型別的區別型別
- 程式語言:型別系統的本質型別
- Python程式設計基礎(一)程式語言是什麼?編譯型語言和解釋型語言的區別|Python是什麼?Python程式設計編譯
- C#判斷作業系統型別總結C#作業系統型別
- Python 既是解釋型語言,也是編譯型語言Python編譯
- Linux作業系統上編譯程式的方法詳細介紹Linux作業系統編譯
- 關於解釋型語言和編譯型語言的疑惑,請教編譯
- JAVA 基本型別與 引用型別區別Java型別
- 『無為則無心』Python基礎 — 2、編譯型語言和解釋型語言的區別Python編譯
- 計算機語言:編譯型/解釋型、動態語言/靜態語言、強型別語言/弱型別語言計算機編譯型別
- js判斷瀏覽器型別和作業系統JS瀏覽器型別作業系統
- 作業系統3——程式的描述與控制作業系統
- 計算機程式語言的分類,解釋型語言、編譯型語言、指令碼語言的關係計算機編譯指令碼
- MIME郵件的multipart型別與text型別的區別型別
- [譯] Scala 型別的型別(四)型別
- [譯] Scala 型別的型別(二)型別
- [譯] Scala 型別的型別(三)型別
- [譯] Scala 型別的型別(六)型別