我试图从概念上的高层次理解WAM的目的,但到目前为止我所咨询的所有来源都假设我比现在知道的更多,并且他们从底部处理问题(细节)。他们首先向我扔树,现在我担心看到整个森林。
以下问题的答案将有助于我的努力:
选择任何一群有成就的,专业的Prolog实施者 - SISCtus人员,YAP人员,ECLiPSe人员 - 无论谁。现在,给他们的目标是在现有的虚拟机上实现专业的,高性能的,基于WAM的Prolog - 比如Erlang VM或Java VM。要消除诸如"这取决于你的其他目标是什么,"让我们说除了我刚刚给出的目标之外,他们所拥有的任何其他目标都是他们在开发之前的实现时所拥有的目标。
他们(通常)是否会在VM(Erlang / JVM)中实现虚拟机(WAM),这意味着您是否有一台虚拟机在另一台虚拟机之上运行或被另一台虚拟机模拟?
如果1的答案为否,这是否意味着他们会尝试以某种方式将WAM及其相关指令和执行直接映射到底层的Erlang / Java VM上,以便制作WAM&#39 ;消失'可以这么说,只有一个VM运行(Erlang / JVM)?如果是这样,这是否意味着任何WAM堆,堆栈,内存操作,寄存器分配,指令等实际上都是Erlang / Java(通过一些调整或按摩)?
如果对1的答案是肯定的,那是否意味着任何WAM堆,堆栈,内存操作等都只是普通的数组或链接列表,无论使用何种语言(Erlang或Java,甚至Clojure都在运行)开发人员正在使用的JVM(
我想要了解的是这个。 WAM仅仅是一些抽象或工具来帮助程序员组织代码,了解正在发生的事情,将Prolog映射到底层机器,可能提供可移植性等,或者它被视为(几乎)必要的,或者至少是非常有用的"在自身内结束"为了实现Prolog?
感谢。
答案 0 :(得分:2)
我很高兴看到那些比我更有知识的人能够回答这个有趣的问题,但在不太可能发生的事情中,我实际上比你知道的更多,让我概述一下我的理解。当真正的专家出现并纠正我和/或提供更真实的答案时,我们都会受益。
WAM为您提供了实施Prolog的方法的程序描述。指定的Prolog没有说明它必须如何实现,它只是讨论应该看到什么样的行为。所以WAM是一种实现方法。我不认为任何流行的系统纯粹遵循它,它们每个都有自己的版本。它比建筑模式和算法草图更像是Java虚拟机之类的规范。如果它更坚固,那么 Warren's Abstract Machine: A Tutorial Reconstruction 这本书可能不需要存在。我(非常稀疏)的理解是,主要技巧是使用两个堆栈:一个是自Algol以来每种编程语言的传统调用/返回堆栈,另一个是特殊的#34;跟踪"用于选择点和回溯。 (编辑:@false现已到达并声明WAM寄存器是我以前从未听说过的主要技巧,证明了我的无知。)无论如何,要实现Prolog,您需要一种正确的方法来处理搜索。在WAM之前,人们大多使用临时方法。我不会惊讶地发现有更新和/或更复杂的技巧,但它是一种广泛使用和理解的健全架构。
因此,我认为,你的三部分问题的答案都是。 VM中将有一个VM。当然,VM中的VM将以适当的语言实现,因此将使用该语言的原语来处理VM的不可见部分(堆栈和跟踪)。 Clojure可以提供对语言与自己的实现语言共享方式的深入了解。您可以根据需要自由混合。
你最后一个问题的答案,即你想要了解的是,WAM 仅仅是你描述的目的的抽象,而不是自己的目的。例如,没有"便携式WAM字节码"编译Java的方式变成了可移植的JVM字节码,这可能证明它没有其他好处。如果您有一种实现Prolog的新方法,请务必尝试并忘记WAM。