Está en la página 1de 9

Introduccin

El objetivo es mostrar como las construcciones


del lenguaje pueden ser ejecutadas por secuencias de operaciones del procesador abstracto. La semntica del lenguaje de programacin puede ser descripta por reglas que especifican como cada construccin es traducida a una secuencia de instrucciones equivalentes Simplesem.

Implementacin de Lenguajes
Procesador Semntico Abstracto SIMPLESEM

Estructura del Procesador


Componentes
Instruction Pointer (IP). Memoria:
Memoria para cdigo (C). Memoria para datos (D).

Estructura del procesador


C D

Procesador.

Como trabaja el Procesador


Repetir hasta Halt. Obtener la instruccin actual (C[IP]) Incrementar IP. Ejecutar la instruccin actual.
IP

Instrucciones bsicas (Codigo)


Modificacin de la memoria : SET target, source
Directa: SET 10,D[20] Indirecta: SET D[30],D[45] Con expresiones: SET 23,D[20]*3+D[35]

Estructura de la memoria de datos


Direccin base del RA ejecutando actualmente. Sirve para manipular los elementos del RA en ejecucin

D
Actual Libre D[0] D[1]

La posicin de memoria siguiente a donde finaliza el RA actual, ie, la primera celda libre de memoria.

Salto
Incondicional: JUMP dir Condicional: JUMPT dir, cond

RA 1

Registros de

RA 2

Activacin

Entrada/Salida
Entrada: SET target, read Salida: SET write, source

Estructura de un Registro de Activacin


direccin de la instruccin que debe ser ejecutada al retornar de la llamada

Ejemplo Registros de Activacin


Program P Proc Q var z Function R () {} 0 Actual 1 Libre 30 40 30

direccin base del registro de activacin de la unidad llamadora Sirve para poder retornar a la unidad que activo a la actual.

PR puntero de retorno ED enlace dinmico EE enlace esttico Parmetros Formales

Variables Locales

direccin base del registro de activacin de la unidad que contiene sintcticamente a la unidad que hace referencia este registro de activacin. Sirve para resolver referencias no locales

{ z:=R() } { Q }

Ejemplo Registros de Activacin


Program P Proc Q var z Function R () {} { z:=R() } { Q } 40 RA Q 0 Actual 1 Libre 30 PR ED EE
Variables Locales

Ejemplo Registros de Activacin


40 30 Program P Proc Q var z Function R () {} { z:=R() } { Q } 40 RA Q 0 Actual 1 Libre 30 PR ED EE

30 40 30

Variables Locales

Ejemplo Registros de Activacin


Program P Proc Q var z Function R () {} { z:=R() } { Q } 40 RA Q 0 Actual 1 Libre 30 PR ED EE

30 40 40

Ejemplo Registros de Activacin


Program P Proc Q var z Function R () {} { z:=R() } { Q } RA R 40 RA Q 0 Actual 1 Libre 30 PR ED EE

30 40 40

Variables Locales

Variables Locales

PR ED EE
Variables Locales

50

Ejemplo Registros de Activacin


Program P Proc Q var z Function R () {} { z:=R() } { Q } RA R 40 RA Q 0 Actual 1 Libre 30 PR ED EE

40 40 40

Ejemplo Registros de Activacin


Program P Proc Q var z Function R () {} { z:=R() } 40 RA R RA Q 0 Actual 1 Libre 30 PR ED EE

40 40 50

Variables Locales

Variables Locales

PR ED EE

{ Q }

PR ED EE
Variables Locales

Variables Locales

50

50

Invocacin a una Unidad


Reservar espacio para el valor de retorno (si es
necesario) Guardar PR Guardar ED Guardar EE Pasaje de parmetros (si es necesario) Actualizar actual Actualizar libre (reservando espacio para las variables locales de ser necesario) Actualizar IP

Ejemplo 1
0 Actual 2 5 10 20

Program P var x, y, z: integer; function R (a, var b): integer begin RA de P b := a; return o; end begin //de P x := 10; y := 20; write (R(x,y)) end //de P

