这个基本问题可能没有以新的 Forth 用户需要的方式得到回答,所以我将尝试一下。
Forth 中的内存可能非常依赖于目标,因此我将限制描述为最简单的模型,即平坦的内存空间,代码和数据在其中愉快地共存。 (与分段内存模型或用于代码的闪存和用于数据的 RAM 或其他更复杂的模型相反)
字典通常从内存底部开始,并由 Forth 系统向上分配。在简单的系统中,这两个堆栈将存在于高端内存中,并且通常有两个指向它们的 CPU 寄存器。 (非常依赖系统)
在最基本的层面上,只需更改字典指针变量的值即可分配内存。 (有时称为DP
)
程序员通常不会直接访问该变量,而是使用一些更高级别的字来控制它。
正如第四个词所提到的HERE
返回字典空间中的下一个可用地址。没有提到的是HERE
通过获取变量的值来定义DP
。 (此处的系统依赖性但对于描述很有用)
在福斯HERE
可能看起来像这样:
: HERE ( -- addr) DP @ ;
就是这样。
为了分配一些内存,我们需要移动HERE
向上,我们用这个词来做到这一点ALLOT
.
第四个定义为ALLOT
只需从参数堆栈中取出一个数字并将其添加到 DP 中的值即可。所以无非是:
: ALLOT ( n --) DP +! ; \ '+!' adds n to the contents variable DP
ALLOT
当我们创建新定义时,FORTH 系统会使用它,以便我们创建的内容安全地位于“分配的”内存中。
一些不是立即显而易见的事情是ALLOT
可以取负数,因此可以向上或向下移动字典指针。所以你可以分配一些内存并像这样返回它:
HEX 100 ALLOT
并像这样释放它:
HEX -100 ALLOT
所有这些都表明这是 Forth 系统中最简单的内存管理形式。如何使用它的一个例子可以在这个词的定义中看到BUFFER:
: BUFFER: ( n --) CREATE ALLOT ;
BUFFER:
在字典中“创建”一个新名称(顺便说一下,create 使用分配为该名称腾出空间),然后在该名称以及 Forth 系统可能使用的任何相关内务字节之后分配 n 字节内存
现在要分配一块命名内存,我们只需键入:
MARKER FOO \ mark where the memory ends right now
HEX 2000 BUFFER: IN_BUFFER
现在我们有一个 8K 字节的缓冲区,称为IN_BUFFER
。如果想回收 Standard Forth 中的空间,我们可以输入FOO
以及之后在字典中分配的所有内容FOO
将从 Forth 系统中删除。
但如果你想要临时内存空间,上面的一切HERE
可以免费使用!
因此,如果您想喜欢这个,您可以简单地指向一个地址并使用它
: MYMEMORY here 200 + ; \ MYMEMORY points to un-allocated memory above HERE
\ MYMEMORY moves with HERE. be aware.
MYMEMORY HEX 1000 ERASE \ fill it with 2K bytes of zero
Forth 通常用于高性能嵌入式应用程序,其中动态内存分配可能会导致代码不可靠,因此使用静态分配ALLOT
是首选。然而,更大的系统有堆和使用ALLOCATE
, FREE
and RESIZE
就像我们在 C 中使用 malloc 等一样。
BF