Metacircular Interpreter的确切定义是什么?

调用用C编写的C编译器或用PHP metacircular编写的PHP解释器是否合法? 此定义是否仅对特定类型的语言有效,如Lisp? 简而言之,口译员被称为Metacircular的条件是什么?

metacircular interpreter是一种用同一种语言(可能更基本的)实现编写的解释器。 这通常用于尝试向语言添加新function或创建不同的方言。

这个过程与Lisp相关的原因是因为高度清晰的论文“翻译的艺术” ,其中显示了几个基于Scheme的元语言解释器。 (该论文是SICP一书的核心,第四章通过其他人创作,例如一个懒惰评估的方案。)

使用“homoiconic”语言(一种可以在运行时作为数据操作的语言),例如Lisp,Prolog和Forth,这也更容易做到。

至于你的直接问题 – C编译器根本就不是解释器。 用自己的语言编写的编译器是“自托管”,这是一个类似的属性,但与引导更相关。 PHP中的PHP解释器可能不会计算,因为您可能会在此过程中重新实现一些非常重要的语言。 传统的metacircular解释器的主要好处是不需要这样做 – 你可以插入现有的解析器,垃圾收集(如果有的话)等,然后编写一个具有不同语义的顶级求值器。 在Scheme或Prolog中,它通常少于一页代码。

以下是维基百科页面中对metacircular的定义:

元循环求值器是自解释器的一种特殊情况,其中父解释器的现有设施直接应用于被解释的源代码,而无需额外的实现。

因此在两种情况下答案都是否定的:

  • AC编译器不是解释器(评估器)。 它将程序从一种forms转换为另一种forms而不执行它。
  • 用PHP编写的(假设的)PHP解释器将是一个自我解释器,但不一定是metacircular。

补充以上答案: http : //www.c2.com/cgi/wiki?MetaCircularEvaluator

据我所知, metacircular翻译是一个可以解释自己的翻译。

编译器只翻译代码,不执行它。

任何图灵完备语言在数学上都能够模拟任何逻辑计算,所以这里是使用Python的一个例子。 您可以使用PyPy ,而不是使用CPython将此代码转换为CPU指令并执行它。 后者是自举的 ,因此满足了某些人用来定义元认知解释器的任意标准。

""" Metacircular Python interpreter with macro feature. By Cees Timmerman, 14aug13. """ import re def meta_python_exec(code): # Optional meta feature. re_macros = re.compile("^#define (\S+) ([^\r\n]+)", re.MULTILINE) macros = re_macros.findall(code) code = re_macros.sub("", code) for m in macros: code = code.replace(m[0], m[1]) # Run the code. exec(code) if __name__ == "__main__": #code = open("metacircular_overflow.py", "r").read() # Causes a stack overflow in Python 3.2.3, but simply raises "RuntimeError: maximum recursion depth exceeded while calling a Python object" in Python 2.7.3. code = "#define 1 2\r\nprint(1 + 1)" meta_python_exec(code)