调用用C编写的C编译器或用PHP元循环编写的PHP解释器合法吗?这个定义是否只对特定类型的语言有效,比如Lisp?简而言之,一个解释器应该满足哪些条件才能被称为Metacircular?
发布于 2009-09-26 12:40:11
元循环解释器是用同一种语言的实现(可能更基本)编写的解释器。这通常是为了尝试向一种语言添加新功能,或者创建一种不同的方言。
这个过程与Lisp相关的原因是因为高度清晰的论文"The Art of the Interpreter",它展示了几个基于方案的元循环解释器。(这篇论文是SICP一书的核心,它的第四章通过创建例如懒惰评估的方案的其他章节来工作。)
在“类图标”语言(一种其代码可以在运行时作为数据操作的语言)中,这也要容易得多,比如Lisp、Prolog和Forth。
关于你直接的问题--C编译器根本就不是一个解释器。用自己的语言编写的编译器是“自托管”的,这是一个类似的属性,但更多的是与引导有关。PHP中的PHP解释器可能不算数,因为您可能会在进程中重新实现大量的语言。传统元循环解释器的主要优点是不需要这样做-您可以插入现有的解析器、垃圾收集(如果有的话)等,只需编写具有不同语义的顶级计算器。在Scheme或Prolog中,它通常不到一页代码。
发布于 2009-09-26 11:58:11
以下是维基百科对metacircular的定义
元循环计算器是自解释器的一个特例,在这种情况下,父解释器的现有工具直接应用于被解释的源代码,而不需要任何额外的实现。
所以在这两种情况下,答案都是否定的:
发布于 2009-09-26 13:20:56
为了补充上面的答案:http://www.c2.com/cgi/wiki?MetaCircularEvaluator
用Lisp编写的
Lisp通过调用"eval“实现"eval”。但是在许多其他语言中没有"eval“(如果有,它具有不同的语义),因此必须编写一个全新的语言系统,该系统给出"eval”的详细算法--这在元循环的情况下是不必要的。这就是MetaCircularEvaluators的魔力:它们反映了语言的一种潜在魔力,使它们成为可能。
https://stackoverflow.com/questions/1481053
复制相似问题