導(dǎo)讀:本文就從幾個方面著重介紹一下編譯器和解釋器的區(qū)別枯途,令我感到意外的竟然是編譯器比解釋器既更快又更慢个曙。
根據(jù)他們的定義察郁,編譯器和解釋器之間的區(qū)別貌似十分明顯:
- 解釋器:直接執(zhí)行用編程語言編寫的指令的程序
- 編譯器:把源代碼轉(zhuǎn)換成(翻譯)低級語言的程序
如果繼續(xù)深入了解伙菜,可能會發(fā)現(xiàn)兩者之間的界限有些模糊轩缤。
實際上,解釋器可以將源語言轉(zhuǎn)換成某種中間形式(或語言)來加速執(zhí)行贩绕,這就是這類語言通常依賴于虛擬機的原因火的,而這自然會導(dǎo)致一些問題:
- 所有使用虛擬機的語言都是解釋型語言嗎?
- 他們其實是編譯運行的嗎淑倾?
你可能會認為上面的答案都是 yes馏鹤。
到底什么才是編譯器或解釋器的所有部分?你可以在學(xué)術(shù)界找到這樣的問題的精確和技術(shù)性的答案娇哆,或者可以在 StackOverflow 上找到有關(guān)這些問題的討論湃累。
對于開發(fā)人員甚至是語言創(chuàng)作者來說,真正的重要性在于與他們的區(qū)別迂尝。 兩者都有優(yōu)點和缺點脱茉,實際上一些語言可以同時具有解釋器和編譯器,有的還不知一個垄开。
主要觀點仍然是:解釋器立即執(zhí)行代碼琴许,編譯器為稍后的執(zhí)行準備好源代碼。所有實際的差異都因為他們有不同的目標溉躲。
如何分發(fā)程序
實際上榜田,一個重要的區(qū)別是編譯器生成一個獨立的程序益兄,而解釋的程序總是需要解釋器來運行。
如果你有一個編譯的程序箭券,你不需要安裝其他任何東西就可以運行起來净捅,這使得分發(fā)十分簡單。 另一方面辩块,可執(zhí)行文件在一個特定平臺上運行:不同的操作系統(tǒng)和不同的處理器需要不同的編譯版本蛔六。
如果要解釋程序,可以將不同平臺上的相同副本分發(fā)給用戶废亭。 然而国章,他們需要一個在其特定平臺上運行的解釋器。所以可以分發(fā)源代碼或中間產(chǎn)物豆村。
跨平臺支持
這是一個技術(shù)上的區(qū)別液兽,其后果:使用解釋型編程語言更容易制作跨平臺程序。
那是因為在大多數(shù)情況下掌动,您只是為解釋器平臺創(chuàng)建一個程序四啰。 解釋器本身會將其轉(zhuǎn)化為真實平臺的適當形式(例如Windows / Linux 和 x86 / ARM)。 當然粗恢,必須注意的每個平臺還有一些差異柑晒。 一個很常見的例子是目錄分隔符。
編譯程序時适滓,需要注意每個平臺之間的所有小差異敦迄。 這部分原因是編譯語言往往是較低級的語言恋追,比如 C ++凭迹,所以它們可以讓你更少的訪問系統(tǒng)。 但另一個原因是正在使用的所有類庫都需要自身來支持不同的平臺苦囱, 所以如果他們不支持 Windows嗅绸,你的程序就不能支持 Windows。
速度
在需要考慮速度的情況下撕彤,有一個矛盾:編譯器比解釋器既更快又更慢鱼鸠。 許多人都知道編譯的程序比解釋的程序執(zhí)行起來要快得多,但這只是冰山一角羹铅。 簡單來講蚀狰,就執(zhí)行而言,確實是編譯后執(zhí)行的編譯型程序執(zhí)行的快些职员,但是編譯型程序的編譯加執(zhí)行的時間比解釋性語言解釋執(zhí)行的時間多麻蹋。
編譯器確實產(chǎn)生更快的程序,這是因為它必須把每個語句分析一次焊切,而解釋器必須每次都分析一次扮授,此外芳室,編譯器還可以優(yōu)化其生成的可執(zhí)行代碼。 這既是因為它確切地知道它將在哪里運行刹勃,并且需要時間來優(yōu)化代碼堪侯。
Debugg
在使用解釋器比使用編譯器時,調(diào)試更容易荔仁,有幾個原因:
- 解釋器只有一個可執(zhí)行文件伍宦,不需要用于開發(fā)的調(diào)試版本,也不需要最終用戶的發(fā)行版本乏梁;
- 使用解釋器的平臺特定錯誤較少雹拄;
- 由于解釋器即時轉(zhuǎn)換代碼,源代碼中的信息仍然可用掌呜;
- 由于解釋器一次執(zhí)行一個語句滓玖,因此更容易發(fā)現(xiàn)錯誤。
開發(fā)工具
雖然這在實踐中都是對的质蕉,但這似乎不太適用势篡。 事實上,如果你考慮你的經(jīng)驗模暗,你可能會發(fā)現(xiàn)調(diào)試 JavaScript 比調(diào)試 C ++ 更難禁悠。這是為什么? 部分是由于語言本身的設(shè)計兑宇,JavaScript 使用動態(tài)類型碍侦,而 C ++ 使用靜態(tài)類型,后者更容易早日發(fā)現(xiàn)錯誤隶糕。 但最終歸結(jié)為開發(fā)工具的原因瓷产,手工編譯 C ++ 是很困難的,所以大多數(shù)人使用 IDE 來開發(fā)枚驻,另一方面濒旦,您可以輕松地使用文本編輯器和命令行工具來開發(fā) JavaScript。
話雖如此再登,如果我們把它們放在同一個環(huán)境中尔邓,每個人都有一個很棒的 IDE 和支持工具,情況恢復(fù)正常锉矢。通過查看逐行和實時發(fā)生的情況梯嗽,更容易地測試和調(diào)試。
原文:The difference between a compiler and an interpreter - Federico Tomassetti - Software Architect
“本譯文僅供個人研習(xí)沽损、欣賞語言之用灯节,謝絕任何轉(zhuǎn)載及用于任何商業(yè)用途。本譯文所涉法律后果均由本人承擔(dān)。本人同意簡書平臺在接獲有關(guān)著作權(quán)人的通知后显晶,刪除文章贷岸。”
延伸閱讀:
歡迎關(guān)注: