ESTRUCTURA DE LOS LENGUAES DE PROGRAMACIÓN DEFINICION DE LOS LENGUAES SINTAIS (BNF + EBNF + DIAGRAMAS DE SINTAIS) + SEMÁNTICA OPERACIONAL (APROIMACIÓN UTULIZADA AQUÍ) FORMAL (A TRAVÉS DE MECANÍSMOS RIGUROSOS Y EACTOS) 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) 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 LENGUAE CONVERSIÓN ENTRE LENGUAES DE ALTO NIVEL --a--> DE MAQUINA que interpreta que interpreta un programador la Computadora ALTERNATIVAS code memory (C) data memory (D) INTERPRETACIÓN: Ejecución paso a paso de cada instrucción de un programa CICLO: LECTURA DECODIFICACIÓN EECUCUIÓ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 EECUCIÓ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, to, parámetro) BINDING: proceso de especificación de la naturaleza exacta de cada atributo Ejemplos: Ligadura entre una variable y su nombre entre una variable y su to Entre un programa y su espacio de almacenamiento Entre un subprograma y sus parámetros Proceso asociado Identificación Determinación de to Reserva de espacio 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 manulada 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 to 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, manular y acceder a tales valores TIPOS PREDEFINIDOS BOOLEAN: Valores posibles (TRUE, FALSE) Operaciones (ANDO, OR, NOT) Type T = array[110] of BOOLEAN TYPE counter DEFINITION integer range 059; OPERATIONS up(counter) TIPOS DEFINIDOS POR EL USUARIO TIPOS ABSTRACTO DE DATOS
down(counter) zero(counter) END counter; A <- 5 Variable simple -> A Etiqueta A <- 1 2 51 0 Arreglo unidimensional LIGADURA DINAMICA DE TIPOS (APL, SNOBOL) 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 EECUCION 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[]) code segmento for unit 1 code segmento for unit 2 code segmento for unit 3 : : code segmento for unit n code memory (C) Activation Record for Global Data Activation Record for unit 1 Activation Record for unit 2 : : Activation Record for unit n data memory (D) Constructores descrtos: GOTO CALL RETURN (Transferencia de control) Sentencia Ligadura Linkeado GOTO := & c[i,j] := j CALL P d[p,0] := + 2 := &c[p,0] D[m] := + 2 := n RETURN := d[p,0] := D[m] Descrción en términos de funcionamiento de SIMPLESEM 0 D(3) = + 2 = 5 = 3 noop common I Puntero de retorno Puntero de Retorno K D(4) = 5 D(0) = 6 D(5) = D(0) + D(4) = D(3) código Datos
5 D(3) = + 2 = 5 = 3 noop common 2 I Puntero de retorno Puntero de Retorno K D(4) = 5 D(0) = 6 D(5) = D(0) + D(4) = D(3) código Datos 7 D(3) = + 2 = 5 = 3 noop common 6 2 5 I Puntero de retorno Puntero de Retorno K D(4) = 5 D(0) = 6 D(5) = D(0) + D(4) = D(3) código Datos PROGRAMA LIGADURA LINKEADO INTEGER I, I < - > d[common, 0] I < - > D[0] COMMON I < - > d[main, 1] < - > D[2] CALL 10 < - > c[main, 3] < - > C[3] GOTO 10 < - > c[, 0] < - > C[5] 10 CONTINUE END SUBRUTINE I < - > d[common, 0] I < - > D[0] INTEGER K, K < - > d[, 1] K < - > D[4] K = 5 < - > d[, 2] < - > D[5] I = 6 = I + K RETURN END
2 D(3) = + 2 = 5 = 3 noop common 6 2 5 I Puntero de retorno Puntero de Retorno K D(4) = 5 11 D(0) = 6 D(5) = D(0) + D(4) = D(3) código Datos 2) Estructura del lenguaje ALGOL (Basado en Pila) unit A unit B unit C unit D end D A end B end C B E unit E unit F C F G end F end A end E unit G end G D Unidades de ejecución ---> Disjuntas ---> Anidadas Problemas básicos ---> Recursividad ---> Variables dinámicas Type T = array [m, n] of real
VENTAA 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 21) free: siguiente dirección libre de memoria 22) current: apunta al inicio del registro de activación actual CALL B ---> D[free] := + 5 D[free + 1] := current current := free free := free + S (s es el tamaño del RA) := 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 F Current Free
3)Estructura de los lenguajes dinámicos (APL, SNOBOL, LISP) CONCEPCIÓN: Lenguajes con reglas dinámicas - Alocación - Ligadura de to - 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 Subprogram SUB ṢUB I : Y Y Z <-- FUN Y Function subprogram FUN Ṛ <-- FUN N; Y
IMPLEMENTACION EN SIMPLESEM DEL PROGRAMA EN APL (Falta en el apuntono es mi culpa!!!!, preguntar a los prfesores de la catedra en el peor de los casos) PASAE DE PARÁMETROS PASAE DE ---> VARIABLES ---> SUBPROGRAMAS PASAE 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 21 Por valor: La copia es utilizada para inciliazar las variables locales de la unidad invocada 22 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 24 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 EEMPLO 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; PASAE 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 var u, v: integer; procedure a var y : integer; end a; procedure b (procedure x var u,v,y: integer; procedure c