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 ... . . .