Depende de la implementación.
Por ejemplo, un compilador de C podría mantener una tabla de símbolos durante la compilación. Esta es una estructura de datos rica que permite empujar y hacer estallar los ámbitos, ya que cada llave de apertura de declaración compuesta {
potencialmente introduce un nuevo alcance para nuevas variables locales. Además de manejar ámbitos que van y vienen, registra las variables declaradas y para cada uno incluye los nombres y sus tipos.
Esta estructura de datos de la tabla de símbolos también admite la búsqueda de información de una variable por nombre, por ejemplo, por su identificador, y el compilador hace esto cuando vincula la información de la variable declarada a los identificadores sin procesar que ve en el análisis, por lo que esto es bastante temprano durante la compilación.
En algún momento, el compilador asigna ubicaciones a las variables. Quizás las asignaciones de ubicación se registran en la misma estructura de datos de la tabla de símbolos. El compilador podría realizar la asignación de ubicación directamente durante el análisis, pero es probable que pueda hacer un mejor trabajo si espera no solo hasta después del análisis, sino también después de la optimización general.
En algún momento, para las variables locales, el compilador asigna una ubicación de pila o un registro de CPU (puede ser más complejo ya que la variable puede tener múltiples ubicaciones, como una ubicación de pila para algunas partes del código generado y una CPU registrarse para otras secciones).
Finalmente, el compilador genera código real: instrucciones de máquina que hacen referencia a los valores de las variables directamente por sus registros de CPU o ubicación de pila asignada, según sea necesario para ejecutar el código que se está compilando. Cada línea de código fuente compila su propia serie de instrucciones de código de máquina, por lo que las instrucciones generadas codifican no solo las operaciones (sumar, restar) sino también las ubicaciones de las variables a las que se hace referencia.
El código objeto final que sale del compilador ya no tiene nombres y tipos de variables; solo hay ubicaciones, ubicaciones de pila o registros de CPU. Además, no hay una tabla de ubicaciones, sino que estas instrucciones son utilizadas por cada instrucción de máquina que conoce la ubicación donde se almacena el valor de la variable. Sin buscar identificadores en el código de tiempo de ejecución, cada bit del código generado simplemente conoce la operación a realizar y las ubicaciones a utilizar.
Cuando se habilita la depuración durante la compilación, el compilador generará una forma de la tabla de símbolos para que, por ejemplo, los depuradores conozcan los nombres de las variables en las distintas ubicaciones de la pila.
Algunos otros idiomas tienen la necesidad de buscar identificadores dinámicamente en tiempo de ejecución, por lo que también pueden proporcionar algún tipo de tabla de símbolos para satisfacer tales necesidades.
Los intérpretes tienen una amplia gama de opciones. Pueden mantener una estructura de datos similar a una tabla de símbolos para usar durante la ejecución (además de usar durante el análisis), aunque en lugar de asignar / rastrear una ubicación de pila, simplemente almacene el valor de la variable, asociado con la entrada de la variable en la tabla de símbolos estructura de datos.
Quizás se almacene una tabla de símbolos en el montón en lugar de en la pila (aunque ciertamente es posible usar la pila para ámbitos y variables, y además puede imitar una pila en el montón para obtener la ventaja amigable de la caché de empacar los valores de la variable cerca de cada uno otro), por lo que un intérprete probablemente esté usando memoria de almacenamiento dinámico para almacenar los valores de la variable, mientras que un compilador usa ubicaciones de pila. En términos generales, el intérprete tampoco tiene la libertad de usar los registros de la CPU como almacenamiento para los valores de las variables, ya que los registros de la CPU están ocupados ejecutando las líneas de código del propio intérprete ...