Estructura de Lenguajes de Programación

Anuncio
ESTRUCTURA DE LOS LENGUAJES DE PROGRAMACIÓN
DEFINICION DE LOS LENGUAJES
SINTAXIS
(BNF + EBNF + DIAGRAMAS DE SINTAXIS)
+
SEMÁNTICA
OPERACIONAL (APROXIMACIÓN UTULIZADA AQUÍ)
FORMAL (A TRAVÉS DE MECANÍSMOS RIGUROSOS Y EXACTOS)
SEMANTICA OPERACIONAL: Se describe el significado de cada construcción del lenguaje en
términos de las operaciones correspondientes en un proceso abstracto.
–
–
SIMPLESEM
PUNTERO DE INSTRUCCIONES
MEMORIA (DE DATOS – DE CÓDIGO)
ip
code memory
(C)
data memory
(D)
Explicar la semántica de un comando explicando las operaciones correspondientes en SIMPLSEM
(La SEMÁNTICAS o FUNCIONAMIENTOS de SIMPLESEM YA ES CONOCIDA)
COMPORTAMIENTO DE UN LENGUAJE
CONVERSIÓN ENTRE LENGUAJES
DE ALTO NIVEL
--a-->
DE MAQUINA
que interpreta
que interpreta
un programador
la Computadora
ALTERNATIVAS
INTERPRETACIÓN: Ejecución paso a paso de cada instrucción de un programa.
CICLO: LECTURA – DECODIFICACIÓN – EJECUCUIÓN
Menor velocidad – Relativo aprovechamiento de memoria (solo se carga una instrucción por vez)
COMPILACION: Conversión completa de un programa antes de su ejecución.
FASES : COMPILACIÓN – ENSAMBLADOR
LINKEADO – CARGADO – EJECUCIÓN
Mayor velocidad – Todo el programa debe cargarse en memoria para su ejecución.
LIGADURA (BINDIG)
Programas --> tratan con entidades
(funciones, variables, sentencia)
--> poseen atributos
(nombre, tipo, parámetro)
BINDING: proceso de especificación de la naturaleza exacta de cada atributo
Ejemplos:
Ligadura
Proceso asociado
entre una variable y su nombre
Identificación
entre una variable y su tipo
Determinación de tipo
Entre un programa y su espacio de
almacenamiento
Reserva de espacio
Entre un subprograma y sus
parámetros
Pasaje de parámetros
VARIABLES
Abstracción de la noción de celda de memoria de una computadora. Caracterizada por:
NOMBRE: Usada para identificar y referirse a una variables.
ÁMBITO: Es el rango de instrucciones de un programa sobre el cual una variable es conocida y
manipulada. Fuera de él la variable es INVISIBLE.
TIEMPO DE VIDA: Es el intervalo de tiempo en el que un espacio de almacenamiento (memoria)
es asociado con una variable. Este proceso es llamado ALOCACION.
VALOR: Es el contenido del espacio de memoria asignado a la variable. Está representado en forma
codificada (cadena de bits). Esta codificación se interpretará de acuerdo al tipo de la variable.
TIPO: Es la especificación de la clase de valores que puede ser asociada con una variable, junto con
el conjunto de operaciones que pueden ser utilizadas para crear, manipular y acceder a tales valores.
TIPOS PREDEFINIDOS
BOOLEAN:
● Valores posibles (TRUE, FALSE)
● Operaciones (ANDO, OR, NOT)
TIPOS DEFINIDOS POR EL USUARIO
Type T = array[1...10] of BOOLEAN
TIPOS ABSTRACTO DE DATOS
TYPE counter
DEFINITION
integer range 0...59;
OPERATIONS
up(counter)
down(counter)
zero(counter)
END counter;
LIGADURA DINAMICA DE TIPOS
(APL, SNOBOL)
A <- 5
-> A
A <- 1 2 51 0
Variable simple
Etiqueta
Arreglo unidimensional
UNIDADES DE PROGRAMA
Descomposición de un programa:
1. Componentes de una unidad de programa.
● Segmento de código: Fijo, se almacena en C[]
● Registro de activación: Variable, contiene toda la información necesaria para la
ejecución de una unidad de programa. Se almacena en D[].
○
Variables locales y no locales
○ Información de binding
○ Punto de retorno
2. Activación de una unidad de programa.
○ Una única instancia por unidad.
○ Más de una instancia por unidad (lenguajes recursivos)
ESTRUCTURA DE LOS LP EN TIEMPO DE EJECUCION
División de los LP de acuerdo a sus requerimientos de memoria
Estáticos: Con requerimientos de memoria predefinidos. (FORTRAN, COBOL)
Basados en pila: Con requerimientos de memoria predeterminados, y con una estrategia de pila.
(ALGOL 60)
Dinámicos: Con requerimientos de memoria impredecibles. (LIST, PROLOG, APL)
Híbridos: Basado en pila + Dinámico. (PASCAL, C, ADA)
Ejemplo de cada clasificación de lenguajes:
1) Estructura de lenguaje FORTRAN (Estático)
Almacenamiento de un programa FORTRAN en memoria (todos los segmentos de código
juntos en C[] y todos los registros de activación en D[])
ip
code segmento for
unit 1
Activation Record
for Global Data
code segmento for
unit 2
Activation Record
for unit 1
code segmento for
unit 3
Activation Record
for unit 2
:
:
:
:
code segmento for
unit n
Activation Record
for unit n
code memory
(C)
data memory
(D)
Constructores descriptos: GOTO – CALL – RETURN (Transferencia de control)
Sentencia
Ligadura
Linkeado
GOTO
ip := & c[i,j]
ip := j
CALL P
d[P,0] := ip + 2
ip := &c[P,0]
D[m] := ip + 2
ip := n
RETURN
ip := d[P,0]
ip := D[m]
Descripción en términos de funcionamiento de SIMPLESEM
D(3) = ip + 2
ip = 5
0
ip
main
ip = 3
common
I
Puntero de retorno
main
J
noop
halt
Puntero de Retorno
X
K
D(4) = 5
X
J
D(0) = 6
D(5) = D(0) + D(4)
ip = D(3)
halt
Memoria de
código
Memoria de
Datos
common
D(3) = ip + 2
ip = 5
5
ip
main
I
Puntero de retorno
main
ip = 3
noop
J
2
X
halt
K
D(4) = 5
X
Puntero de Retorno
J
D(0) = 6
D(5) = D(0) + D(4)
ip = D(3)
halt
Memoria de
Datos
Memoria de
código
common
D(3) = ip + 2
ip = 5
7
ip
main
6
main
ip = 3
noop
X
halt
J
2
Puntero de Retorno
5
K
D(4) = 5
X
J
D(0) = 6
D(5) = D(0) + D(4)
ip = D(3)
halt
Memoria de
Datos
Memoria de
código
PROGRAMA
LIGADURA
LINKEADO
INTEGER I, J
I < - > d[COMMON , 0]
I < - > D[0]
COMMON I
J < - > d[MAIN , 1]
J < - > D[2]
CALL X
10 < - > c[MAIN, 3]
X < - > C[3]
GOTO 10
X < - > c[X, 0]
X < - > C[5]
SUBRUTINE X
I < - > d[COMMON, 0]
I < - > D[0]
INTEGER K, J
K < - > d[X, 1]
K < - > D[4]
K=5
J < - > d[X, 2]
J < - > D[5]
10 CONTINUE
END
I=6
J=I+K
RETURN
END
I
Puntero de retorno
common
D(3) = ip + 2
ip = 5
2
ip
main
6
main
ip = 3
J
noop
X
halt
D(4) = 5
X
I
Puntero de retorno
2
Puntero de Retorno
5
K
11
J
D(0) = 6
D(5) = D(0) + D(4)
ip = D(3)
halt
Memoria de
Datos
Memoria de
código
2) Estructura del lenguaje ALGOL (Basado en Pila)
unit A
unit B
unit C
unit D
A
end D
end C
end B
unit E
B
E
C
F
unit F
end F
unit G
end E
end G
end A
Unidades de ejecución
Problemas básicos
--->
Disjuntas
--->
Anidadas
--->
Recursividad
--->
Variables dinámicas
Type T = array [m, n] of real
D
G
VENTAJA BÁSICA DE UTLIZAR UNA ESTRUCTURA DE PILA:
¡Cada registro de activación que se ejecuta se carga en memoria, y se deja libre ese espacio al
finalizar su ejecución!
1)
Agregar en el registro de activación enlaces dinámicos (además del punto de retorno)
2)
Agregar dos punteros mas a SIMPLESEM
2.1) free: siguiente dirección libre de memoria
2.2) current: apunta al inicio del registro de activación actual
CALL B
--->
D[free] := ip + 5
D[free + 1] := current
current := free
free := free + S (s es el tamaño del RA)
ip := n
RETURN
--->
free := current
Current := D[current + 1]
Ip := D[free]
Ejemplo: Sea la siguiente secuencia de llamadas de rutina
F ---> G ---> F ---> F ---> E ---> A
Generara la siguiente secuencia en SIMPLESEM
Dynamic Links
A
E
F
G
F
G
Current
F
Free
3)Estructura de los lenguajes dinámicos
(APL, SNOBOL, LISP)
CONCEPCIÓN: Lenguajes con reglas dinámicas
-
Alocación
-
Ligadura de tipo
-
Ligadura de ámbito
IMPLEMENTACIÓN: Almacenamiento de los registros de activación en una pila y enlace de los
mismos a través de ENLACES DINÁMICOS.
ESTRUCTURA DE UN PROGRAMA APL
.
..
Main
Prgram
Z <-- 0
x <-- 5
Y <-- 7
SUB 2
Z <-- FUN Y
.
.
.
.
.
.
.
SUB
Subprogram
SUB
I:Y
...X...
...Y...
Z <-- FUN Y
.
.
.
.
.
.
.
R <-- FUN N;X
Function
subprogram
FUN
...X...
...Y...
.
.
.
.
IMPLEMENTACION EN SIMPLESEM DEL PROGRAMA EN APL
(Falta en el apunto......no es mi culpa!!!!, preguntar a los prfesores de la catedra en el peor de los
casos)
PASAJE DE PARÁMETROS
PASAJE DE --->
--->
VARIABLES
SUBPROGRAMAS
PASAJE DE VARAIBLES COMO PARÁMETROS
subprogram S(F1, F2,...,FN)
Fi = Parámetros formales
...
end S
call S(A1, A2, ..., AN)
Ai = Parámetros actuales
Ligadura
Parámetros formales ↔ actuales
Alternativas de llamadas
1- Por referencia: La unidád llamante pasa a la invocadora una copia de las direcciones de los
parámetros actuales
→ Los parámetros actuales pueden modificase
→ Se comparte un mismo espacio de almacenamiento
2- Por copia: La undad llamante pasa una copia del valor de los parámetros actuales a la unidad
invocada
→ No se comparte espacio de almacenamiento
2.1 – Por valor: La copia es utilizada para inciliazar las variables locales de la unidad
invocada
2.2 – Por resultado: No se inicilizan las variables locales, pero al finalizar la ejecución, su
valor se copia en los parámetros actuales
→ Se modifica el valor de los parámetros actuales
2.4 – Por valor – resultado: Combina las dos anteriores
3 – Por nombre: Cada ocurrencia de los parámetros formales es remplazada textualmente por los
parámtros actuales
EJEMPLO
procedure swap(a, b : integer);
var temp : integer;
begin temp := a;
a := b;
b := temp;
end swap;
La llamada a swap (i, a[i]) puede producir la secuencia errónea siguiente:
temp := i;
i := a[i];
a[i] := temp;
PASAJE DE SUBPROGRAMA COMO PARÁMETROS:
Útil cuando se desea transefir un comportamiento específico a una unidad de prográma sin que sea
necesario que ésta conozca el código que produce ese comportamiento.
Ejemplo: Un subprograma que evalúa una función de una variable en un intervalo; el subprograma
no necesita conocer el comportamiento de la función, solo necesita utilizar su resultado.
Programa con procedimiento como parámetro
procedure main...
var u, v: integer;
procedure a...
var y : integer;
. . .
end a;
procedure b (procedure x. ...
var u,v,y: integer;
procedure c ...
. . .
Descargar