[英]What's the difference between compiled and interpreted language?
在閱讀了關於這個主題的一些材料后,我仍然不確定編譯語言和解釋語言之間的區別是什么。 有人告訴我這是 Java 和 JavaScript 之間的區別之一。 有人可以幫助我理解它嗎?
編譯型語言和解釋型語言有什么區別?
區別不在於語言; 它正在實施中。
把它從我的系統中取出來,這是一個答案:
在編譯實現中,原始程序被翻譯成本地機器指令,由硬件直接執行。
在解釋實現中,原始程序被翻譯成別的東西。 另一個稱為“解釋器”的程序然后檢查“其他事物”並執行所需的任何操作。 根據語言及其實現,有多種形式的“其他”。 從更受歡迎到不那么受歡迎,“別的東西”可能是
虛擬機的二進制指令,通常稱為bytecode ,就像在 Lua、Python、Ruby、Smalltalk 和許多其他系統中所做的那樣(該方法在 1970 年代由 UCSD P-system 和 UCSD Pascal 普及)
原始程序的樹狀表示,例如抽象語法樹,就像許多原型或教育解釋器所做的那樣
源程序的標記化表示,類似於 Tcl
源程序的字符,如在 MINT 和 TRAC 中所做的那樣
使問題復雜化的一件事是可以將(編譯)字節碼轉換為本地機器指令。 因此,一個成功的解釋實現可能最終會獲得一個編譯器。 如果編譯器在幕后動態運行,則它通常被稱為即時編譯器或 JIT 編譯器。 JIT 已經為 Java、JavaScript、Lua 以及我敢說許多其他語言開發。 那時你可以有一個混合實現,其中一些代碼被解釋,一些代碼被編譯。
Java 和 JavaScript 是證明這種差異的一個相當糟糕的例子
,因為它們都是解釋型語言
。 Java
(解釋型)
和 C(或 C++)
(編譯型)
可能是一個更好的例子。
為什么是刪除線文本? 正如這個答案正確指出的那樣,解釋/編譯是關於語言的具體實現,而不是關於語言本身。 雖然像“C 是一種編譯語言”這樣的陳述通常是正確的,但沒有什么可以阻止某人編寫 C 語言解釋器。 事實上, C 的解釋器確實存在。
基本上,編譯后的代碼可以直接由計算機的 CPU 執行。 也就是說,可執行代碼是用 CPU 的“原生”語言(匯編語言)指定的。
然而,解釋語言的代碼必須在運行時從任何格式轉換為 CPU 機器指令。 該翻譯由口譯員完成。
把它的另一種方式是,解釋型
語言的
代碼轉換為機器指令一步一步正在執行程序時,當編譯
語言有
代碼程序執行之前被翻譯。
這是編譯器與解釋器語言之間的基本區別。
編譯器語言
口譯語言:
通常,編譯器讀取高級語言計算機代碼並將其轉換為 p 代碼或本機機器代碼。 解釋器直接從 p 代碼或解釋過的代碼(如 Basic 或 Lisp)運行。 通常,編譯后的代碼運行得更快,更緊湊,並且已經發現了所有的語法錯誤和許多非法引用錯誤。 只有在應用程序嘗試解釋受影響的代碼后,解釋代碼才會發現此類錯誤。 解釋代碼通常適用於只使用一次或最多使用幾次的簡單應用程序,甚至可能用於原型設計。 編譯后的代碼更適合嚴肅的應用程序。 編譯器首先接收整個程序,檢查錯誤,編譯它然后執行它。 而解釋器會一行一行地執行此操作,因此它需要一行,檢查它是否有錯誤,然后執行它。
如果您需要更多信息,只需谷歌搜索“編譯器和解釋器之間的差異”。
解釋型語言在運行時按照shell腳本中的指令執行,編譯型語言是一種編譯(變成CPU可以理解的匯編語言)然后像c++一樣執行的語言。
這是一個非常模糊的區別,實際上通常不是語言本身的屬性,而是您用來執行該語言代碼的程序的屬性。
然而,大多數語言主要以一種或另一種形式使用,是的,Java 本質上總是被編譯,而 javascript 本質上總是被解釋。
編譯源代碼就是在其上運行一個程序,該程序生成一個二進制可執行文件,該文件在運行時具有源代碼定義的行為。 例如,javac 將人類可讀的 .java 文件編譯成機器可讀的 .class 文件。
解釋源代碼是在其上運行一個程序,該程序立即產生定義的行為,而不生成中間文件。 例如,當您的 Web 瀏覽器加載 stackoverflow.com 時,它會解釋一堆 javascript(您可以通過查看頁面源代碼來查看)並產生這些頁面具有的許多不錯的效果 - 例如,upvoting 或小通知程序橫在頂部的酒吧。
正如其他人所說,編譯和解釋特定於編程語言的實現; 它們不是語言固有的。 例如,有 C 解釋器。
但是,我們可以(並且在實踐中確實可以)根據其最常見(有時是規范的)實現對編程語言進行分類。 例如,我們說 C 是編譯的。
首先,我們必須明確定義解釋器和編譯器:
語言X的解釋器是一個程序(或機器,或者只是一般的某種機制),它執行用語言X編寫的任何程序p ,以便它執行X規范規定的效果並評估結果。
從X到Y 的編譯器是一個程序(或機器,或只是某種一般的機制),它將來自某種語言X 的任何程序p翻譯成某種語言Y中語義上等效的程序p' ,這樣解釋p '使用Y的解釋器將產生相同的結果並具有與使用X的解釋器解釋p相同的效果。
請注意,從程序員的角度來看,CPU 是其各自本地機器語言的機器解釋器。
現在,我們可以根據最常見的實現將編程語言分為 3 類:
有時,軟編譯語言和硬編譯語言被稱為簡單編譯,因此 C#、Java、C、C++ 被稱為編譯。
在這個分類中,JavaScript 曾經是一種解釋型語言,但那是多年前的事了。 如今,在大多數主要的 JavaScript 實現中,它被 JIT 編譯為本地機器語言,所以我會說它屬於軟編譯語言。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.