自循环解释器
自循环解释器(英语:Meta-circular evaluator)是元解释器(Metainterpreter,或Self-interpreter)的一种。自循环解释器不仅是在解释型语言中写成(如Scheme的自循环解释器是在Scheme中写成),而且通过底层语言的功能来实现解释型语言的功能。因此,自循环解释器不需担心如何具体实现任何功能,而只需处理语言读入与解释,所以尤其适合作为教育用途。自循环解释器一般在同像(即程序与资料为同一格式,如Lisp)的语言中出现。
自循环解释器最早出现于约翰·麦卡锡的Lisp 1.5版定义,其中麦卡锡以Lisp语言的功能来描述Lisp的解释规则[1]。
Eval/Apply循环
著名电脑科学教科书《计算机程序的构造和解释》详细研究了一个Scheme语言的自循环解释器[2]。此书中的解释器包含两个主要元素:
- Eval,即将一个表示式转换为其取值的函数。
- Apply,即将一个函数调用转换为其返回值的函数。
这两个元素互相调用,并最终将整个程序转换为其取值。
实例
例如以下简单的Scheme表示式(假设square
是一个内建函数,其返回值为参数的平方):
(+ (square 2) (square 3))
其解释过程如下:
- 解释器首先将整个程序传入Eval,而Eval辨认出整个程序是一个函数调用(被调用的函数是“+”,或加法函数)。因此,Eval会调用Apply来处理这一调用。
- Apply收到被调用函数为“+”,参数分别为
(square 2)
与(square 3)
。因此,Apply分别调用Eval来处理这两个参数。 - Eval收到表示式为
(square 2)
,这是一个函数调用。因此Eval调用Apply。 - Apply收到被调用函数为“square”,参数为2(注意:这里的“2”仅仅是一个符号,而不是数字)。现在Apply会调用Eval,将符号“2”转换为数值2。Apply随后调用square函数,并返回4。同样地,Eval处理
(square 3)
并返回9。 - 现在解释器回到了Apply函数,处理“+”的调用。现在Apply函数有了参数的具体取值(分别为4和9),并调用“+”函数而返回13。
- Eval函数收到返回值13,这个值是整个表示式的取值。注意以上过程中自循环解释器并没有关心具体如何实现“+”函数与“square”函数,这些细节都由底层的Scheme来处理。
参见
注释
- ^ EVALQUOTE的定义,原文在 Lisp 1.5 Programmer's Manual (页面存档备份,存于互联网档案馆)
- ^ Harold Abelson and Gerald Jay Sussman with Julie Sussman. Structure and Interpretation of Computer Programs. Cambridge, MA: MIT Press. 1996 [2011]. ISBN 0-262-01153-0. (原始内容存档于2018年3月9日) (英语).