SICP第5章:在显式控制评估器中,分派式如何提高效率?

问题描述

我正在通过SICP,正在进行第5章-实施显式控制评估程序。

他们首先为eval-dispatch编写机器语言

eval-dispatch
  (test (op self-evaluating?) (reg exp))
  (branch (label ev-self-eval))
  (test (op variable?) (reg exp))
  (branch (label ev-variable))
  (test (op quoted?) (reg exp))
  (branch (label ev-quoted))
  (test (op assignment?) (reg exp))
  (branch (label ev-assignment))
  (test (op definition?) (reg exp))
  (branch (label ev-definition))
  (test (op if?) (reg exp))
  (branch (label ev-if))
  (test (op lambda?) (reg exp))
  (branch (label ev-lambda))
  (test (op begin?) (reg exp))
  (branch (label ev-begin))
  (test (op application?) (reg exp))
  (branch (label ev-application))
  (goto (label unknown-expression-type))

但是,they note here也可以以数据定向的方式完成此操作:

在我们的控制器中,调度以测试和分支指令的顺序编写。另外,它可以以数据定向的方式编写(在真实系统中可能已经编写过),以避免需要执行顺序测试并简化新表达式类型的定义。设计为运行Lisp的机器可能会包含“按类型分配”指令,该指令可以有效地执行此类数据定向的分配。

我不太确定我是否理解它们在这里的含义:

  1. instruction在这里是什么意思?我是否正确理解这将是op

类似的东西:

(assign type (op dispatch-on-type) (reg exp))
(goto type)

我不太确定为什么以这种方式编写dispatch-on-type会使添加新的表达式类型变得更加容易

  1. 他们注意到lisp机器将有效地实施dispatch-on-type

我不太确定我理解这一点。有什么方法可以使它比eval-dispatch已经做的事情更有效率?我猜想dispatch-on-type必须运行测试以确定它是什么类型

解决方法

好的,我注意到效率上的一个差异:

在此版本中,机器仍然检查branch指令。 如果我们使用数据导向的方法,我们可以避免这些检查

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...