【问题标题】:Alternatives to the WAMWAM 的替代品
【发布时间】:2010-12-18 15:17:09
【问题描述】:

我记得有一次读到至少有两个其他替代方案与 WAM 大致同时发明。有什么指点吗?

【问题讨论】:

    标签: prolog warren-abstract-machine


    【解决方案1】:

    在 WAM 之前,有 Clocksin 的 ZIP。它的设计还是很有趣的。 SWI-Prolog 使用它。 B-Prolog 也慢慢地从 WAM 设计迁移到 ZIP。当然,在这种方式下,许多新的创新被开发出来。另一种选择是 VAM。

    截至 1993 年的比较是:

    http://www.complang.tuwien.ac.at/ulrich/papers/PDF/binwam-nov93.pdf

    与此同时,最有趣的架构开发与 B-Prolog 相关。

    WAM 与 ZIP

    WAM 和 ZIP 之间的主要区别在于谓词参数的精确接口。在 WAM 中,参数都是通过寄存器传递的,也就是说,要么是真实的寄存器,要么至少是内存中的固定位置。 ZIP 通过堆栈传递所有参数。

    让我们考虑一个最小的例子:

    p(R1,R2,R3,L1,L2,L3) :-  % WAM                % ZIP
                             % store L1..L3       % nothing
                             % nothing            % push R1..R3
                             % init X1..X3        % push X1..X3
       q(R1,R2,R3,X1,X2,X3),
                             % put unsafe X1..X3  % push X1..X3
                             % load       L1..L3  % push L1..L3
       r(X1,X2,X3,L1,L2,L3).
    

    调用q之前:

    WAM 不需要对在相同位置传递给第一个目标的参数执行任何操作 (R1..R3)。这对于二元从句特别有趣——也就是说,最后只有一个常规目标的子句。 WAM 在这方面表现出色。

    其他参数L1..L3需要本地存储。所以对于这些论点,寄存器接口没有做任何好事。

    另一方面,ZIP 不需要保存参数 - 它们已经保存在堆栈中。这不仅适用于具有多个目标的子句,也适用于其他中断目标,例如约束或中断。

    不利的一面是,ZIP 必须再次推送R1..R3

    两者都必须初始化X1..X3并将它们存储在堆栈中。

    致电q:

    调用q 时,WAM 必须为X1..X3L1..L3 分配堆栈空间,因此需要6 个单元格,而ZIP 需要R1..R3,L1..L3,X1..X3。所以在这里,WAM 更节省空间。此外,WAM 允许环境修整(对于更复杂的情况),这对于 ZIP 来说几乎是不可能的。

    调用r之前:

    r 是最后一次调用,系统会尝试为该子句释放空间,前提是不存在选择点。

    对于 WAM,存在变量 X1..X3 have to be checked 仍然是未实例化的局部变量 (put_unsafe),如果将它们移到堆上 - 这很昂贵,但很少发生。 L1..L3 刚刚加载。就是这样,WAM 现在可以安全地释放本地帧。所以最后一次调用优化非常便宜。

    对于 ZIP,一切都必须照常推送。只有这样,额外的扫描才能检查堆栈上的所有值并相应地移动它们。那是相当昂贵的。一些优化是可能的,但它仍然比 WAM 所做的要多得多。 ((一个可能的改进是以相反的顺序推送参数。然后变量L1..L3 可能会留在它们的位置。所以这些变量不需要任何处理。我还没有看到这样的实现。))

    【讨论】:

      【解决方案2】:

      在标题为 An abstract Prolog instruction set 的技术说明中,Warren 还引用了 Bowen、Byrd 和 Clocksin 的另一个编译器。但是,他说这两种架构有很多共同点,所以我不知道那个编译器是否真的可以被视为替代方案。

      【讨论】:

        【解决方案3】:

        不确定这是否是您的意思,但前两个 Prolog 实现是 Colmerauer 等人用 Fortran 编写的解释器。以及 Warren 等人的 DEC PDP-10 原生编译器。

        Warren 在 Ait-Kaci 的 WAM 的 Tutorial Reconstruction 的前言中提到了这些。如果这不是您的意思,您可以在该文档或其参考资料中找到它。

        【讨论】:

        • 第一个 Prolog 实现是用 Algol-W 编写的。第二个是由 Meloni Battani 用 Fortran 编写的。
        • @false,沃伦显然不同意你的观点。 Algol 版本优先的来源是什么?
        • 感谢您的准确参考,让我引用它。在第 ix 页上写道:“Prolog 的第一个实现是由 Colmerauer 小组的成员用 Fortran 编写的解释器。”
        • .. 然而,Colmerauer 和 Roussel 的 Prolog 的诞生提到了 Algol-W 版本。见,例如citeseerx.ist.psu.edu/viewdoc/…
        • .. 和几年前沃伦在他的1977 thesis, p.74 sect 中所写的完全相同。 1.2:Prolog 的第一个实现是 Philippe Roussel [1972] 用 Algol-W 编写的解释器。这项工作带来了更好的语言实现技术,这些技术在第二个解释器中实现,由 Battani 和 Meloni [1973] 用 Fortran 编写。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-08
        • 2012-01-25
        • 2015-08-05
        • 2011-01-01
        • 2011-10-24
        • 2011-05-31
        相关资源
        最近更新 更多