2017-08-11 163 views
0

讀取所有編譯的vs解釋的文章似乎是編譯意味着機器將直接運行編譯後的代碼而解釋,解釋器將運行代碼。但是,如果解釋器在機器上運行代碼,該如何運行?它不是最終不得不將它正在解釋的代碼轉換成機器代碼,還是讓機器運行它?在一天結束時,所有的事情都必須成爲機器碼才能使機器正確運行。它似乎只是解釋意味着它一次一行地運行語言,而編譯意味着一次性完成所有的語言。之後,它幾乎是一樣的權利?解釋器如何運行代碼?

回答

1

相關:How programs written in interpreted languages are executed if they are never translated into machine language?

不,它並不需要把它轉換成機器代碼。這些指令僅僅向解釋器本身提供指令,解釋器然後執行它自己。

考慮一個非常愚蠢的 「語言」,它由下列指令:

添加[數字]
減法[數字]
鴻溝[數字]
乘[數字]

我們可以實現像這樣的「解釋器」(用C#編寫):

public static void ExecuteStatements(List<string> instructions) 
    { 
     int result = 0; 
     foreach (string instruction in instructions) 
     { 
      string[] action = instruction.Split(' '); 

      int number = int.Parse(action[1]); 

      switch (action[0].Trim().ToLower()) 
      { 
       case "add": 
        result += number; 
        break; 
       case "subtract": 
        result -= number; 
        break; 
       case "divide": 
        result /= number; 
        break; 
       case "multiply": 
        result *= number; 
        break; 
      } 
     } 

     Console.WriteLine("Result: " + result); 
    } 

ExecuteStatements方法將被編譯爲機器碼。另外,我們有一個文本文件是這樣的:

加1個 減1 增加10 乘50 分5

其結果將是100的弦從未真正編譯成什麼 - 他們只是告訴口譯員要採取的行動。顯然,這種「語言」甚至不是圖靈完全的模糊,但問題是,我們不知何故將它「翻譯」成機器代碼 - 「解釋器」只是採取任何指定的操作。

我實際上曾經編寫過一次解釋器,作爲測試自動化框架的一部分。當有人對API進行調用時,我們會攔截該調用,並使用反射來確定調用的內容和參數,並將反射元數據序列化爲JSON。然後,我們對JSON進行反序列化,並使用反射來調用之前運行的任何方法,並使用相同的參數。引擎實際上並不需要機器代碼 - 它只是用反射來確定要做什麼。

下面是關鍵的見解:解釋的代碼本身完全沒有任何意義 - 全部它正在爲解釋器提供需要採取的操作。解釋者已經「知道」如何採取所有可以在解釋語言中執行的動作,所以不需要額外的機器碼。

作爲比喻,可以將您解釋爲代碼的代碼和解釋器作爲廚師來考慮。配方指定了諸如「添加1杯麪粉並混合」的操作。廚師知道如何遵循他在食譜中找到的任何方向,並且他自己執行它們。嚴格地說,食譜實際上並沒有做任何事 - 它只是坐在那裏供廚師閱讀,以便廚師可以知道要採取什麼行動。爲了完成食譜,沒有必要將配方實際上做成,它只需要知道如何遵循其方向的人。

TL; DR你並不需要「翻譯」成機器代碼 - 你只需要有足夠的信息,你的解釋就知道採取何種行動。一位優秀的翻譯人員已經「知道」如何採取語言可以實施的任何行動,因此不需要創建任何額外的機器代碼。

+0

謝謝@EJoshuaS!我想我認爲機器代碼是爲了使某些東西能夠正常工作而必須通過的東西,但是你認爲解釋器完全繞過了機器代碼,並且可以以某種方式與硬件本身進行通信以執行代碼? – stackjlei

+0

@stackjlei解釋器通常是機器碼。它對硬件沒有任何特殊的「鉤子」(解釋器只是一個普通的程序),只是程序「知道」如何採取解釋語言實現的任何動作。 – EJoshuaS

+1

@stackjlei想象你作爲食譜解釋的代碼和作爲廚師的解釋器。配方本身並沒有做任何事情,它只是在那裏給廚師指示,廚師「知道」如何遵循食譜可能提供的任何方向。 – EJoshuaS