Estoy tomando un curso de principios de los lenguajes de programación en este momento, pero no puedo por la vida de mí resolver esto. Esta no es tarea solo una pregunta conceptual general.¿Cómo se relaciona una tabla de símbolos con las cadenas estáticas y el alcance?
En nuestra clase hemos hablado de cadenas estáticas y pantallas. Creo que entiendo por qué los necesitamos. De lo contrario, cuando tengamos métodos anidados, no podremos determinar de qué variable estamos hablando cuando tengamos métodos anidados.
Mi prof también ha hablado de una tabla de símbolos. Mi pregunta es ¿para qué sirve la tabla de símbolos? ¿Cómo se relaciona con las cadenas estáticas?
Voy a dar algunos antecedentes (por favor corríjanme si me equivoco).
(Voy a definir algunas cosas sólo para hacer explicaciones más fácil)
Supongamos que tenemos este código:
main(){
int i;
int j;
int k;
a(){
int i;
int j;
innerA(){
int i = 5;
print(i);
print(j);
print(k);
}
}
b(){
...
}
...
}
Y esta pila:
| innerA |
| a |
| b |
| main |
-----------
Descripción rápida de las cadenas estáticas como repaso.
Las cadenas estáticas se utilizan para encontrar qué variable se debe usar cuando las variables se redefinen dentro de una función interna. En la pila que se muestra arriba, cada cuadro tendrá un puntero al método que lo contiene. Por lo tanto:
| innerA | \\ pointer to a
| a | \\ pointer to main
| b | \\ pointer to main
| main | \\ pointer to global variables
-----------
(Suponiendo alcance estático, para el ámbito dinámico creo que cada marco de pila solo apuntará a la de abajo)
Creo que cuando ejecutamos print(<something>)
dentro del método innerA
este que va a pasar:
currentStackframe = innerAStackFrame;
while(true){
if(<something> is declared in currentStackFrame)
print(<something>);
break;
else{
currentStackFrame = currentStackFrame.containedIn();
}
}
repaso rápido de symbo l tabla
No estoy seguro de para qué sirve una tabla de símbolos. Pero esto es lo que parece:
Index is has value,
Value is reference.
__
| |
|--| --------------------------------------------------
| | --------------------> | link to next | name | type | scope level | other |
|--| --------------------------------------------------
| | |
|--| ---------------
| | |
|--| | --------------------------------------------------
| | -------> | link to next | name | type | scope level | other |
|--| --------------------------------------------------
| |
|--|
- enlace a lado - si hay más de una cosa tiene el mismo tiene valor hash se trata de un nombre de enlace
- - nombre del elemento (ejemplos: i, j, a, int)
- tipo - de qué se trata (ejemplos: variable, función, parámetro)
- nivel de alcance - no es 100% seguro de cómo se define esto.Creo que:
- 0 sería construido-ins
- 1 sería globales
- 2 sería principal método
- 3 habría una y b
- 4 sería innerA
Sólo para reiterar mis preguntas:
- ¿Para qué sirve la tabla de símbolos?
- ¿Cómo se relaciona con las cadenas estáticas?
- ¿Por qué necesitamos cadenas estáticas ya que la información del alcance está en la tabla de símbolos?
Estas son preguntas muy amplias sobre cómo funcionan los compiladores. –