- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试理解元循环求值器的概念。根据Wikipedia
In computing, a meta-circular evaluator or meta-circular interpreter is an interpreter which defines each feature of the interpreted language using a similar facility of the interpreter's host language. For example, interpreting a lambda application may be implemented using function application.
在 Lisp 的上下文中,我认为这意味着解释器实现将程序状态存储在语法本身所表达的那些熟悉的数据结构中,即列表。
更一般地说,我会说解释器实现使用语法的范式 来解释语法。此外,它与用解释语言实现的解释器无关(Lisp 解释器通常用 C 编写)。只有范式等价性很重要。
让我们考虑 Java Maxine Virtual Machine ,元循环 JVM。 Maxine JVM 是用 Java 编写的。它是在 JVM 内部运行的 JVM。同样,解释器使用与解释语言相同的范例。 Java 对象表示的可执行代码由Java 对象表示的可执行代码管理。当然,实际的可执行文件是字节码,但重要的是超越它的抽象概念。因此,我相信 Maxine 可能是用任何语言编写的,并且仍然被认为是元循环的,只要实现符合 OOP 概念和 Java 规则。最明显的这种语言是 Java 本身。然而,这是我在最后一段中描述的一个有趣的冲突,它真的让我头疼!
这就是我在理论上理解元循环评估器的含义的方式。但我并没有真正了解实际方面。根据维基百科
In combination with an existing language implementation, meta-circular interpreters provide a baseline system from which to extend a language, either upwards by adding more features or downwards by compiling away features rather than interpreting them
这究竟意味着什么?例如,这是如何通过 Maxine Virtual Machine 实现或可能付诸实践的?这与 eval
等函数有何不同?
如果我们更哲学一点,元循环解释器有两个前提
元循环的明确界限是什么?这个特性究竟在哪里实现呢?我可能想得太多了,但我发现这是一个有趣的主题。
最佳答案
您基于 Java 的分析已关闭,因为
Java 不是 JVM。
Java 模仿了 Lisp。 Lisp 被编译为 native 代码或类似于 JVM 的虚拟机。
因此,假设一个 Lisp 元循环解释器正在解释一个函数调用。当然,该函数调用是使用列表语法表示的。解释器遍历列表,评估函数和参数(递归地使用自身),然后执行函数调用。它是如何做到的:通过在函数和参数列表上使用 apply
。这就是所谓的“元循环”的意思。解释器的程序员不必编写函数应用程序,而只是从宿主语言中借用它。
但是,解释器不一定由列表组成;它可能是编译好的 Lisp 代码。它并不是字面上生成一个 (apply ...)
表单并将其交给 eval;它包含对 apply
的编译调用。
元循环 Lisp 解释器以多种方式隐含地使用宿主语言。首先,它没有自己的读者;使用宿主 Lisp 的阅读器,解释器正在处理现成的语法。它不必重新实现符号实习。如果它需要测试程序中的变量引用是否匹配定义,它只是使用宿主的eq
函数来比较符号。
“Meta-circular”的灵感可能是解释器可以忠实地处理宿主语言的每一种特殊形式,因此可以完全实现它。到那时它已经“绕了一圈”:它可以解释自己的实现。
元循环解释被用于教育,因为它允许用语言本身来表达对语言的评估模型。好吧,不是评估模式;只是一个评估模型,而且通常是一个非常低效的模型。例如,它可能提供一个词法环境模型,它是一个 assoc
列表。 (而运行解释器的已编译 Lisp 代码并没有为它自己的词法变量使用这样的东西;它实际上是将变量放入堆栈框架或闭包向量中。)
关于functional-programming - 元循环评估器概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49862587/
我认为这个问题说明了一切,但我有一个使用 .net 安装工具包的应用程序(在 vs.2005 中),并且用户问我是否可以将它安装在 c:\Program Files\ProgramName 而不是C:
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我是 Stephen Wolfram 的忠实粉丝,但他绝对是一个不怕自吹自擂的人。在许多引用资料中,他将 Mathematica 颂扬为一种不同的符号编程范式。我不是 Mathematica 用户。
我现在正在使用 Squeak4.1 学习 SmallTalk。我使用 Squeak by Example 作为教程,在这里我反驳了一个 delema,“Morphic 是由...开发的,用于自编程语言
Wikipedia有话要说: Total functional programming (also known as strong functional programming, to be cont
在阅读 Paul Graham's Essays 时, 我对 Lisp 越来越好奇了。 在this article ,他提到最强大的功能之一是您可以编写可以编写其他程序的程序。 我无法在他的网站或其他
我知道 functional programming 有几个定义。 .我认为这是一个模糊的类别。我个人的定义是接近' referential transparency '。 这个问题不是“函数式编程的
我注意到许多顶尖大学都开设了类(class),在这些类(class)中,学生将学习与计算机图形学相关的 CS 专业科目。可悲的是,这是我的大学没有提供的东西,我真的很想在 future 几年的某个时候
我正在安装100%托管代码的.NET(C#)应用程序。安装程序(InnoSetup)始终希望将应用程序安装到Vista x64中的“Program Files(x86)”文件夹中,我认为这是因为安装程
假设在 C 中,我们有以下结构: struct MyData { char key1[20]; long key2; ... /* some data */ }; 本质上,除
这个问题已经有答案了: When should I use ampersand with scanf() (3 个回答) 已关闭 6 年前。 所以我在python3中有这个“程序”,它添加了3个字符串
我编写了一个包含 self 更新程序的 Java 应用程序。自更新程序从 Web 服务器加载新的程序版本并替换应用程序文件。如果安装了应用程序,这将完美地工作,例如在用户主目录中,如果它安装在 C:\
注意:标记为社区维基。 是否有一个很好的分析为什么可视化编程语言仍然没有起飞?这些天我们仍在 80x25 文本窗口中“线性”编码;而我们表示的概念(数据结构、算法)似乎可以更直观地表示出来。 最佳答案
我一直在阅读Code Complete 2 .由于我不是以英语为母语的人,因此我需要一些时间才能理解某些陈述。我希望你描述作者在他的书中所做的这两个陈述之间的区别: You should progra
我在为我的 tomcat 设置 CLASSPATH 时遇到了这个问题。我需要在 tomcat 的 CLASSPATH 中引用我的 2 个安装。其中一个位于 C:\Program Files\Postg
这个问题已经有答案了: How can I lock a file using java (if possible) (8 个回答) 已关闭 6 年前。 我有 2-3 个程序可以修改文件,但如果有一个
我 checkout Reading stdout from one program in another program却没有找到我要找的答案 我是 Linux 的新手,我正在使用 Python 中
我有一个程序可以打印出通过或失败。我想检测卡在那里的程序并回显“超时” 我写了这样一个脚本: #!/bin/bash echo -n 'test' && timeout 5 ./mytest | gr
我非常清楚函数式编程技术和命令式编程技术之间的区别。但是现在有一种普遍的趋势是谈论“函数式语言”,这确实让我感到困惑。 当然,像 Haskell 这样的一些语言比 C 等其他语言更欢迎函数式编程。但即
请求:每个进程需要计算自己的组到所有点的距离。我的代码如下: #include stdio.h #include stdlib.h #include math.h #include string.h
我是一名优秀的程序员,十分优秀!