我正在寻找研究论文或任何其他出版物,比较不同的抽象机器(不止一个)执行Prolog与不基于抽象机器的prolog解释器.到目前为止我所看到的是,大多数实现似乎都是基于Warren Abstract Machine的prolog解释器,尽管提出了其他抽象机器(例如维也纳抽象机,面向树的抽象机)并且没有任何一般的比较.我对效率的比较感兴趣(不是特征),尽管所有比较的解释器都应该允许约束逻辑编程.
在我读到的关于 C++ 的第一本书中,它详细介绍了代码是如何在机器上实际执行的(它提到了程序计数器、调用堆栈、返回地址等)。我发现了解这些东西是如何工作的真的很有趣,尽管我知道没有必要了解计算机的工作原理来编写好的代码。
在这个问答网站上阅读相同的主题时,我发现它绝不是我以前学习的方式,因为我阅读的只是 C++ 的某个实现,这取决于某些计算机架构和特定的编译器。C++ 代码也可以在完全不同的东西上运行,只要有一个符合“正确”方式的编译器。标准和“抽象机器”的行为定义了正确的方法(我希望到目前为止我做对了)。
当然,我仍然想知道像内存的代码段或程序计数器这样的概念是否仍然在标准中“以某种方式”描绘,如果是,它们在多大程度上被描绘出来?抽象机中如何描述一个接一个执行的代码片段的概念?
由于有人在评论中询问我是否希望向我重复该标准:我无法很好地理解该标准,无法准确确定它对抽象机器的看法/或标准的哪些陈述可以被解释为关于“程序计数器”“代码存储”等抽象概念的陈述。所以是的,出于无能为力,我要求社区解释标准中的内容。这种解释的预期结果是仍然符合“抽象”标准的抽象机器内部结构的最详细概念。
我正在按照维基百科上的描述在C#中编写SECD机器的模拟器.我已完成基本操作,但我不确定如何实现该指令.rap
在维基百科,它说rap:
rap像ap一样工作,只是它用当前的一个替换了虚拟环境的出现,从而使递归函数成为可能
因为ap它说:
ap弹出一个闭包和堆栈中的参数值列表.闭包通过将其环境安装为当前参数来应用于参数,将参数列表推到前面,清除堆栈,并将C设置为闭包的函数指针.先前的S,E值和C的下一个值保存在转储中.
这是我的实施 ap
    public void ap() 
    { 
        Push(S, ref D); 
        Push(E, ref D); 
        Push(C, ref D); 
        List closure = Pop(ref S);
        List paramlist = Pop(ref S);
        E = closure.Tail;
        Push(paramlist, ref E);
        C = closure.Head;
        S = List.Nil;
    }
Run Code Online (Sandbox Code Playgroud)
请注意,这List是我对Lisp样式"cons"单元格的实现.
令我困惑的是,究竟有何rap不同ap?例如,环境寄存器(E)究竟发生了什么?我发现维基百科的定义有点含糊不清,并且找不到任何能够解释它的东西.
在 x86_64 架构上,一个指针是 8 个字节。对我来说sizeof(x)应该返回 8是有意义的。我知道 achar是单个字节,而 5 个字节是 array 的大小z。为什么sizeof(z)不返回8背后的直觉是什么?
int* x = new int[10];
char z[5];
// Returns 8
std::cout << "This is the size of x: " << sizeof(x) << std::endl;
// Returns 5
std::cout << "This is the size of z: " << sizeof(z) << std::endl;
Run Code Online (Sandbox Code Playgroud)