1 Libre 2 x 3 y 4 z 5 6 7 8 9 10 11

Reservar espacio para el valor de retorno


0 Actual 2 56 10 20

Guardar el puntero de retorno


SET D[1], IP + _____
Cantidad de instrucciones necesarias para realizar la invocacin

SET 1, D[1] + 1
Resultado de R

1 Libre 2 x 3 y 4 z 5 6 7 8 9 10 11

Guardar el enlace dinmico


0 Actual 2 56 10 20

Guardar el enlace esttico


Distancia: la cantidad de enlaces a travs de la
cadena esttica entre una referencia a un identificador y su correspondiente declaracin. Esquema de direccionamiento: dada la distancia d y comenzando por el RA actual, atravesar d pasos a travs de la cadena esttica (Sumando el offset del RA). Formalmente:
D[0] fp(d) = D[fp(d-1)+2] si d > 0 si d = 0

SET D[1] + 1, D[0]


Resultado de R

1 Libre 2 x 3 y 4 z 5 6 PR 7 ED

RA de R

8 EE 9 10 11

Guardar el enlace esttico

Guardar el enlace esttico

D[0] fp(d) = D[fp(d-1)+2]

si d = 0 fp(d) = si d > 0

D[0] D[fp(d-1)+2]

si d = 0 si d > 0

Intuitivamente d es la diferencia entre: el nivel de anidamiento donde se hace


referencia al identificador y el nivel de anidamiento de la declaracin del identificador

Como vamos a ver esta funcin no solo la


vamos a usar para calcular el valor del enlace esttico que guardamos en el RA La usaremos cada vez que hacemos referencia a un identificador para acceder al comienzo del registro de activacin que lo contiene

Ejemplo 1 Niveles de Anidamiento

Guardar enlace esttico


0 Actual 2 56 10 20

Program P var x, y, z: integer; function R (a, var b): integer begin b := a; 1 return o; end begin {de P} x := 10; y := 20; 0 write (R(x,y)) end {de P}

SET D[1] + 2, fp(d)


declaracin Program P var x, y, z: integer; function R (a, var b): int begin b := a; 1 return o; end begin {de P} x := 10; y := 20; write (R(x,y)) 0 end {de P} Uso d=0, D[0] = 2 Resultado de R

1 Libre 2 x 3 y 4 z 5 6 PR 7 ED

2 2

RA de R

8 EE 9 10 11

Pasaje de Parmetros Por Valor


0 Actual 2 56 10 20

Pasaje de Parmetros Por Referencia


0 Actual 2 56 10 20

SET D[1] + offset a, D[ fp(d) + offset x ]


D[1] + 3 = 6 +3 = 9 Program P var x, y, z: integer; function R (a, var b): int begin b := a; 1 return o; end begin {de P} x := 10; y := 20; write (R(x,y)) 0 end {de P} D[ fp(0) + 0] = D[D[0] + 0] = D[2] = 10 Resultado de R

1 Libre 2 x 3 y 4 z 5 6 PR 7 ED

SET D[1] + offset b, fp(d) + offset y


D[1] + 4 = 6 +4 = 10 Program P var x, y, z: integer; function R (a, var b): int begin b := a; 1 return o; end begin {de P} x := 10; y := 20; write (R(x,y)) 0 end {de P} fp(0) + 1 = D[0] + 1 2 +1 = 3 Resultado de R

1 Libre 2 x 3 y 4 z 5 6 PR 7 ED

2 2 10

2 2 10 3

RA de R

8 EE 9 a 10 b 11

RA de R

8 EE 9 a 10 b 11

Pasaje de Parmetros Por Referencia


0 Actual 2 56 10 20

Actualizar Actual, Libre e IP


0 Actual 26 5 6 11 10 20

SET D[1] + offset b, fp(d) + offset y


D[1] + 4 = 6 +4 = 10 fp(0) + 1 = D[0] + 1 2 +1 = 3

1 Libre 2 x 3 y z PR ED EE a b

