什么是Metacircular解释的确切定义?(What is the exact definiti

2019-07-19 17:41发布

它是合法的调用用C或PHP编写的metacircular一个PHP解释器的C编译器? 这是定义仅适用于特定类型的语言有效,如Lisp? 总之,什么是一个解释应该满足被称为Metacircular的条件?

Answer 1:

一个metacircular解释是写在一个(可能是更基本的)执行相同语言的翻译。 这通常是与增加新功能,语言,或创建一个不同的方言进行试验。

这个过程和Lisp相关的原因是因为高清晰的纸的“翻译的艺术” ,这说明是基于方案的几个metacircular解释。 (本文为该书SICP内核,其第四章致力于通过别人创造如惰性计算方案。)

这也极大地更容易在“homoiconic”语言(语言其代码可以被操纵,因此在运行时的数据),如Lisp的,Prolog的,来回做。

至于你直接的问题 - C编译器不会在所有的解释。 写在自己的语言编译器是“自托管”,这是一个类似的属性,但更相关的引导。 在PHP PHP解释很可能不算数,因为你可能会被重新实现的过程中语言的非平凡量。 传统metacircular解释的主要好处是, 这样做是没有必要的 -你可以插入现有的解析器,垃圾收集(如有)等,只写有不同的语义顶级评价。 在计划或Prolog的,它往往比代码的页面更少。



Answer 2:

这里是从维基百科页面的定义metacircular :

甲自循环直译器是自解释,其中母体解释器的现有的设施被直接施加到源代码的一个特殊情况被解释,而无需任何附加的实现。

因此,答案是没有在这两种情况下:

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


Answer 3:

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



Answer 4:

据我了解, 一个metacircular解释是,可以解释本身的解释。

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

任何图灵完备的语言是数学上能够模拟任何逻辑运算,所以这里的用例的Python 。 而不是使用CPython的翻译这个代码的CPU指令并执行它,你也可以使用PyPy 。 后者自举 ,因此满足,有些人用它来定义一些任意的标准metacircular解释 。

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


文章来源: What is the exact definition of a Metacircular Interpreter?