调用用 C 编写的 C 编译器或用 PHP 元循环编写的 PHP 解释器是否合法?这个定义是否只对特定类型的语言有效,比如 Lisp?简而言之,一个口译员要满足什么条件才能被称为Metacircular?

有帮助吗?

解决方案

一个metacircular解释是写在一个(可能更碱性)实施相同的语言的翻译。这通常是用添加新的功能,以一种语言,或创建不同方言进行试验。

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

这也大大更容易在一个“homoiconic”的语言,如Lisp中,Prolog中,和第四(其代码可以被操纵为在运行时数据的语言)做。

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

其他提示

这里是一个定义,从维基百科页 metacircular:

元圆评估程序的是一个特殊的 的情况下,自译员在哪 现有的设施的父母 解释是直接应用到 源代码的解释, 没有任何需要额外的 执行情况。

所以答案是没有在这两种情况:

  • C编译是不是一个翻译(评估员).它意味着一程序从一种形式到另一个没有执行它。
  • A(假定的)PHP interpreter PHP编写将是一个自我解释,但不一定metacircular.

据我了解, 元循环解释器是可以解释自身的解释器。

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

任何 图灵完备语言 在数学上能够模拟任何逻辑计算,所以这里有一个使用的示例 Python. 。除了使用 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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top