调用用C编写的C编译器或用PHP metacircular编写的PHP解释器是否合法?这个定义是否仅对特定类型的语言有效,比如Lisp?简而言之,口译员被称为Metacircular的条件是什么?
答案 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的维基百科页面中的定义:
元循环评估员是一个特殊的评估者 自我翻译的案例 父母的现有设施 口译员直接适用于 要解释的源代码, 无需额外的 实施
所以在这两种情况下答案都是否定的:
答案 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)