问题标签 [abstract-machine]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
functional-programming - 在 SECD 机器中,“说唱”是如何工作的?
我正在根据 Wikipedia 上的描述用 C#编写SECD 机器的模拟器。我已经完成了基本操作,但我不确定如何执行指令。rap
在维基百科它说rap
:
rap 和 ap 一样工作,只是它用当前环境替换了一个虚拟环境的出现,从而使递归函数成为可能
它说ap
:
ap 从堆栈中弹出一个闭包和参数值列表。闭包通过将其环境安装为当前环境,将参数列表推到其前面,清除堆栈并将 C 设置为闭包的函数指针来应用于参数。S、E 的前一个值和 C 的下一个值保存在转储中。
这是我的实现ap
请注意,这List
是我对 Lisp 样式“cons”单元格的实现。
让我感到困惑的是究竟有什么rap
不同ap
?例如,环境寄存器 (E) 究竟发生了什么?我发现 Wikipedia 的定义有点模棱两可,并且找不到任何其他可以很好地解释它的东西。
delphi - Delphi 有免费的 Warren Abstract Machine 实现吗?
我已经进行了彻底的搜索,但仍然是徒劳的。
参考:
沃伦抽象机(维基百科)。
问题:
有没有这样的实现(开源)?
如果不是,我倾向于接受一个解决方案的答案,该解决方案包含一个用其他语言编写的好解决方案(要链接的 Dll 和/或 obj 文件,我知道Prolog.NET:请不要建议它)。
jvm - Java字节码的抽象机
我想知道是否有人熟悉能够执行 Java 字节码的抽象机器。请注意,我正在寻找可以扩展的东西,而抽象机器并不是指 JVM,因为我需要指定语义。
具体来说,我正在寻找一种方法来跟踪给定时间点堆栈上的内容,而不必自己模拟所有指令。有谁知道一个好的框架?
java - 将表达式解析为其组件和子组件
我需要解析一个表达式,例如:neg(and(X,Y))
我需要它与抽象堆栈机器代码一起出现,例如上面的示例:
但是现在机器代码不是问题,我如何将表达式的输入字符串解析/分解成它的所有子表达式?
我试图找到第一个括号,然后从那个括号连接到最后一个括号,但是如果你有一个内部表达式,那会给出问题吗?
我尝试过的代码:(请不要它仍然处于开发阶段)
我只是在寻找一个基本的解决方案,它只需要:and,or,neg
prolog - 用于执行 Prolog 的抽象机器的比较
我正在寻找研究论文或任何其他出版物,它们比较不同的抽象机器(不止一个)来执行 Prolog 与不基于抽象机器的 prolog 解释器。到目前为止,我所看到的是,尽管提出了其他抽象机器(例如Vienna Abstract Machine、Tree-Oriented Abstract Machine ),但大多数实现似乎都将它们的 prolog 解释器基于Warren Abstract Machine并且没有任何一般性比较。我对效率(而不是功能)的比较感兴趣,尽管所有比较的解释器都应该允许约束逻辑编程。
java - 从简单的编程指令生成抽象机器代码
我的问题是我需要学习什么才能完成该任务......任务是从简单的编程指令创建自动代码生成器,例如
并将其翻译成抽象机器指令..
所以我的问题是......从哪里开始?,我需要一些解析器,并且解析器必须使用一些 XML ..但我真的不知道如何定义 XML ..
请帮助从哪里开始..谢谢..
我将在 JAVA swing UI 中对其进行编码
turing-machines - 图灵机与计算机相比如何?
我已经阅读了包括关于图灵机的维基百科在内的文章。这里还有关于图灵机的问题。读完之后,我对 TM 的理解是它只是一个具有无限磁带、R/W 磁头和一个带有规则的表的逻辑机器。如果这是真的,没有那个表,图灵机就什么都不是。即使是一台简单的计算机也可以完成从简单的文字处理到玩游戏的所有工作,但图灵机与计算机相比又如何。
c++ - Result of sizeof for C++ arrays and pointers
On an x86_64 architecture, a pointer is 8 bytes. It makes sense to me that sizeof(x)
should return 8. I understand that a char
is a single byte, and 5 bytes is the size of array z
. What is the intuition behind why sizeof(z)
does not return 8?
multithreading - C11/C++11 内存模型获取、释放、放宽细节
我对 C++11/C11 内存模型有一些疑问,我想知道是否有人可以澄清。这些是关于模型/抽象机器的问题,而不是关于任何真实架构的问题。
- 获取/释放效果是否保证从一个线程“级联”到下一个线程?
这是我的意思的伪代码示例(假设所有变量都以 0 开头)
线程 3 的获取与线程 2 的发布同步,线程 2 的获取与线程 1 的发布同步。因此,线程 3 可以保证看到线程 1 设置为 x 的值,对吗?还是我们需要在这里使用 seq cst 以保证断言不会触发?我觉得获取/释放就足够了,但我找不到任何简单的解释来保证它。获取/释放的大部分解释主要集中在获取线程接收释放线程所做的所有存储。然而在上面的例子中,线程 2 从未接触过变量 x,而线程 1/线程 3 也不会接触到同一个原子变量。很明显,如果线程 2 要加载 x,它会看到 1,但是该状态是否保证会级联到其他线程,这些线程随后与线程 2 进行获取/释放同步?或者线程 3 是否也需要对变量 a 进行获取,以便接收线程 1 对 x 的写入?
根据https://en.cppreference.com/w/cpp/atomic/memory_order:
当前线程中的所有写入在获取相同原子变量的其他线程中都是可见的
释放相同原子变量的其他线程中的所有写入在当前线程中可见
由于线程 1 和线程 3 没有触及相同的原子变量,我不确定单独的获取/释放是否足以满足上述情况。正式描述中可能隐藏了一个答案,但我无法完全解决。
*编辑:直到事后才注意到,但在我发布的链接中有一个示例(“以下示例演示传递的发布-获取排序......”)与我的示例几乎相同,但它使用所有三个线程都使用相同的原子变量,这似乎很重要。我特意询问变量不相同的情况。
- 我是否相信根据标准,必须始终有一对非松弛原子操作,每个线程中都有一个,以便完全保证任何类型的内存排序?
想象有一个函数“get_data”,它分配一个缓冲区,向其中写入一些数据,并返回一个指向缓冲区的指针。还有一个函数“use_data”,它接受指向缓冲区的指针并对数据做一些事情。线程 1 从 get_data 获取缓冲区,并使用宽松的原子存储将其传递给线程 2 到全局原子指针。线程 2 在循环中放松原子加载,直到它获得指针,然后将其传递给 use_data:
是否有任何类型的操作可以放在“super_duper_memory_fence”中,以保证在 use_data 获取指针时,缓冲区中的数据也是可见的?据我了解,没有可移植的方式来执行此操作,并且线程 2 必须具有匹配的栅栏或其他原子操作,以保证它接收到缓冲区中的写入,而不仅仅是指针值。这个对吗?
c++ - 代码是如何在 C++ 抽象机上存储和执行的?
在我读到的关于 C++ 的第一本书中,它稍微详细介绍了代码是如何在机器上实际执行的(它提到了程序计数器、调用堆栈、返回地址等)。我发现了解这些东西是如何工作的真的很有趣,尽管我知道知道计算机如何工作来编写好的代码并不是真正必要的。
在此 Q/A 网站上阅读相同主题时,我发现它绝不一定是我以前学习的方式,因为我所读到的只是 C++ 的某个实现,取决于某些计算机架构和一定的编译器。C++ 代码也可以在完全不同的东西上运行,只要一个兼容的编译器以“正确”的方式运行。然后由标准和“抽象机器”的行为定义正确的方法(我希望到目前为止我做对了)。
当然,我仍然想知道像内存的代码段或程序计数器这样的概念是否仍然“以某种方式”在标准中被描绘出来,如果是,它们在多大程度上被描绘出来?在抽象机中如何描述代码段一个接一个地执行的概念?
由于有人在评论中询问我是否愿意向我重复该标准:我无法很好地理解该标准,无法准确确定它对抽象机器的描述/或该标准的哪些陈述可以被解释为关于“程序计数器”“代码存储”......等抽象概念的陈述。所以,是的,出于无能为力,我要求社区解释标准中写的内容。这种解释的预期结果是仍然符合“抽象”标准的抽象机器内部结构的最详细概念。