gpt4 book ai didi

forth - 为什么 Forth 为每个变量保留两个单元格?

转载 作者:行者123 更新时间:2023-12-01 12:19:42 25 4
gpt4 key购买 nike

在试图找出 Forth 如何管理字典(以及一般的内存)时,我遇到了 this页。由于熟悉 C,我对指针的概念没有任何问题,而且我假设我理解的一切都是正确的。但是,页面末尾是 several exercises ,在这里我注意到了一些奇怪的事情。

练习 9.4,假设 DATE 已被定义为 VARIABLE,询问

之间的区别是什么
DATE .

' DATE .

练习 9.5 使用用户变量 BASE 执行相同的操作。

根据提供的答案,这两个短语将给出相同的结果(同样使用 BASE)。用 Win32Forth 试试这个但是,给出的结果相差 4 个字节(1 个单元格)。这是我所做的:

here . 4494668  ok
variable x ok
x . 4494672 ok
' x . 4494668 ok

创建另一个变量会得到类似的结果:

variable y  ok
y . 4494680 ok
' y . 4494676 ok

因此,看起来每个变量不仅获得一个单元格(用于值),而且获得两个单元格。变量本身指向存储实际值的位置,并在执行 token 处检索内容(使用 ' x ?)为两个变量提供 0040101F

对于练习 9.5,我的结果是:

base . 195F90  ok
' base . 40B418 ok

这些甚至彼此都不接近。但是,此练习的答案确实提到结果可能取决于 BASE 的定义方式。

回到普通变量,我的主要问题是:为什么每个变量保留两个单元格?

另外:

  • 由于只有一个单元格包含实际值,那么另一个单元格的内容是什么意思?
  • 这是特定于 Win32Forth 的吗?在其他实现中会发生什么情况?
  • 运行时变量和编译时变量有什么不同吗?
  • 上述问题的答案如何应用于用户变量(例如 BASE)?

EDIT1: 好吧,Forth 还为每个变量存储了一个标题,使用 ' 给你这个标题的地址。根据我的测试,我会得出结论,标题只使用一个单元格,它不对应于标题应包含的所有信息。其次,根据练习,检索变量的地址对于这两种情况应该给出相同的结果,这似乎与标题的存在完全矛盾。

我的直觉是,这都是非常特定于实现的。如果是这样,在 Win32Forth 中会发生什么,根据练习应该发生什么?

最佳答案

这就是使用传统内存布局在字典中定义的大致样子。请注意,实现可能与此有很大差异,有时会有很大差异。特别是,字段的顺序可能不同。

Link to previous word (one cell)
Flags (a few bits)
Name length (one byte, less a few bits)
Name string (variable)
Code field (one cell)
Parameter field (variable)

除了代码和参数字段之外的所有内容都被视为标题。代码字段通常位于参数字段之前。

' 勾选一个词会给你一个 XT,或执行 token 。这可以是实现所需的任何内容,但在许多情况下,它是代码字段的地址。

执行使用 CREATEVARIABLE 创建的单词会为您提供参数字段的地址。

这可能就是为什么在 Win32Forth 中,两个地址相差 4 个字节,或一个单元格。我不知道为什么练习的答案应该没有区别。

假设 BASE 是一个用户变量,它可能是这样工作的:每个任务都有自己的用户区域,用户变量被分配在其中。所有用户变量都知道它们在该区域内的特定偏移量。勾选 BASE 会给你它的 XT,它对所有任务都是一样的。执行 BASE 通过将其偏移量添加到用户区域的基址来计算地址。

关于forth - 为什么 Forth 为每个变量保留两个单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45391043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com