问题描述
我正在通过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的机器可能会包含“按类型分配”指令,该指令可以有效地执行此类数据定向的分配。
我不太确定我是否理解它们在这里的含义:
-
instruction
在这里是什么意思?我是否正确理解这将是op
类似的东西:
(assign type (op dispatch-on-type) (reg exp))
(goto type)
我不太确定为什么以这种方式编写dispatch-on-type
会使添加新的表达式类型变得更加容易
- 他们注意到lisp机器将有效地实施
dispatch-on-type
我不太确定我理解这一点。有什么方法可以使它比eval-dispatch
已经做的事情更有效率?我猜想dispatch-on-type
必须运行测试以确定它是什么类型
解决方法
好的,我注意到效率上的一个差异:
在此版本中,机器仍然检查branch
指令。
如果我们使用数据导向的方法,我们可以避免这些检查