簡體   English   中英

編譯型語言和解釋型語言有什么區別?

[英]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 機器指令。 該翻譯由口譯員完成。

把它的另一種方式是,解釋型 語言的 代碼轉換為機器指令一步一步正在執行程序,當編譯 語言有 代碼程序執行之前被翻譯。

這是編譯器與解釋器語言之間的基本區別。

編譯器語言

  • 將整個程序作為單個輸入並將其轉換為存儲在文件中的目標代碼。
  • 生成中間對象代碼
  • 例如:C,C++
  • 編譯后的程序運行速度更快,因為編譯是在執行之前完成的。
  • 由於目標代碼的創建,內存需求更多。
  • 整個程序編譯后報錯
  • 源代碼---編譯器---機器代碼---輸出

口譯語言:

  • 將單個指令作為單個輸入並執行指令。
  • 不生成中間目標代碼
  • 例如:Perl、Python、Matlab
  • 解釋程序運行速度較慢,因為編譯和執行同時進行。
  • 內存需求較少。
  • 每條指令都會顯示錯誤。
  • 源代碼---解釋器---輸出

通常,編譯器讀取高級語言計算機代碼並將其轉換為 p 代碼或本機機器代碼。 解釋器直接從 p 代碼或解釋過的代碼(如 Basic 或 Lisp)運行。 通常,編譯后的代碼運行得更快,更緊湊,並且已經發現了所有的語法錯誤和許多非法引用錯誤。 只有在應用程序嘗試解釋受影響的代碼后,解釋代碼才會發現此類錯誤。 解釋代碼通常適用於只使用一次或最多使用幾次的簡單應用程序,甚至可能用於原型設計。 編譯后的代碼更適合嚴肅的應用程序。 編譯器首先接收整個程序,檢查錯誤,編譯它然后執行它。 而解釋器會一行一行地執行此操作,因此它需要一行,檢查它是否有錯誤,然后執行它。

如果您需要更多信息,只需谷歌搜索“編譯器和解釋器之間的差異”。

解釋型語言在運行時按照shell腳本中的指令執行,編譯型語言是一種編譯(變成CPU可以理解的匯編語言)然后像c++一樣執行的語言。

這是一個非常模糊的區別,實際上通常不是語言本身的屬性,而是您用來執行該語言代碼的程序的屬性。

然而,大多數語言主要以一種或另一種形式使用,是的,Java 本質上總是被編譯,而 javascript 本質上總是被解釋。

編譯源代碼就是在其上運行一個程序,該程序生成一個二進制可執行文件,該文件在運行時具有源代碼定義的行為。 例如,javac 將人類可讀的 .java 文件編譯成機器可讀的 .class 文件。

解釋源代碼是在其上運行一個程序,該程序立即產生定義的行為,而不生成中間文件。 例如,當您的 Web 瀏覽器加載 stackoverflow.com 時,它會解釋一堆 javascript(您可以通過查看頁面源代碼來查看)並產生這些頁面具有的許多不錯的效果 - 例如,upvoting 或小通知程序橫在頂部的酒吧。

正如其他人所說,編譯解釋特定於編程語言的實現 它們不是語言固有的。 例如,有 C 解釋器。

但是,我們可以(並且在實踐中確實可以)根據其最常見(有時是規范的)實現對編程語言進行分類。 例如,我們說 C 是編譯的。

首先,我們必須明確定義解釋器和編譯器:

語言X解釋器是一個程序(或機器,或者只是一般的某種機制),它執行用語言X編寫的任何程序p ,以便它執行X規范規定的效果並評估結果。

XY 的編譯器是一個程序(或機器,或只是某種一般的機制),它將來自某種語言X 的任何程序p翻譯成某種語言Y中語義上等效的程序p' ,這樣解釋p '使用Y的解釋器將產生相同的結果並具有與使用X的解釋器解釋p相同的效果。

請注意,從程序員的角度來看,CPU 是其各自本地機器語言的機器解釋器。

現在,我們可以根據最常見的實現將編程語言分為 3 類:

  • 硬編譯語言:當程序完全編譯為機器語言時。 唯一使用的解釋器是 CPU。 示例:通常,要在 C 中運行程序,將源代碼編譯為機器語言,然后由 CPU 執行。
  • 解釋型語言:當原始程序的任何部分都沒有編譯成機器語言時。 換句話說,不會產生新的機器碼; 只執行現有的機器代碼。 還必須使用 CPU 以外的解釋器(通常是程序)。示例:在 Python 的規范實現中,源代碼首先被編譯為Python 字節碼,然后該字節碼由 CPython 執行,CPython 是Python 字節碼的解釋器程序。
  • 軟編譯語言:當使用 CPU 以外的解釋器但也可以將原始程序的一部分編譯為機器語言時。 這是 Java 的情況,其中源代碼首先被編譯為字節碼,然后字節碼可以由 Java 解釋器解釋和/或由 JIT 編譯器進一步編譯。

有時,軟編譯語言和硬編譯語言被稱為簡單編譯,因此 C#、Java、C、C++ 被稱為編譯。

在這個分類中,JavaScript 曾經是一種解釋型語言,但那是多年前的事了。 如今,在大多數主要的 JavaScript 實現中,它被 JIT 編譯為本地機器語言,所以我會說它屬於軟編譯語言。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM