自循环解释器最早出现于约翰·麦卡锡的Lisp 1.5版定义,其中麦卡锡以Lisp语言的功能来描述Lisp的解释规则。
简介自循环解释器(英语:Meta-circular evaluator)是元解释器(Metainterpreter,或Self-interpreter)的一种。自循环解释器不仅是在解释型语言中写成(如Scheme的自循环解释器是在Scheme中写成),而且通过底层语言的功能来实现解释型语言的功能。因此,自循环解释器不需担心如何具体实现任何功能,而只需处理语言读入与解释,所以尤其适合作为教育用途。自循环解释器一般在同像(即程序与数据为同一格式,如Lisp)的语言中出现。1
Eval/Apply循环著名计算机科学教科书《计算机程序的构造和解释》详细研究了一个Scheme语言的自循环解释器。此书中的解释器包含两个主要元素:
Eval,即将一个表示式转换为其取值的函数。
Apply,即将一个函数调用转换为其返回值的函数。
这两个元素互相调用,并最终将整个程序转换为其取值。1
实例例如以下简单的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
解释器解释器(英语:interpreter),是一种计算机程序,能够把高阶编程语言一行一行解释运行。解释器像是一位“中间人”,每次运行程序时都要先转成另一种语言再作运行,因此解释器的程序运行速度比较缓慢。它不会一次把整个程序翻译出来,而是每翻译一行程序叙述就立刻运行,然后再翻译下一行,再运行,如此不停地进行下去。
解释器的好处是它消除了编译整个程序的负担,程序可以拆分成多个部分来模块化,但这会让运行时的效率打了折扣。相对地,编译器已一次将所有源代码翻译成另一种语言,如机器码,运行时便无需再依赖编译器或额外的程序,故而其运行速度比较快。2
本词条内容贡献者为:
王沛 - 副教授、副研究员 - 中国科学院工程热物理研究所