Máquinas de Pila Abstracta
Generación de Código Intermedio
Código intermedio
Un programa para una máquina
abstracta
Dos cualidades
Fácil de producir
Reglas claras de cómo construírla
Fácil de traducir al lenguaje objeto
Código de 3 direcciones
A = A*8 + B/7
temp1 = A*8
temp2 = B/7
A = temp1 + temp2
Variables temporales
Máquinas de Pila
Memoria independiente para
instrucciones y datos
Toda operación es con valores de la pila
Operaciones
Aritmética entera
Manipulación de pila
Control de flujo
Instrucciones aritméticas
Una instrucción por cada operador
aritmético
+, -, *, /, div, mod, etc.
Ojo con “-”: a – 8 -> a 8 -
Simula evalución de expresiones
postfijas
Ejemplo
1, 3 + 5 *
Push 1
Push 3
Push (Pop + Pop)
Push 5
Push (Pop * Pop)
Izquierda o derecha
i = 5; i = i + 1;
Lado derecho: valor entero
Lado izquierdo: dónde almacenar
resultado
i en lado izquierdo indica dirección
Instrucciones
Push v
ValD w
ValI w
Pop
:=
Copy
inserta v en la pila
inserta valor de posición w
inserta dirección de w
Saca valor de la pila
Pop y poner en dir. Pop
Pop y Push-Push
día := (14*a) div 4 + 153*m
En postfijo:
día 14 a * 4 div 153 m * + :=
En código de pila
ValI día
Push 14
ValD a
*
Push 4
div
Push 153
ValD m
*
+
:=
Control de flujo
Opciones
Operando da destino
Jump 300
Operando da posición relativa de destino
Forward 5
Backward 10
Destino simbólico (etiquetas)
Jump Ciclo
Instrucciones Control Flujo
Label z
etiqueta la posición
Look z
va a posición etiqueta z
IfFalseLook z
Si Pop = 0 va a posición etiqueta z
IfTrueLook z
Si Pop <> 0 va a posición etiqueta z
Halt
detiene ejecución
if a>8 then a=10;
ValD a
Push 8
IfTrueLook Asigna
Look Continúa
Label Asigna
ValI a
Push 10
:=
Label Continúa
while a<5 do a++;
Label Prueba
ValD a
Push 5
-
IfFalseLook Sigue
ValI a
ValD a
Push 1
+
:=
Look Prueba
Label Sigue
Etiquetas
Función NewLabel()
Genera nuevas etiquetas
Puede incluírse en reglas semánticas
TmpLabel = NewLabel()
Garatiza etiquetas no repetidas
Label00001, Label00002, ..., Label03428, ...
Reglas Semánticas
Prop -> if Expr then
Prop
Label1 = NewLabel();
Prop.t = Expr.t & NL &
“IfFalseLook ” &
Label1 & NL &
Prop.t & NL &
“Label ” & Label1
Descargar

Máquinas de Pila Abstracta