为什么将语法分析与执行分开?

PJ.*_*des 5 scheme sicp

在 SICP 第 4 章中,通过将语法分析与执行分离来修改元循环求值器,使过程eval如下所示:

(define (eval exp env)
    ((analyze exp) env))
Run Code Online (Sandbox Code Playgroud)

书上说这将节省工作,因为analyze将在表达式上调用一次,而执行过程可能会被调用多次。

我的问题是,这种优化是如何进行的?它适用于递归过程调用,但其他情况又如何呢?求值器逐个求值表达式,eval即使它们具有相同的形式,仍将在每个表达式上调用。

Eli*_*lay 5

您需要看到几件事:(a)函数对每个表达式精确地遍历一次,(b)扫描语法analyze之外没有代码,(c)返回的函数不会调用自身,因此运行该函数永远不会导致对于任何进一步的语法扫描,(d) 这与通常的评估函数不同,在通常的评估函数中,调用函数两次意味着其语法被扫描两次。analyzeanalyze

顺便说一句,一个更好的名字analyzecompile——它确实将输入语言(sexprs)翻译成目标语言(一个函数,在这里充当机器代码)。