Actualizar actual
SET 0, D[1] Actualizar Libre SET 1, D[0] + TRA
Tamao del RA de R

1 Libre 2 x 3 y 4 z Resultado de R 5 6 PR 7 ED RA de R 8 EE 9 a 10 b 11

4 Program P var x, y, z: el integer; OJO! Si parmetroResultado de R 5 function R (a, var b): int 6 real es a su vez un begin 7 parmetro b := a; pasado por RA de R return o; hay1 8 referencia que end 9 usar: begin {de P} 10 x := 10; y :=fp(d) 20; D[ + offset y ] 11 write (R(x,y)) 0 end {de P}

2 2 10 3

Actualizar IP
JUMP Direccin

2 2 10 3

Direccin de la primera instruccin de R

Retorno de una Unidad


0 Actual 262 5 6 11 6 10 20 10 0

Cdigo del Programa P


Program P var x, y, z: integer; function R (a, var b): integer begin b := a; return o; end begin {de P} x := 10; y := 20; write (R(x,y)) end {de P}
0 SET D[fp(0)+ 4], D[fp(0) + 3] 1 SET D[0] 1, 0 2 SET 1, D[0] 3 SET 0, D[D[0] + 1] 4 JUMP D[D[1]] 5 SET 0, 2 6 SET 1, D[0] + 3 7 SET fp(0), 10 8 SET fp(0) + 1, 20 9 SET 1, D[1] + 1 10 SET D[1], IP + 7 11 SET D[1] + 1, D[0] 12 SET D[1] + 2, fp(0) 13 SET D[1] + 3, D[fp(0) + 0] 14 SET D[1] + 4, fp(0) + 1 15 SET 0, D[1] 16 SET 1, D[0] + 5 17 JUMP 0 18 SET 1, D[1] 1 19 SET write, D[1] 20 HALT

Actualizar Libre
SET 1, D[0] Actualizar Actual SET 0, D[ D[0] + 1]

1 Libre 2 x 3 y 4 z Resultado de R 5 6 7 8 9 10 11

Cdigo de R

Cdigo de P

Uso el Enlace Dinmico

Actualizar IP
JUMP D[ D[1] ]

Cdigo del Programa P


Program P var x, y, z: integer; function R (a, var b): integer begin Actual y b := a; Libre en P return o; end begin {de P} x := 10; y := 20; write (R(x,y)) end {de P}
0 SET D[fp(0)+ 4], D[fp(0) + 3] 1 SET D[0] 1, 0 2 SET 1, D[0] 3 SET 0, D[D[0] + 1] 4 JUMP D[D[1]] 5 SET 0, 2 6 SET 1, D[0] + 3 7 SET fp(0), 10 8 SET fp(0) + 1, 20 9 SET 1, D[1] + 1 10 SET D[1], IP + 7 11 SET D[1] + 1, D[0] 12 SET D[1] + 2, fp(0) 13 SET D[1] + 3, D[fp(0) + 0] 14 SET D[1] + 4, fp(0) + 1 15 SET 0, D[1] 16 SET 1, D[0] + 5 17 JUMP 0 18 SET 1, D[1] 1 19 SET write, D[1] 20 HALT

Cdigo del Programa P


Program P var x, y, z: integer; function R (a, var b): integer begin b := a; return o; end begin {de P} Cuerpo x := 10; de P y := 20; write (R(x,y)) end {de P}
0 SET D[fp(0)+ 4], D[fp(0) + 3] 1 SET D[0] 1, 0 2 SET 1, D[0] 3 SET 0, D[D[0] + 1] 4 JUMP D[D[1]] 5 SET 0, 2 6 SET 1, D[0] + 3 7 SET fp(0), 10 8 SET fp(0) + 1, 20 9 SET 1, D[1] + 1 10 SET D[1], IP + 7 11 SET D[1] + 1, D[0] 12 SET D[1] + 2, fp(0) 13 SET D[1] + 3, D[fp(0) + 0] 14 SET D[1] + 4, fp(0) + 1 15 SET 0, D[1] 16 SET 1, D[0] + 5 17 JUMP 0 18 SET 1, D[1] 1 19 SET write, D[1] 20 HALT

