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



计算机只能理解机器语言。那么,为什么交互器直接执行程序而不将其翻译成机器语言呢?例如:

<?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 的最干净的方式,真正的解释器还需要跟踪范围和调用堆栈来实现函数调用和返回。

但最基本的是,它归结为:"如果我们看到这种陈述,请执行这种动作等"。

除了复杂得多之外,它与编写响应用户命令的程序没有任何区别,例如用户可以键入"矩形",然后绘制一个矩形。在这里,CPU也不理解"矩形"的含义,但是您的代码包含类似if user_input == rectangle: [code to draw a rectangle]的内容,这就是您所需要的。

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

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

最新更新