En el modelo de memoria de la J1s la unidad de almacenamiento y la celda tienen el mismo tamaño (16 bits), lo mismo que los caracteres (una celda por caracter). Existe sólo un heap donde se almacena código y valores.
El diccionario es una simple lista enlazada donde los elementos se agregan por el comienzo. Todas las búsquedas son secuenciales y recorren desde la palabra más reciente hasta la primera.
Cuando el intérprete ejecuta CREATE XYZ, este es el resultado en memoria
Formato Entrada Diccionario |
Primero encontramos el nombre de la palabra almacenado como counted string. Luego vienen tres punteros:
- El primero apunta a la palabra previa. El fin del diccionario se marca con un cero en este campo.
- El segundo puntero lleva al nombre almacenado.
- El tercer puntero lleva al código ejecutable compilado de la palabra.
CREATE genera dos instrucciones por default, según el standard:
- Cargar en el stack la dirección siguiente a la entrada (cola en el diagrama).
- Retornar.
CREATE no reserva memoria más allá del RETURN; eso depende del uso posterior. Por ejemplo, para definir una variable primero se usa CREATE y luego se reserva una celda adicional para dejar en ella el valor.
El formato es flexible, pues permite colocar el nombre y código en cualquier otra parte de la memoria. Después de todo, se accede ellos vía punteros.
En particular, las primeras palabras del diccionario tienen nombre y código ya definidos (en assembler) antes de crear la entrada. No tiene sentido copiar nombre y código; simplemente se ajustan los punteros.
Palabras asociadas
dict ( -- addr )
Retorna dirección de la última palabra agregada al diccionario (o sea, el principio de la lista).
search ( <nombre> -- addr )
Lee un nombre desde la entrada y busca la palabra en el diccionario. Retorna puntero a la entrada correspondiente (cero si no se encuentra).
entry-name ( addr -- addr )
Dado el puntero a una entrada, retorna la dirección del counted string con el nombre de la palabra.
entry-code ( addr -- addr )
Dado el puntero a una entrada, retorna la dirección del código asociado.
forget ( <nombre> -- )
Lee un nombre de la entrada y elimina la palabra del diccionario, junto con todos las palabras definidos después de él. La memoria se recicla. Si la palabra no existe, no se hace nada.
No hay comentarios.:
Publicar un comentario