Cdigo de R

Cdigo de R

Cdigo de P

Cdigo de P

Cdigo del Programa P


Program P var x, y, z: integer; function R (a, var b): integer begin b := a; X:= 10; return o; Y:= 20; end begin {de P} x := 10; Llamada y := 20; a R(X,Y) write (R(x,y)) end {de P}
Write del resultado de R
0 SET D[fp(0)+ 4], D[fp(0) + 3] 1 SET D[0] 1, 0 2 SET 1, D[0] 3 SET 0, D[D[0] + 1] 4 JUMP D[D[1]] 5 SET 0, 2 6 SET 1, D[0] + 3 7 SET fp(0), 10 8 SET fp(0) + 1, 20 9 SET 1, D[1] + 1 10 SET D[1], IP + 7 11 SET D[1] + 1, D[0] 12 SET D[1] + 2, fp(0) 13 SET D[1] + 3, D[fp(0) + 0] 14 SET D[1] + 4, fp(0) + 1 15 SET 0, D[1] 16 SET 1, D[0] + 5 17 JUMP 0 18 SET 1, D[1] 1 19 SET write, D[1] 20 HALT

Cdigo del Programa P


Cuerpo Cdigo de R

Cdigo de P

Program P de R var x, y, z: integer; function R (a, var b): integer begin b := a; return 0; end begin {de P} x := 10; y := 20; write (R(x,y)) end {de P}

0 SET D[fp(0)+ 4], D[fp(0) + 3] 1 SET D[0] 1, 0 2 SET 1, D[0] 3 SET 0, D[D[0] + 1] 4 JUMP D[D[1]] 5 SET 0, 2 6 SET 1, D[0] + 3 7 SET fp(0), 10 8 SET fp(0) + 1, 20 9 SET 1, D[1] + 1 10 SET D[1], IP + 7 11 SET D[1] + 1, D[0] 12 SET D[1] + 2, fp(0) 13 SET D[1] + 3, D[fp(0) + 0] 14 SET D[1] + 4, fp(0) + 1 15 SET 0, D[1] 16 SET 1, D[0] + 5 17 JUMP 0 18 SET 1, D[1] 1 19 SET write, D[1] 20 HALT

Cdigo de R

Cdigo de P

Cdigo del Programa P


Retorno

Ejemplo 2
Program dos var X: int procedure P(in out A: int) var L : int begin L := X A := A * L end begin X := 50; P(X) end

Program P de R var x, y, z: integer; function R (a, var b): integer begin b := a; return 0; end begin {de P} x := 10; y := 20; write (R(x,y)) end {de P}

0 SET D[fp(0)+ 4], D[fp(0) + 3] 1 SET D[0] 1, 0 2 SET 1, D[0] 3 SET 0, D[D[0] + 1] 4 JUMP D[D[1]] 5 SET 0, 2 6 SET 1, D[0] + 3 7 SET fp(0), 10 8 SET fp(0) + 1, 20 9 SET 1, D[1] + 1 10 SET D[1], IP + 7 11 SET D[1] + 1, D[0] 12 SET D[1] + 2, fp(0) 13 SET D[1] + 3, D[fp(0) + 0] 14 SET D[1] + 4, fp(0) + 1 15 SET 0, D[1] 16 SET 1, D[0] + 5 17 JUMP 0 18 SET 1, D[1] 1 19 SET write, D[1] 20 HALT

Cdigo de R

Cdigo de P

Ejemplo 2
Program dos var X: int procedure P(in out A: int) var L : int begin L := X A := A * L 1 end begin X := 50; P(X) 0 end

Ejemplo 2
Program dos X Int Offset: 0 var X: int P Procedimiento procedure P(in out A: int) var L : int A Int Offset: begin L Int Offset: L := X A := A * L 1 end begin X := 50; P(X) 0 end

0 1

Ejemplo 2 Cdigo de Dos


Program Dos var X begin X := 50; P(X) end

