La cuestión fundamental puede no se han respondido de una manera que requiera un nuevo usuario de Forth, así que me echaré a correr.
La memoria en Forth puede ser muy dependiente del objetivo, por lo que limitaré la descripción al modelo más simple, que es un espacio de memoria plano, donde el código y los datos conviven felizmente. (a diferencia de los modelos de memoria segmentada, o memoria FLASH para código y RAM para datos u otros modelos más complicados)
El diccionario normalmente comienza en la parte inferior de la memoria y se asigna hacia arriba por el sistema Forth. Las dos pilas, en un sistema simple, existirían en alta memoria y típicamente tienen dos registros de CPU apuntando hacia ellas. (Muy dependiente del sistema)
En el nivel más fundamental, la memoria se asigna simplemente al cambiar el valor de la variable del puntero del diccionario. (a veces llamado DP)
El programador no suele acceder a esta variable directamente, sino que utiliza algunas palabras de nivel superior para controlarla.
Como mencionamos, la palabra 'AQUÍ' devuelve la siguiente dirección disponible en el espacio del diccionario. Lo que no se mencionó fue que AQUÍ se define obteniendo el valor de la variable DP. (Sistema de dependencia aquí, pero útil para una descripción)
En Forth 'aquí' podría tener este aspecto:
: AQUÍ (- addr) DP @;
Eso es todo.
Para asignar algo de memoria tenemos que mover AQUÍ hacia arriba y lo hacemos con la palabra 'ALLOT'.
La cuarta definición de 'ALLOT' simplemente toma un número de la pila de parámetros y lo agrega al valor en DP. Por lo tanto, no es más que:
: ALLOT (n -) DP +! ; \ '+!' agrega n a la variable de contenido DP
ALLOT es utilizado por el sistema FORTH cuando creamos una nueva definición para que lo que creamos esté seguro dentro de la memoria 'ALLOTed'.
Algo que no es inmediatamente obvia es la que ALLOT puede tomar un número negativo por lo que es posible mover el puntero de diccionario arriba o hacia abajo. Por lo que podría destinar parte de la memoria y volver así:
HEX 100 ALLOT
y liberarla así:
HEX -100 ALLOT
Todo esto para decir que este es el la forma más simple de administración de memoria en un sistema Forth. Un ejemplo de cómo esto se usa se puede ver en la definición de la palabra 'BUFFER:'
: tampón: (n -) CREATE ALLOT;
'BUFFER:' "crea" un nuevo nombre en el diccionario (create uses allot para hacer espacio para el nombre) y luego ALLOTs n bytes de memoria justo después del nombre y cualquier octetos de limpieza asociado a su sistema Forth utilizar
Así que ahora asignar un bloque de memoria llamado simplemente Tipo:
MARCADOR FOO \ marca de donde termina la memoria en este momento
HEX 2000 BUFFER: IN_BUFFER
ahora tenemos una 8K byte buffer c alled IN_BUFFER. Si quería recuperar ese espacio en la Norma Forth podríamos escribir 'FOO' y todo lo asignado en el Diccionario FOO después se retira del sistema Forth.
Pero si quieres espacio de memoria temporal, todo por encima de 'aquí' es libre de usar!
Entonces sólo tiene que apuntar a una dirección y utilizarlo si quieres que como este
: MYMEMORY aquí + 200; \ MyMemory puntos en la memoria no-asignado por encima de aquí
\ MYMEMORY moves with HERE. be aware.
MYMEMORY HEX 1000 ERASE \ llenan con 2K bytes de cero
Forth normalmente se ha utilizado para aplicaciones integradas de alto rendimiento, donde la asignación de memoria dinámica puede causar la ONU -código confiable por lo que se prefirió la asignación estática usando ALLOT. Sin embargo los sistemas más grandes tienen un montón y utilizan ASIGNAR, GRATIS y cambiar el tamaño al igual que utilizamos malloc etc en C.
BF
Esto puede ser un poco tarde ... ¿te importaría explicar el propósito de la palabra '> link'? –
Lo sentimos: el enlace es un descriptor de acceso que va del puntero a la "celda de cons" (para tomar prestado un término de LISP) a la dirección del puntero "siguiente". Se implementa como NO-OP porque en esta implementación, el puntero "Siguiente" es lo primero que se almacena en la celda de cons. –