Functional programming 元循环评价器概念

Functional programming 元循环评价器概念,functional-programming,lisp,eval,metacircular,Functional Programming,Lisp,Eval,Metacircular,我试图理解元循环评估器的概念。据 在计算中,元循环计算器或元循环解释器是一种解释器,它使用解释器的宿主语言的类似功能定义被解释语言的每个特征。例如,解释lambda应用程序可以使用函数应用程序实现 在Lisp的上下文中,我认为这意味着解释器实现将程序状态存储在语法本身所表达的数据结构中,即列表 更一般地说,解释器实现使用语法范例来解释语法。此外,它与用解释语言实现的解释器无关(Lisp解释器通常用C编写)。只有范式等效性才重要 让我们考虑java,元循环JVM。Maxine JVM是用Java编

我试图理解元循环评估器的概念。据

在计算中,元循环计算器或元循环解释器是一种解释器,它使用解释器的宿主语言的类似功能定义被解释语言的每个特征。例如,解释lambda应用程序可以使用函数应用程序实现

在Lisp的上下文中,我认为这意味着解释器实现将程序状态存储在语法本身所表达的数据结构中,即列表

更一般地说,解释器实现使用语法范例来解释语法。此外,它与用解释语言实现的解释器无关(Lisp解释器通常用C编写)。只有范式等效性才重要

让我们考虑java,元循环JVM。Maxine JVM是用Java编写的。它是在JVM中运行的JVM。同样,解释器使用与被解释语言相同的范例。Java对象表示的可执行代码由Java对象表示的可执行代码管理。当然,实际的可执行文件是字节码,但它之外的抽象概念才是重要的。因此,我相信Maxine可能是用任何语言编写的,只要实现与OOP概念和Java规则相匹配,它仍然被视为元循环。最明显的是,这种语言就是Java本身。然而,我在最后一段描述了一个有趣的冲突,它真的让我头疼

这就是我在理论上理解元循环评估器的含义的方式。但我并不真正了解实际情况。根据维基百科

与现有的语言实现相结合,元循环口译员提供了一个基线系统,可以通过添加更多特征向上扩展语言,也可以通过编译特征而不是解释特征向下扩展语言

这到底意味着什么?例如,Maxine虚拟机是如何实现这一点的?这与函数(如
eval
)有何不同

如果我们更具哲理,元循环解释器有两个前提

  • 解释器实现语言不重要,范式等价重要
  • 在执行级别,范例的概念不再存在,一切都只是字节

元圆的确定边界是什么?这一特征究竟在哪里实现?我可能想得太多了,但我觉得这是一个有趣的话题。

您基于Java的分析失败了,因为

  • Java不是JVM

  • Java模仿Lisp。Lisp被编译为本机代码或类似于JVM的虚拟机

因此,假设一个Lisp元循环解释器正在解释一个函数调用。当然,该函数调用是使用列表语法表示的。解释器遍历列表,计算函数和参数(递归地使用自身),然后执行函数调用。它是如何做到的:在函数和参数列表上使用
apply
。这就是所谓的“元循环”的意思。解释器的程序员不必编写函数应用程序,只需从宿主语言借用它即可

然而,口译员不一定由列表组成;它可能是编译的Lisp代码。它不是直接生成
(apply…
表单并将其交给eval;它包含对
apply
的编译调用

元循环Lisp解释器隐式地以多种方式使用宿主语言。首先,它没有自己的阅读器;使用宿主Lisp的读取器,解释器正在处理现成的语法。它不需要重新实施符号实习。如果需要测试程序中的变量引用是否与定义匹配,它只使用主机的
eq
函数来比较符号

“元循环”的灵感可能来自这样一个想法:解释器可以忠实地处理宿主语言的每一种特殊形式,因此可以完全实现它。在这一点上,它已经进入了“完整的循环”:它可以解释自己的实现


元循环解释在教育中使用,因为它允许语言的评估模型用语言本身来表达。嗯,不是评估模式;只是一个评估模型,通常效率很低。例如,它可以提供一个词法环境模型,它是一个
assoc
列表。(而运行解释器的编译后的Lisp代码对其自身的词法变量没有使用这样的功能;它实际上是将变量放入堆栈帧或闭包向量中。)

我认为您没有抓住要点。如果我用Java编写了一个完整或接近完整的Java解释器,那么它就是合格的。至于
eval
,来自你链接的维基百科文章:“一个自解释器为所讨论的语言显示一个通用功能。”有趣的问题,但是-你能展示你的代码吗?告诉我们你到底有什么问题?就目前而言,你的问题不适合这样做。我想礼貌地不同意杰瑞德的观点。我个人的看法是,当语言的解析树与实际语言相同时,元循环计算器的魔力就会绽放。只有LISP族语言才能做到这一点。在LISP中,元循环解释器是用LISP本身编写的解释器。用C编写的Lisp解释器不是元循环的。Lisp解释器执行Lisp源代码,而不是字节码或类似代码。一般来说,它更多的是一个理论/教学概念,因为大多数实用的Lisp口译员都不是元循环的。尽管可以使用LISP编译器创建LISP解释器。