Ejemplo 2 Cdigo de Dos


0 1
1 2 3
Program Dos var X begin X := 50; P(X) end

X Int Offset: 0 P Procedimiento A Int Offset: L Int Offset:

X Int Offset: 0 P Procedimiento A Int Offset: L Int Offset:


OffsetX = 0

0 1

Codigo de Dos 1 2 SET 0,2 SET 1,D[0] + 1

Codigo de Dos SET 0,2 SET 1,D[0] + 1 SET fp(0) + offset X, 50

Inicializa Actual y Libre segn el registro de Activacin de Dos

Ejecuta la asignacin

Ejemplo 2 Cdigo de Dos


Program Dos var X begin X := 50; P(X) end

Ejemplo 2 Cdigo de Dos


0 1
1 2 3 4 5 6 7 8
Program Dos var X begin X := 50; P(X) end

X Int Offset: 0 P Procedimiento A Int Offset: L Int Offset:

X Int Offset: 0 P Procedimiento A Int Offset: L Int Offset:

0 1

Codigo de Dos 1 2 3 4 5 SET 0,2 SET 1,D[0] + 1 SET fp(0) + 0, 50 SET D[1], fp(0) + offset X SET 1, D[1] + 1

Codigo de Dos SET 0,2 SET 1,D[0] + 1 SET fp(0)+0, 50 SET D[1], fp(0) + 0 SET 1, D[1] + 1 SET D[1], IP + ___ SET D[1] + 1, D[0] SET D[1] + 2, fp(0)

Referencia a X para el pasaje por Valor Resultado

Llamada a P: Puntero de Retorno, Enlace Dinmico y Enlace Esttico

Ejemplo 2 Cdigo de Dos


Program Dos var X begin X := 50; P(X) end

Ejemplo 2 Cdigo de Dos


0 1
6 7 8 9
Program Dos var X begin X := 50; P(X) end

X Int Offset: 0 P Procedimiento A Int Offset: 3 L Int Offset:

X Concretizamos el Int Offset: 0 puntero de retorno P Procedimiento A Int Offset: 3 L Int Offset: 4
Actualiza Actual y Libre. Salta al Cdigo de P Notar que en Libre se guarda espacio para la variable local L

0 1

Codigo de Dos 1 2 3 4 5 6 7 8 9 SET 0,2 SET 1,D[0] + 1 SET fp(0)+0, 50 SET D[1], fp(0) + 0 SET 1, D[1] + 1 SET D[1], IP + ___ SET D[1] + 1, D[0] SET D[1] + 2, fp(0) SET D[1] + 3, D[fp(0) + offset X]

Codigo de Dos SET D[1], 13 SET D[1] + 1, D[0] SET D[1] + 2, fp(0) SET D[1] + 3, D[D[0]] SET 0, D[1] SET 1, D[0] + 5 JUMP 15

Pasaje del parmetro por valor

10 11 12

Ejemplo 2 Cdigo de Dos


Program Dos var X begin X := 50; P(X) end

Ejemplo 2 Cdigo de Dos


0 1
7 8 9 10 11 12 13 14
Program Dos var X begin X := 50; P(X) end

X Int Offset: 0 P Procedimiento A Int Offset: 3 L Int Offset: 4

X Int Offset: 0 P Procedimiento A Int Offset: 3 L Int Offset: 4

0 1

Codigo de Dos 6 7 8 9 10 11 12 13 SET D[1], 13 SET D[1] + 1, D[0] SET D[1] + 2, fp(0) SET D[1] + 3, D[D[0]] SET 0, D[1] SET 1, D[0] + 5 JUMP 15 SET D[1], D[1]1

Codigo de Dos SET D[1] + 1, D[0] SET D[1] + 2, fp(0) SET D[1] + 3, D[D[0]] SET 0, D[1] SET 1, D[0] + 5 JUMP 15 SET D[1], D[1]1 HALT

Liberamos la referencia a X usada para el pasaje por valor resultado

