當前位置:
首頁 > 最新 > 編譯和解釋的區別在哪?

編譯和解釋的區別在哪?

文丨get-k

編譯和解釋的區別在哪?編譯器是把源程序的每一條語句都編譯成機器語言,並保存成二進位文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快;

而解釋器則是只在執行程序時,才一條一條的解釋成機器語言給計算機來執行,所以運行速度是不如編譯後的程序運行的快的。

這是因為計算機不能直接認識並執行我們寫的語句,它只能認識機器語言(是二進位的形式)。

一、低級語言與高級語言

最初的計算機程序都是用0和1的序列表示的,程序員直接使用的是機器指令,無需翻譯,從紙帶打孔輸入即可執行得到結果。後來為了方便記憶,就將用0、1序列表示的機器指令都用符號助記,這些與機器指令一一對應的助記符就成了彙編指令,從而誕生了彙編語言。無論是機器指令還是彙編指令都是面向機器的,統稱為低級語言。因為是針對特定機器的機器指令的助記符,所以彙編語言是無法獨立於機器(特定的CPU體系結構)的。但彙編語言也是要經過翻譯成機器指令才能執行的,所以也有將運行在一種機器上的彙編語言翻譯成運行在另一種機器上的機器指令的方法,那就是交叉彙編技術。

高級語言是從人類的邏輯思維角度出發的計算機語言,抽象程度大大提高,需要經過編譯成特定機器上的目標代碼才能執行,一條高級語言的語句往往需要若干條機器指令來完成。高級語言獨立於機器的特性是靠編譯器為不同機器生成不同的目標代碼(或機器指令)來實現的。那具體的說,要將高級語言編譯到什麼程度呢,這又跟編譯的技術有關了,既可以編譯成直接可執行的目標代碼,也可以編譯成一種中間表示,然後拿到不同的機器和系統上去執行,這種情況通常又需要支撐環境,比如解釋器或虛擬機的支持,Java程序編譯成bytecode,再由不同平台上的虛擬機執行就是很好的例子。所以,說高級語言不依賴於機器,是指在不同的機器或平台上高級語言的程序本身不變,而通過編譯器編譯得到的目標代碼去適應不同的機器。從這個意義上來說,通過交叉彙編,一些彙編程序也可以獲得不同機器之間的可移植性,但這種途徑獲得的移植性遠遠不如高級語言來的方便和實用性大。

二、編譯與解釋

編譯是將源程序翻譯成可執行的目標代碼,翻譯與執行是分開的;而解釋是對源程序的翻譯與執行一次性完成,不生成可存儲的目標代碼。這只是表象,二者背後的最大區別是:對解釋執行而言,程序運行時的控制權在解釋器而不在用戶程序;對編譯執行而言,運行時的控制權在用戶程序。

解釋具有良好的動態特性和可移植性,比如在解釋執行時可以動態改變變數的類型、對程序進行修改以及在程序中插入良好的調試診斷信息等,而將解釋器移植到不同的系統上,則程序不用改動就可以在移植了解釋器的系統上運行。同時解釋器也有很大的缺點,比如執行效率低,佔用空間大,因為不僅要給用戶程序分配空間,解釋器本身也佔用了寶貴的系統資源。

編譯器是把源程序的每一條語句都編譯成機器語言,並保存成二進位文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快;

而解釋器則是只在執行程序時,才一條一條的解釋成機器語言給計算機來執行,所以運行速度是不如編譯後的程序運行的快的。

編輯:用編輯軟體(EDIT.EXE或記事本)形成源程序(.ASM),如:LX.ASM;

彙編:用彙編程序(MASM.EXE)對源程序進行彙編,形成目標文件(.OBJ),格式如下:MASM LX.ASM;

連接:用連接程序(LINK.EXE)對目標程序進行連接,形成可執行文件(.EXE),格式如下:LINK LX.OBJ;

執行:如果結果在屏幕在顯示,則直接執行可執行文件。

