菜鳥經常將編譯器和直譯器弄混淆,無奈之下,於是向高手請教。
高手說:
「直譯器是一條一條的解釋執行源語言。比如php,python就是的解釋性語言。
編譯器是把源**整個編譯成目標**,執行時不在需要編譯器,直接在支援目標**的平台上執行,這樣執行效率比解釋執行快很多。比如c語言**被編譯成二進位制**(exe程式),在windows平台上執行。」
菜鳥說:「我還是不明白,能給個形象的比喻麼?」
高手說:「給你講個故事。」
兒子想,對啊,爸年紀大了,身體不好,買點犛牛骨髓壯骨粉不錯,於是兒子就去超市買了犛牛骨髓壯骨粉。
兒子又想啊,最近**搭檔很火,買點給爸試試。於是兒子又去買了**搭檔。
從超市回來後,兒子又尋思母親說的「家裡不熱鬧」,嗯,家裡的小皇帝自從上寄宿學校後就比較少回來,估計是老人家想孫子了。兒子於是給上高中的兒子打了個**,讓他週末回來看看。
女兒就想,應該給爸做點什麼呢?於是她拿出張紙開始羅列條目,先寫上了壯骨粉和**搭檔。然後,想著讓老人家看看外孫應該不錯,於是就在紙上加上了一句,一家人回爸媽那裡看望看望。最後紙上就寫著:
1.壯骨粉和**搭檔
2.一家人去看望爸媽
女兒見到女婿後,就將這張紙上的資訊編成簡訊發給了工作的女婿。
女婿一看就明白了,下班後先去超市買了補品,然後開車回家帶著妻兒就去看望岳父岳母了。
想到什麼了嗎?
菜鳥說:
我這樣說不知道對不對:兒子就像是直譯器,是想到一點做一點。女兒就像編譯器,女婿就像平台,女兒聽完後,在紙上羅列出所有要做的事情,女婿就按著指示辦事了。
高手說:
就是這樣的。兒子對於母親的話是一條一條執行,女兒是將母親的話整個翻譯成平台能理解的目標語言--簡訊,整個由女婿直接執行。後者的執行效率會更高。
從功能上看,直譯器和編譯器確實不一樣。
然而,從流程和結構上看,二者卻非常相似。
兒子和女兒聽到母親的話以後,都是從兩個方面來思考:老人的身體和老人對小輩的思念。以此為據,兒子和女兒都做出了自己的決定。只不過乙個直接去做了,另乙個卻將所要做的事情翻譯成另一種載體--簡訊--給儲存起來。
直譯器和編譯器也是如此,讀入源語言後,直譯器和編譯器都要進行詞法分析、語法分析和語義分析,之後,二者開始有所分別。直譯器在語義分析後選擇了直接執行語句;編譯器在語義分析後選擇將將語義儲存成某一種中間語言,之後通過不同的後端翻譯成不同的機器語言(可執行程式)。如下圖所示:
總之,解析器和編譯器它們在功能上是不一樣的,然而從結構上看卻有諸多相同,而且在開發時也並沒有本質上的差別,這也是很多人將二者混淆的原因之一。究竟是開發解析器還是編譯器?只需要依據功能上的實際需要來做出決定就ok了。
Linux 小知識翻譯 編譯器和直譯器
這次聊聊 編譯器和直譯器 程式語言中,有以c為代表的編譯型語言和以perl為代表的解釋型語言。不管是哪種,程式都是以人類能夠理解的形式記錄的,這種形式計算機是無法理解的。因此,才會有編譯器和直譯器。對於編譯型語言,是使用編譯器將人類可讀的 轉換為機器能夠理解的 機器語言 檔案,然後通過執行這個 機器...
詳解python編譯器和直譯器的區別
高階語言不能直接被機器所理解執行,所以都需要乙個翻譯的階段,解釋型語言用到的是直譯器,編譯型語言用到的是編譯器。某種意義上來說預處理事實上是乙個附加的功能,c,php,都可以新增這種功能,其中,預處理指令多為標頭檔案包含,巨集定義等等。因為巨集定義的核心說白了就是乙個字 換 所以預處理就是提供乙個程...
詳解python編譯器和直譯器的區別
高階程式設計客棧語言不能直接被機器所理解執行,所以都需要乙個翻譯的階段,解釋型語言用到的是直譯器,編譯型語言用到的是編譯器。某種程式設計客棧意義上來說預處理事實上是乙個附加的功能,c,php,都可以新增這種功能其中,預處理指令多為標頭檔案包含,巨集定義等等。因為巨集定義的核心說白了就是乙個字 換 所...