miércoles, 6 de marzo de 2024

El diccionario


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.

CREATE

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