如果用解释语言编写的程序从未被翻译成机器语言,它们将如何执行?

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

计算机只能理解机器语言。那么解释器是如何直接执行程序而不将其翻译成机器语言的呢?例如:

<?php
    echo "Hello, World!" ;

这是一个用 PHP 编写的简单的 Hello World 程序。当机器不知道 echo 是什么时,它如何在机器中执行?它如何输出预期的内容,在本例中为字符串 Hello, World!?

许多解释器,包括官方的 PHP 解释器,出于性能(我想是灵活性)的原因,实际上在执行代码之前将代码转换为字节码格式,但最简单的解释器只是通过代码并为每个语句执行相应的操作。 PHP 类语言的极其简单的解释器可能如下所示:

def execute_program(prog)
  for statement in prog.toplevel_statements:
    execute_statement(statement)

def execute_statement(statement):
  if statement is an echo statement:
    print( evaluate_expression(statement.argument) )
  else if statement is a for loop:
    execute_statement(statement.init)
    while evaluate_expression(statement.condition).is_truthy():
      for inner_statement in statement.body:
        execute_statement(inner_statement)
      execute_statement(statement.increment)
  else if ...

请注意,一个大的 if-else-if 语句实际上并不是通过 AST 的最干净的方式,真正的解释器还需要跟踪范围和调用堆栈以实现函数调用和 returns.

但最基本的归结为:"If we see this kind of statement, perform this kind of action etc."。

除了更复杂之外,它与编写响应用户命令的程序并没有什么不同,用户可以在其中输入 "rectangle" 然后绘制一个矩形。这里 CPU 也不理解 "rectangle" 的意思,但是您的代码包含类似 if user_input == rectangle: [code to draw a rectangle] 的内容,这就是您所需要的。

严格来说,解释器正在执行,解释器正在解释的代码只是决定了解释器采取什么动作。 (如果它 只是编译成机器代码,你需要解释器做什么?)。

例如,我不久前构建了一个自动化框架,我们在其中捕获了 QA 测试期间在运行时发生的事情的反射元数据。我们将该元数据序列化为 JSON。 JSON 从未被编译成任何东西——它只是告诉自动化引擎要调用什么方法以及要传递什么参数。不涉及机器代码。说我们是 "executing" JSON 并不完全正确 - 我们正在执行自动化引擎,然后在 JSON 中找到的 "directions" 之后,但肯定是 解释 JSON.