Metacircular Interpreter的确切定义是什么?

时间:2009-09-26 11:46:27

标签: c lisp scheme interpreter self-interpreter

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

4 个答案:

答案 0 :(得分:25)

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

这个过程与Lisp相关的原因是由于高清晰度的论文"The Art of the Interpreter",它显示了几个基于Scheme的元外解释器。 (该论文是SICP一书的核心内容,其第四章通过其他论文开展工作,例如一个懒惰评估的方案。)

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

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

答案 1 :(得分:6)

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

  

元循环评估员是一个特殊的评估者   自我翻译的案例   父母的现有设施   口译员直接​​适用于   要解释的源代码,   无需额外的   实施

所以在这两种情况下答案都是否定的:

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

答案 2 :(得分:3)

答案 3 :(得分:-1)

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

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

任何Turing-complete language在数学上都能够模拟任何逻辑计算,因此这里是使用Python的示例。您可以使用PyPy,而不是使用CPython将此代码转换为CPU指令并执行它。后者是bootstrapped,因此符合某些人用来定义metacircular interpreter的任意标准。

"""
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)