調試:用調試程序(DEBUG.EXE)對可執行文件進行調試,格式如下:DEBUG LX.EXE

在具體計算機上實現一種語言,首先要確定的是表示該語言語義解釋的虛擬計算機,一個關鍵的問題是程序執行時的基本表示是實際計算機上的機器語言還是虛擬機的機器語言。這個問題決定了語言的實現。根據這個問題的回答,可以將程序設計語言劃分為兩大類:編譯型語言和解釋型語言。

由編譯型語言編寫的源程序需要經過編譯、彙編和鏈接才能輸出目標代碼,然後機器執行目標代碼,得出運行結果,目標代碼由機器指令組成,一般不能獨立運行,因為源程序中可能使用了某些彙編程序不能解釋引用的庫函數,而庫函數代碼又不在源程序中,此時還需要鏈接程序完成外部引用和目標模塊調用的鏈接任務,最後輸出可執行代碼。C、C++、Fortran、Pascal、Ada都是編譯實現的。

解釋型語言的實現中,翻譯器並不產生目標機器代碼,而是產生易於執行的中間代碼,這種中間代碼與機器代碼是不同的,中間代碼的解釋是由軟體支持的,不能直接使用硬體,軟體解釋器通常會導致執行效率較低。用解釋型語言編寫的程序是由另一個可以理解中間代碼的解釋程序執行的。與編譯程序不同的是,解釋程序的任務是逐一將源程序的語句解釋成可執行的機器指令,不需要將源程序翻譯成目標代碼後再執行。對於解釋型Basic語言,需要一個專門的解釋器解釋執行 Basic程序,每條語言只有在執行才被翻譯。這種解釋型語言每執行一次就翻譯一次,因而效率低下。

Java很特殊,Java程序也需要編譯,但是沒有直接編譯稱為機器語言,而是編譯稱為位元組碼,然後在Java虛擬機上用解釋方式執行位元組碼。Python 的也採用了類似Java的編譯模式,先將Python程序編譯成Python位元組碼,然後由一個專門的Python位元組碼解釋器負責解釋執行位元組碼。

(Java虛擬機對位元組碼的執行相當於模擬一個cpu,而ruby1.8–在虛擬機還未出現前–是通過解釋成語法樹執行。)


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

MySQL 5.7優化不求人,大咖葉金榮帶你飛
現代開發人員必備的十款工具,來看看你漏了啥?
一家公司幹了5年多的開發,穩定還是突破
Stack Overflow幫助百萬開發者退出Vim編輯器
未來編程的十一個預測,看得好心慌

TAG:CSDN |

您可能感興趣

解讀 | 華為方舟編譯器的革命性到底體現在哪裡?
方舟編譯器背後的黑科技,你造嗎?你想知道的都在這裡了!
華為方舟編譯器的革命性到底體現在哪裡?
淺談彙編器、編譯器和解釋器
華為方舟編譯器解讀:這就是P30流暢至極的秘密武器?
火幣編譯:區塊鏈如何解決社交媒體的最大問題
「華為方舟編譯器」到底是幹什麼用的?
華為方舟編譯器遠沒有你想像的那麼簡單
華為方舟編譯器修改 zlib 的版權聲明,你怎麼看?
編譯基因能「編」出天生的好皮膚嗎?
已有方舟編譯器,超感光暗拍的華為,為什麼有人還選三星和蘋果?
一夜刷屏的「猜畫小歌」遭到反編譯,內部還暗藏哪些玄機?
給安卓動手術的華為,在方舟編譯器上押注了什麼?
「C++」預編譯、編譯、彙編、鏈接
vivo編譯器現身,同華為方舟編譯器想比較,哪款更出色?
深入解析JIT編譯
編譯器優化代碼都幹了些什麼不為人知的事情?
手機性能再突破!程序員熱議的華為方舟編譯器是啥?一圖看懂
華為要做自研系統?方舟編譯器或許就是基石
利瑪竇為西學東漸編譯了哪些著作?