- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在试图找出 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
的定义方式。
回到普通变量,我的主要问题是:为什么每个变量保留两个单元格?
另外:
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 。这可以是实现所需的任何内容,但在许多情况下,它是代码字段的地址。
执行使用 CREATE
或 VARIABLE
创建的单词会为您提供参数字段的地址。
这可能就是为什么在 Win32Forth 中,两个地址相差 4 个字节,或一个单元格。我不知道为什么练习的答案应该没有区别。
假设 BASE
是一个用户变量,它可能是这样工作的:每个任务都有自己的用户区域,用户变量被分配在其中。所有用户变量都知道它们在该区域内的特定偏移量。勾选 BASE
会给你它的 XT,它对所有任务都是一样的。执行 BASE
通过将其偏移量添加到用户区域的基址来计算地址。
关于forth - 为什么 Forth 为每个变量保留两个单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45391043/
正如标题所暗示的,在 Forth 中: 做: 1024 4 ERASE 从地址 1024 或 4 个单元格开始的 4 个字节清零(32 位 Forth 中的 4x4=16 个字节)? 我找不到任何完全
在 Forth 中,如果栈顶为零,是否有一个常用词来有条件地退出过程(返回)?我正在考虑在递归过程中使用它而不是 IF。 最佳答案 有一个普遍实现的词叫做“?exit”,如果不是零,它就会退出。你将不
阅读 Gforth 手册,可以使用 TO 一词更改值,那么它与变量有何不同? https://gforth.org/manual/Values.html 最佳答案 VALUE取一个初始值,创建的wor
当我阅读 Stephen Pelc 的《Programming Forth》时,文本似乎暗示词汇表和单词列表可能是不同的东西。我认为字典词汇条目有名称字段、代码字段等,因此拥有单独的单词列表对我来说没
阅读 Gforth 手册,可以使用 TO 一词更改值,那么它与变量有何不同? https://gforth.org/manual/Values.html 最佳答案 VALUE取一个初始值,创建的wor
我知道 variable test 5 cells allot 不能保证分配一个连续的内存块,而 create test 1 , 2 , 3 , 4 , 5 , 会肯定会创建一个连续的内存块。 var
在 Forth 中,在重新定义单词的情况下,使用重新定义的单词的另一个单词的预期行为是什么? 例如如果 x电话y : : Y ." Old Y " CR ; : X 10 0 DO Y LOOP ;
我使用 Quicksort 对作为由堆栈上的条目表示的集合中的元素的整数进行排序。它工作正常,除非它必须对碰巧已经排序的更大(大约 10,000 个元素)集进行排序。 : adswap \ ad1 a
目的是在字典中创建一个 Forth 单词,然后打印出该单词的内存内容。第一步很容易。 : main word 是按照教程中的描述创建的。创建单词后,字典指针移动到下一个位置,所以我必须从中减去一些项目
我知道,这个问题在过去经常被问到,也许这些信息在以前的 StackOverflow 帖子中给出。但是学习 Forth 是一项非常复杂的任务,重复有助于理解串联编程语言相对于 C 等替代语言的优势。 我
当一个词被重新定义时,是否可以访问旧词? 想象有一个词foo定义和重新定义 : foo ( n -- 2*n ) 2* ; ok : foo ( n -- 2*n+1 ) foo 1+ ; rede
字."打印一个字符串。更准确地说,它编译了 (.")和字符串直到下一个 "在当前编译的单词中。 但是我怎么打印 That's the "question". 与 Forth? 最佳答案 在 Forth
在 Forth 中定义单词时选择参数顺序的一般规则(经验法则)是什么? 例如,在控制几个 Helm 机的情况下,让我们定义 SERVO!这将设置伺服 channel 的位置。 关注 !方式,应该是:
当一个词已经在 Forth 中定义时,有没有办法打印它的定义? 我听说过很多 Forth 的内置函数,比如 emit , drop等是根据语言本身定义的,我希望能够查看它们的定义。 最佳答案 你通常可
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
是否可以获得当前在 Forth 中定义的所有单词的列表(例如在 Gforth 中)? 最佳答案 标准WORDS单词仅打印顶级词汇表(单词列表)中的所有单词 - 请参阅 specification .
由于导致堆栈溢出的编程错误,我正在失去工作效率。 例如,如果我在一个循环内的 IF ELSE THEN 分支中省略了一个 drop,并且出现堆栈溢出,我通常必须重新启动我的开发环境。我正在使用 Swa
第 3 章 Starting FORTH说, Now that you've made a block "current", you can list it by simply typing the
我在使用以下 Forth 代码时遇到了一些问题: HEX FFFF3E27 CONSTANT SHUTTER DECIMAL : OPEN 1 SWAP ! ;
在试图找出 Forth 如何管理字典(以及一般的内存)时,我遇到了 this页。由于熟悉 C,我对指针的概念没有任何问题,而且我假设我理解的一切都是正确的。但是,页面末尾是 several exerc
我是一名优秀的程序员,十分优秀!