Ejemplo 2 Cdigo de P
procedure P(in out A: int) var L: int begin L:= X A := A * L end

Ejemplo 2 Cdigo de Dos


0 1
15 16 17 18 19 20 21 22 23
procedure P(in out A: int) var L: int begin L:= X A := A * L end

X Int Offset: 0 P Procedimiento A Int Offset: 3 L Int Offset: 4

X Int Offset: 0 P Procedimiento A Int Offset: 3 L Int Offset: 4

0 1

Codigo de P 15 16 17 18 19 20 21 22 23 SET fp(0)+offset L, D[fp(1) + offset X]

Codigo de P SET fp(0)+4, D[fp(1)+0]

SET fp(0)+offA, D[fp(0)+offA] * D[fp(0)+offL]

Offset L = 4

Offset X = 0

Offset L = 4

Offset L = 4

Ejemplo 2 Cdigo de P
procedure P(in out A: int) var L: int begin L:= X A := A * L end

Ejemplo 2 Cdigo de P
0 1
procedure P(in out A: int) var L: int begin L:= X A := A * L end

X Int Offset: 0 P Procedimiento A Int Offset: 3 L Int Offset: 4

X Int Offset: 0 P Procedimiento A Int Offset: 3 L Int Offset: 4

0 1

Codigo de P 15 SET fp(0)+4, D[fp(1)+0] 16 SET D[0]+3, D[fp(0)+3] * D[fp(0)+4] 17 SET D[D[0]1], D[fp(0)+off A] 18 19 20 21 22 23

Codigo de P 15 SET fp(0)+4, D[fp(1)+0] 16 SET D[0]+3, D[fp(0)+3] * D[fp(0)+4] 17 SET D[D[0]1], D[fp(0)+3] 18 SET 1, D[0] 19 SET 0, D[D[0]+1] 20 JUMP D[D[1]] 21 22 23

Copia el valor del parmetro por valorresultado

Actualizamos Actual, Libre y luego saltamos a la direccin indicada por el puntero de retorno

Ejemplo 2
Program dos var X: int procedure P(in out A: int) var L: int begin L := X A := A * L end begin X := 50; P(X) end
Codigo de Dos 1 SET 0,2 2 SET 1,D[0] + 1 3 SET D[0], 50 4 SET D[1], D[0] + offset X 5 SET 1, D[1] + 1 6 SET D[1], 13 7 SET D[1] + 1, D[0] 8 SET D[1] + 2, fp(0) 9 SET D[1] + 3, D[D[0]] 10 SET 0, D[1] 11 SET 1, D[0] + 5 12 JUMP 15 13 SET D[1], D[1]1 14 HALT Codigo de P 15 SET fp(0)+4, D[fp(1)+0] 16 SET fp(0)+3,D[fp(0)+3] * D[fp(0)+4] 17 SET D[D[0]1], D[fp(0)+3] 18 SET 1, D[0] 19 SET 0, D[D[0]+1] 20 JUMP D[D[1]]

Ejemplo 2
Inicializa Actual y Program dos Libre var X: int procedure P(in out A: int) X:=50 var L: int begin L := X A := A * L Llamada end begin a P(X) X := 50; P(X) end L := X A:= A * L Retorno de P
Codigo de Dos 1 SET 0,2 2 SET 1,D[0] + 1 3 SET D[0], 50 4 SET D[1], fp(0) + 0 5 SET 1, D[1] + 1 6 SET D[1], 13 7 SET D[1] + 1, D[0] 8 SET D[1] + 2, fp(0) 9 SET D[1] + 3, D[D[0]] 10 SET 0, D[1] 11 SET 1, D[0] + 5 12 JUMP 15 13 SET D[1], D[1]1 14 HALT Codigo de P 15 SET fp(0)+4, D[fp(1)+0] 16 SET fp(0)+3,D[fp(0)+3] * D[fp(0)+4] 17 SET D[D[0]1], D[fp(0)+3] 18 SET 1, D[0] 19 SET 0, D[D[0]+1] 20 JUMP D[D[1]]

FIN

También podría gustarte