2017-08-11 159 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