自循环解释器

自循环解释器(英语: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来处理。

参见

注释

  1. ^ EVALQUOTE的定义,原文在 Lisp 1.5 Programmer's Manual页面存档备份,存于互联网档案馆
  2. ^ 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日) (英语).