天天看點

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

本節書摘來自異步社群《作業系統真象還原》一書中的第0章,第0.18節,作者:鄭鋼著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

解釋型語言,也稱為腳本語言,如javascript、python、perl、php、shell腳本等。它們本身是文本檔案,是某個應用程式的輸入,這個應用程式是腳本解釋器。

由于隻是文本,這些腳本中的代碼在腳本解釋器看來和字元串無異。也就是說,腳本中的代碼從來沒真正上過cpu去執行,cpu的cs:ip寄存器從來沒指向過它們,在cpu眼裡隻看得到腳本解釋器,而這些腳本中的代碼,cpu從來就不知道有它們的存在。這些腳本代碼看似在按照開發人員的邏輯執行,本質上是腳本解釋器在時時分析這個腳本,動态根據關鍵字和文法來做出相應的行為。是以腳本中若出現錯誤,先前正确的部分也會被正常執行,這和編譯型程式有很大差別。

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

舉個例子,假設下面是檔案名為a.php的php代碼。

php解釋器分析文本檔案a.php時,發現裡面的echo關鍵字,将其後面的參數擷取後就調用c語言中提供的輸出函數,如printf((echo的參數))。php解釋器對于php腳本,就相當于浏覽器對于javascript一樣,不過這個可完全是我猜測的,我不知道php解釋器裡面的具體工作,以上為了說清楚我的想法,請大家辯證地看。

而編譯型語言編譯出來的程式,運作時本身就是一個程序。它是由作業系統直接調用的。也就是由作業系統加載到記憶體後,作業系統将cs:ip寄存器指向這個程式的入口,使它直接上cpu運作。總之排程器在就緒隊列中能看到此程序。而解釋型程式是無法讓排程器“入眼”的,排程器隻會看到該腳本語言的解釋器。