Teoria LyC_1

54
- 1 - Lenguaje de Programacion: Es una notación formal para describir algoritmos que se pueden ejecutar una computadora. Tiene tres componentes: PRAGMÁTICA, SINTAXIS y SEMÁNTICA. Pragmática: Son los problemas de construcción, todo lo hace al entorno, implementación, velocidad, espacio, optimización. Es el estudio de los lenguajes que se ocupan de los problemas prácticos. Imperativo o Estructurado: C Pascal Basic Cobol Orientado a Objetos: smalltack Funcional: Miranda Lógico: Prolog Sintaxis: Estudia “como se escribe”. Es decir, definen como las sentencias pueden formarse con una secuencia de símbolos. Utilizando estas reglas, puede determinarse si una sentencia es válida o no. Ejemplo 1: en el lenguaje las variables empiezan con una letra y pueden seguir con letras y números. Ejemplo 2: los verbos están entre el sujeto y el predicado. Ejemplo 3: cómo se escribe una iteración. Semántica: Estudia “que significa”. Es decir, definen el significado de la sentencia y no de cómo se escribe. Por ejemplo: En Pascal la declaración: var s: set of (red, while, blue) hace que se reserve espacio para una variable llamada “s”. El valor que esta variable puede contener, esta limitado a los valores red, white y blue. Sintaxis Reglas Léxicas: El conjunto de caracteres que constituyen el alfabeto del lenguaje y la manera de cómo se pueden combinar los caracteres para formar símbolos (tokens) válidos. Ejemplo 1: controlan la ortografía. Ejemplo 2: PASCAL considera el uso de minúsculas y mayúsculas de manera indistinta. En cambio C, las considera distintas. Reglas Gramaticales o sintácticas: Como se escribe una sentencia, un programa o una parte del mismo. Alfabeto: conjunto de caracteres que reconoce un lenguaje de programación. Elementos del lenguaje: secuencia de los símbolos del alfabeto que tienen un significado sencillo. Ejemplos: palabra reservada, variables, etc. Sentencias o programas: métodos, procedimientos, funciones. ¿Cuales son los símbolos terminales de las reglas sintacticas y como se generan? Los terminales son los elementos del lenguaje, estos se generan por las reglas léxicas. BNF: Es un metalenguaje. Que nos permite tener una definición compacta y clara de la sintaxis de un lenguaje. Nace con Algol 60. Metalenguaje es un lenguaje que es usado para describir otros lenguajes. No Terminales: Las “cosas que se definen” <exp><term>. Son entidades linguísticas compuestas por un conjunto de símbolos, determinodos por las las relgas de sintaxis. Los no terminales se encuentran del lado izquierdo y se definen del lado derecho. El símbolo de comienzo es un no terminal. Terminales: Las “cosas que no se definen” (números, letras). Deben ser símbolos válidos que reconoce el lenguaje. Limitaciones del BNF: No se pueden representar lenguajes naturales. No se puede expresar cotas máximas y mínimas para números o longitudes. Ejemplo: Si quisiera definir que las constantes esten estre 2.256.256 y 2.256.256, tendría que generar una cantidad excesiva de reglas . Conjunto de no terminales de las reglas léxicas: Son las constantes, palabras reservadas, variables, etc. Estos son no terminales ya que se los puede expresar o definir en base al alfabeto del programa que serian los elementos terminales. Semántica Alfabeto Elementos del lenguaje Sentencias o programas Reglas léxicas Reglas sintácticas

description

Lenguajes y compiladores

Transcript of Teoria LyC_1

  • - 1 -

    Lenguaje de Programacion: Es una notacin formal para describir algoritmos que se pueden ejecutar una computadora. Tiene tres componentes: PRAGMTICA, SINTAXIS y SEMNTICA. Pragmtica: Son los problemas de construccin, todo lo hace al entorno, implementacin, velocidad, espacio, optimizacin. Es el estudio de los lenguajes que se ocupan de los problemas prcticos.

    Imperativo o Estructurado: C Pascal Basic Cobol Orientado a Objetos: smalltack Funcional: Miranda Lgico: Prolog

    Sintaxis: Estudia como se escribe. Es decir, definen como las sentencias pueden formarse con una secuencia de smbolos. Utilizando estas reglas, puede determinarse si una sentencia es vlida o no.

    Ejemplo 1: en el lenguaje las variables empiezan con una letra y pueden seguir con letras y nmeros. Ejemplo 2: los verbos estn entre el sujeto y el predicado. Ejemplo 3: cmo se escribe una iteracin. Semntica: Estudia que significa. Es decir, definen el significado de la sentencia y no de cmo se escribe. Por ejemplo: En Pascal la declaracin: var s: set of (red, while, blue) hace que se reserve espacio para una variable llamada s. El valor que esta variable puede contener, esta limitado a los valores red, white y blue.

    Sintaxis

    Reglas Lxicas: El conjunto de caracteres que constituyen el alfabeto del lenguaje y la manera de

    cmo se pueden combinar los caracteres para formar smbolos (tokens) vlidos. Ejemplo 1:

    controlan la ortografa. Ejemplo 2: PASCAL considera el uso de minsculas y maysculas de manera

    indistinta. En cambio C, las considera distintas. Reglas Gramaticales o sintcticas: Como se escribe una sentencia, un programa o una parte del

    mismo. Alfabeto: conjunto de caracteres que reconoce un lenguaje de programacin. Elementos del lenguaje: secuencia de los smbolos del alfabeto que tienen un significado sencillo. Ejemplos: palabra reservada, variables, etc. Sentencias o programas: mtodos, procedimientos, funciones.

    Cuales son los smbolos terminales de las reglas sintacticas y como se generan? Los terminales son los elementos del lenguaje, estos se generan por las reglas lxicas. BNF: Es un metalenguaje. Que nos permite tener una definicin compacta y clara de la sintaxis de un lenguaje. Nace con Algol 60. Metalenguaje es un lenguaje que es usado para describir otros lenguajes.

    No Terminales: Las cosas que se definen . Son entidades lingusticas compuestas

    por un conjunto de smbolos, determinodos por las las relgas de sintaxis. Los no terminales se encuentran del lado izquierdo y se definen del lado derecho. El smbolo de comienzo es un no terminal.

    Terminales: Las cosas que no se definen (nmeros, letras). Deben ser smbolos vlidos que reconoce el lenguaje.

    Limitaciones del BNF: No se pueden representar lenguajes naturales. No se puede expresar cotas mximas y mnimas para nmeros o longitudes. Ejemplo: Si quisiera definir que las constantes esten estre 2.256.256 y 2.256.256, tendra que generar una cantidad excesiva de reglas . Conjunto de no terminales de las reglas lxicas: Son las constantes, palabras reservadas, variables, etc. Estos son no terminales ya que se los puede expresar o definir en base al alfabeto del programa que serian los elementos terminales.

    Semntica

    Alfabeto Elementos del

    lenguaje Sentencias o programas

    Reglas lxicas Reglas sintcticas

  • - 2 -

    Binding (ligadura o atadura): Es el momento preciso en que se conoce una propiedad (tipo, valor, alcance, almacenamiento) de un elemento (variable, constante, funcin, parmetro) de un lenguaje. La informacin del binding se mantine en el descriptor.

    Esttico: Cuando no cambia durante la ejecucin. Conozco la propiedad antes de ejecutar el programa. Ejemplo: int x (va a ser una variable entera durante toda la ejecucin).

    Dinmico: La propiedad se conoce en tiempo de ejecucin y puede ser cambiado, de acuerdo a las

    reglas del lenguaje.

    Variables

    Caractristicas de las variables: Son el nombre, tiempo de vida, valor, tipo alcance, almacenamiento.

    Binding de variables Esttico Dinmico

    Valor Constantes simblicas Casi todas las variables

    Tipo Mayora (FORTRAN, ALGOL 60, COBOL, Pascal, ALGOL 68, SIMULA 67, CLU y Ada)

    APL, LISP y SNOBOL4.

    Alcance Mayora (Fortran y Cobol) BASIC, APL, LISP y SNOBOL4.

    Almacenamiento Fortran, Cobol Mayora

    Nombre: El nombre es usado para identificar y referirse a las variables. Algunos lenguajes permiten que las variables no tengan nombres, llamadas variables annimas. . Los punteros son el medio principal para acceder a variables annimas. Tiempo de vida: Es el intervalo de tiempo en el cual un rea de almacenamiento se asocia a la variable. Este rea es usada para mantener el valor de la variable. Valor: El valor se representa codificado. El cdigo de representacin se interpreta de acuerdo al tipo de la variable. El valor puede ser accedido por referencia (puntero) o por un path. Cul es el valor inicial de una variable? La mayora de los lenguajes ignoran esto y toman como valor inicial los bits que estaban en memoria, otros proveen un sistema de inicializacin. Una variable solo se puede usar si ya tiene valor.

    Binding Dinamica: El valor puede ser modificado por una operacin de asignacin. Binding Congelado (Estatico): Constante simblica. Mantienen un valor constante.

    Ejemplo en Pascal: const pi =3.1416

    Ejemplo en ALGOL 68: real pi=3.1416 Diferencia entre Pascal y Algol 68: En Pascal el valor es un nmero o un string de caracteres, y es posible establecer el binding en tiempo de traduccin. El traductor puede legalmente sustituir el valor de la constante por su nombre simblico en el programa. En Algol 68 el valor puede ser dado como una expresin que involucre otras variables y constantes: por lo tanto el binding puede ser solamente establecido en tiempo de ejecucin, cuando la variable sea creada.

    Tipo: Es una especificacin de la clase de valores que pueden ser asociados con la variable, junto con las operaciones que pueden ser legalmente usadas para crear, acceder y modificar tales valores. En algunos lenguajes el programador puede definir tipos nuevos.

    Binding Esttico: El tipo es generalmente especificado por una declaracin de variables. los lenguajes con binding esttico estn orientados a la traduccin.

    Ejemplo, en Pascal : var x,y : integer;

    z : boolean; Ejemplo, en FORTRAN la declaracin de la variable ALPHA, seguida de una sentencia tal como ALPA=7.3, no sera detectada como un error; ya que se considera como la declaracin implcita de una nueva variable (ALPA). Diferencia entre Pascal y FORTRAN: FORTRAN tiene reglas por default para determinar el binding particular. Pero ambos asocian variables a tipos en tiempo de traduccin y el tiempo del binding es el mismo en los dos lenguajes.

    Binding Dinmico: Las variables no son declaradas, sino que su tipo es implcitamente determinado por el valor que actualmente contienen. Los lenguajes con binding dinmico estn orientados a la interpretacin. El binding dinmico provee gran flexibilidad en la creacin y manipulacin de las estructuras de datos. Los programas son difciles de leer. Ejemplo: Alcance dinmico en APL: A

  • - 3 -

    no puedo saber el tipo de una variable hasta el momento preciso en que se ejecuta.

    Almacenamiento: Es cuando la variable tiene un lugar fsico de memoria. Almacenamiento Dinmico = Almacenamiento Recursivo.

    Alocacin: accin por la cual se reserva un rea de almacenamiento para una variable. Alocacin Esttica: la alocacin es realizada antes del tiempo de ejecucin.

    Alocacin Dinmica: la alocacin se realiza en tiempo de ejecucin. Alcance: Ambiente, conjunto de sentencias que puede usar esa variable. Una variable es visible dentro de su mbito, e invisible fuera de el.

    Binding Esttico de mbito: Las variables tienen un lugar fsico durante la ejecucin, se usen o no, y se quedan en memoria hasta que el programa termine. Define el mbito de una variable en

    trminos de la estructura lxica de un programa. Lenguajes: Fortran y Cobol Binding Dinmico de mbito: define el mbito de una variable durante la ejecucin del

    programa. Lenguajes: BASIC, APL, LISP, y SNOBOL4. Ejemplo: Alcance dinmico en Basic: 30 INPUT C 40 IF C no se puede sumar; por lo tanto no s si se puede usar el valor de D en la sentencia 60. Solo cuando llego s si se puede usar o no.

    Clasificacin de Lenguajes

    Se clasifican de acuerdo a su comportamiento en tiempo de ejecucin

    Estticos Almacenamiento esttico. Son no recursivos. Asociados a compiladores. Ejemplo: Fortran y Cobol.

    Estos lenguajes garantizan que los requerimientos de memoria para cualquier programa pueden ser determinados antes del comienzo de la ejecucin del programa. Por lo tanto, toda la memoria necesaria puede ser ubicada antes de la ejecucin del programa. Estos lenguajes no permiten la recursin, porque podra requerir un nmero arbitrario de instancias y los requerimientos de memoria no pueden ser determinados en tiempo de compilacin (translation).

    Tipo Algol (Basados en Pila)

    Almacenamiento dinmico. Alcance esttico. Tipo esttico. Asociados a compiladores. Ejemplo: Algol 60, Algol 68, C, Pascal, Modula, Ada, etc. Estos lenguajes permiten programas ms potentes mientras los requerimientos de memoria no

    pueden ser calculados en tiempo de compilacin (translation). Sin embargo, el uso de memoria es predecible y sigue un mtodo del tipo LIFO .

    Dinmicos Almacenamiento dinmico. Alcance dinmico. Tipo dinmico. Son recursivos. Casi siempre relacionados a intrpretes.

    Ejemplo: LIST, PROLOG, APL, SNOBOL4.

    Clasificacin

    Almacenamiento Estatico

    Almacenamiento Dinamico

    Lenguajes Esttico

    Tipo y Alcance Esttico Lenguajes Tipo Algol

    Lenguajes Dinamico Tipo y Alcance Dinmico

  • - 4 -

    En estos lenguajes, como el nombre lo indica, no se puede predecir el uso de memoria. Estos lenguajes no pueden ser modificados por un SIMPLESEM (A Simple Abstract Semantic Processor un simple procesador semntico abstracto) basado en stack, porque permite al programador crear objetos en puntos arbitrarios durante la ejecucin del programa.Cuando mas dinmicos son los lenguajes mas difcil resulta hacer un compilador.

    Modelo de ejecucin

    Compilador: Traduce completamente del programa fuente al lenguaje mquina, y lo transforma en un ejecutable cuyo cdigo difiere del programa fuente. Lenguajes Estticos y Tipo Algol. Intrprete: Entiende la instruccin. El programa fuente queda exactamente igual. No encuentra los problemas de gramtica. Ejemplo: conserva el texto del programa fuente tal como lo escribi el programador. Dinmico casi siempre relacionados a intrpretes.

    Programa ejecutable

    datos

    Lenguajes Estticos

    No se usa

    Todo de tamao fijo

    Lenguajes Tipo Algol

    Programa ejecutable

    frontera variable

    datos Sin tener en cuenta memoria obtenida con malloc, new o dispose.

    No ocupan tamao definido o fijo.

    Durante la ejecucin de un programa puede ser que no entre en

    memoria.

    Lenguajes Dinmicos

    Intrprete

    Programa semitraducido

    Tabla de smbolos

    Datos

  • - 5 -

    Estructura de FORTRAN

    Un programa en FORTRAN se compone de un juego de unidades, main y subprogramas. Se asegura la cantidad de espacio que requiere cada variable local. Este se conoce tiempo de compilacin y no se puede cambiar en tiempo de ejecucin. Cada unidad se compila separadamente y se asocia con un registro de activacin antes de la ejecucin. Las variables se pueden crear antes del tiempo de ejecucin y su tiempo

    de vida se extiende sobre la ejecucin entera del programa. El alcance de una variable se limita a la unidad en la cual es declarada. Las unidades pueden tener variables globales. Estas pueden ser vistas como que corresponden a un registro de activacin global a todas las unidades del programa. Un programa debe pasar por ciertos pasos: En el primero (compilacin) cada unidad se traduce separadamente, sin conocer las otras unidades. Como resultado todo se traduce a lenguaje de mquina, excepto que todas las referencias a memoria sean

    compiladas de a pares (nombre de la unidad, offset). En el segundo paso (enlace linkeo) se enlazan las unidades. Como resultado todas las unidades se asignan a una posicin de memoria y todas las referencias a memoria se pasan a una direccin especifica. El tercer paso (carga - load) consiste en cargar el programa en memoria y setear el punto de comienzo del programa. Describimos la semntica en trminos de acciones especificas, lo que ms nos interesa es la transferencia

    de control entre unidades. La primera posicin de cada registro de activacin se reserva para un puntero de retorno. La otra informacin que se guarda son las variables locales (tambin debe contener informacin sobre los parmetros). Cada instruccin debe poder ser referenciada usando una pareja: el nombre de la unidad y el offset (Desplazamiento).

    En tiempo de enlace, como cada segmento se asigna a memoria, el par que refiere al registro de activacin o cdigo de segmento debe traducirse a un nmero que es la direccin de memoria. Como en el caso de FORTRAN, el tamao del registro de activacin y el OFFSET de cada variable local se conoce en tiempo de compilacin. El registro de activacin no puede enlazarse al segmento de cdigo de la unidad estticamente (antes de la ejecucin) porque quiz se tomen acciones recursivas. Debe ser enlazado para cada activacin.

    Estructura de Lenguaje Tipo ALGOL

    Administracin de memoria: Las variables tienen tamao fijo. Las variables de un procedimiento (funcin), se crean y desaparecen todas juntas. La caracterstica principal es la estructura de bloque. Bloques: Conjunto de sentencias con un delimitador de comienzo y de fin. La cual es usada para controlar el mbito de la variable.

    Disjuntos: No tienen porcin en comn. Las varibles locales de A no se pueden usar en B.

    Anidados: Un bloque est completamente encerrado dentro de la otro.

    Con nombre:

    Se los puede invocar en cualquier momento. No se ejecutan por secuencia, sino porque hay un llamado. S son recursivos. Las variables locales se crean y se inicializan cada vez que se llama al bloque. Ejemplo: Pascal

    Annimos:

    Solo se ejecutan por sucesin, si la secuencia de control los encentra. No pueden ser recursivos porque no se pueden ejecutar ellos mismos. Un nico nivel. Las variables locales se crean un sola vez, pero se inicializan cada vez que se utiliza el bloque. No tiene registro de activacin propio porque no tiene parmetros ni direccin de retorno.

    Ejemplo: C

    A

    B

    A

    B

  • - 6 -

    Ejecucin de Lenguaje Tipo ALGOL

    Cada vez que un bloque entra en ejecucin su registro de activacin se activa. Direccin de retorno del que lo llamo es lo que necesita conocer un bloque. Los parmetros se almacenan como si fueran variables locales del llamado, no del llamador. Las variables locales se crean implcitamente cuando la unidad se activa, y la cantidad de memoria

    requerida para mantener los valores de cada variable local se conoce en tiempo de compilacin. Registro de Activacin:

    Conjunto de datos necesitados para que un bloque se ejecute. El registro de activacin contiene variables, a veces parmetros o a veces direccin de retorno (si

    es el mian).

    Un bloque no puede tener un anidamiento parcial, tiene que estar si o si dentro de un bloque. Busca en el entorno local, luego en el global y as sucesivamente hasta encontrarla.

    Qu pasa en la memoria cuando ocurre esto?

    Cada vez que se comienza a usar un procedimiento se adquiere memoria para las variables del mismo.

    Cuando se empieza a ejecutar A, se crea un bloque de memoria que contiene las variables de A, y otras cosas. Este bloque de memoria recibe el nombre de registro de activacin (todo lo que necesita un procedimiento para poder ejecutarse).

    Cuando A->B, se crea un registro de activacin de B, y se guarda en una pila de registros de activacin y as

    sucesivamente. Las variables de A se ubican en el primer lugar disponible y las variables de B se ubican a continuacin de A. Cada vez que empieza a ejecutar un procedimiento se adquiere memoria para las variables del mismo. Cuando termina D las variables ya no requieren esa zona de memoria, quedando disponible dicha zona. Cuando termina E las variables ya no requieren esa zona de memoria, quedando disponible dicha zona. Si termina B, y luego el otro B, el B que queda en el ejecutable llama a D, (B->D), las variables de D se instalan arriba del 2 B. (zona gris).Por eso se llama asignacin dinmica.

    Dnde se almacenan los parmetros?, se almacenan como si fueran variables locales del llamado, no del llamador. Registros de activacin con tamao estticamente conocido: En este caso, las variables locales se crean implcitamente cuando la unidad se activa, y la cantidad de memoria requerida para mantener los valores de cada variable local se conoce en tiempo de traduccin. Pascal (si ignoramos los punteros) y C son dos lenguajes de esta clase.

    A B

    D

    CA

    E

    F

    G

    A->B->B->B->E->D

    Programa ejecutable

    variables de A ms

    otras cosas

    variables de B

    variables de E

    variables de D

    Pila de registro de

    activacin D variables de B

    variables de B

  • - 7 -

    Como en el caso de FORTRAN, el tamao del R.A. y el desplazamiento de cada variable local dentro de l, son conocidos en tiempo de traduccin. En tiempo de traduccin una variable puede ser ajustada slo a su desplazamiento dentro del R.A.; la asociacin del espacio fsico requiere conocimiento de la direccin del R.A., y esto slo puede ser hecho en tiempo de ejecucin. Las variables de sta clase se conocen como variables semiestticas. La reserva dinmica de los R.A. tiene dos consecuencias principales: permite la implementacin de activaciones recursivas de unidades y permite una utilizacin ms eficiente del almacenamiento de datos. Los RA deben contener suficiente informacin para identificar la instruccin a ser ejecutada y el RA que estar activo luego del retorno. Ahora tambin reservaremos la posicin en el desplazamiento 1 de cada RA para un puntero al RA de la unidad llamadora (este puntero se llama el enlace dinmico). La cadena de enlaces dinmicos en el RA actualmente activo se llama cadena dinmica y representa la anidacin dinmica de las activaciones de las unidades. Cuando una unidad U completa su instancia, su RA ya no se necesita ms. Las reglas de tiempo de vida especifican que cada instancia de U deben tener un nuevo RA. Las variables locales de U pueden ser visibles slo a unidades que estn anidadas dentro de U y activadas luego de la activacin de U. Estas unidades terminan sus activaciones antes de que lo haga la instancia actual de U. Registros de activacin cuyo tamao se conoce en la activacin de la unidad: En ALGOL, Ada, el tamao del RA y la posicin de cada variable local dentro del RA, se conocen siempre estticamente. Las variables son automticamente creadas cuando se activa la unidad, pero su tamao puede depender de valores que son conocidos slo en tiempo de ejecucin cuando se activa la unidad. Tal es el caso de los arreglos dinmicos: arreglos cuyos lmites se conocen en tiempo de ejecucin. Las variables de esta clase se llaman variables semidinmicas. Es que las variables locales no pueden ser asociadas a un desplazamiento constante dentro del RA en tiempo de traduccin; y el trabajo de asociacin queda retardado a tiempo de ejecucin. Debido a que el nmero de dimensiones del arreglo se conoce en tiempo de traduccin, el tamao del descriptor se conoce estticamente. Todos los accesos a variables semidinmicas se trasladan como referencias indirectas a travs del puntero en el descriptor, cuyo desplazamiento se determina estticamente. En tiempo de ejecucin, el RA se aloja en varias etapas. Primero, se aloja el almacenamiento requerido para las variables semiestticas y los descriptores de las variables semidinmicas. Cuando se encuentra la declaracin de una variable semidinmica, mediante las entradas de dimensin, se evala el tamao real de las variables semidinmicas y el RA se expande para incluir la variable. (Esta expansin es posible, porque siendo la unidad activa, el RA est en el tope del stack). Finalmente, el puntero en el descriptor se setea para apuntar al rea recin alojada. El descriptor contendr la direccin de comienzo de a, el lmite inferior, y el lmite superior en las posiciones m, m+1 y m+2 respectivamente. Registros de activacin con tamao variable dinmicamente: Los lenguajes de la familia ALGOL (excepto ALGOL 60) desde PL/I y Pascal hasta ALGOL 68 y ADA, tambin permiten al programador tratar con objetos de datos cuyo tamao puede variar durante la ejecucin del programa. Consecuentemente, la cantidad de memoria requerida por un RA no se conoce cuando se activa la unidad. Tales variables se conocen como variables dinmicas. Un buen ejemplo de variables dinmicas es el arreglo flexible provisto por ALGOL 68 y otros lenguajes. Un arreglo flexible es un arreglo cuyos lmites pueden variar durante la ejecucin del programa para acomodar el tamao del objeto que se le desea asignar. new(p) El tiempo de vida de un objeto creado de esta forma, a diferencia de las variables semiestticas y semidinmicas, no termina cuando se termina el bloque que contiene la sentencia de alocacin. Algunos lenguajes (PL/I) contienen sentencias para desalojar tales objetos explcitamente. Otros lenguajes (Pascal) establecen que los objetos viven siempre y cuando una referencia a ellos (un puntero) exista. Adems es posible crear varios objetos sin desalojar ninguno de ellos. Es fcil ver, por lo tanto, que tales objetos no pueden ser alojados en el stack. Resumiendo: las variables dinmicas significan objetos de datos cuyo tamao y/o nmero puede variar dinmicamente durante sus tiempos de vida. Este hecho prohbe la alocacin de estos objetos en el stack: ellos se alojan en un rea de memoria llamada heap. El trmino heap denota libertad de la connotacin de estrategia LIFO del stack). Por esta razn, las variables dinmicas son a menudo llamadas variables heap, contrariamente a las variables semiestticas y semidinmicas, las cuales son llamadas variables stack.

    Pilas de registro de activacin

    Variable esttica (Reg Base - Reg Cero): El programador no la conoce, es propia del lenguaje y apunta siempre a la base del registro de activacin corriente y se lo pone en un registro de la CPU. Sube y baja de

    acuerdo al tamao de la pila del registro de activacin. Ejemplo: A tiene las variables h,i,j. h:=i+j

  • - 8 -

    En Fortran (lenguaje esttico) Traduccin del nombre a una direccin fija. El dato est en un lugar conocido. MOV R1,2413 i Mueve el contenido de la direccin 2413 al registro 1. ADD R1,1490 j Suma el contenido de la direccin 1490 al registro 1. MOV 2FAO,R1 h Mueve el contenido del registro 1 en la direccin 2FAO.

    En Tipo Algol Traduccin del nombre a una distancia fija del comienzo al registro de activacin. El dato est en un lugar desconocido. MOV R1,[R0] 15 i i va a estar 15 lugares despus del registro de activacin. ADD R1,[R0] 40 j j va a estar 40 lugares despus del registro de activacin.

    MOV [R0] 9,R1 h h va a estar 9 lugares despus del registro de activacin. Cadena dinmica: Cada puntero apunta al inicio del procedimiento que lo llam, sirve para saber donde

    volver cuando un procedimiento termina. Cada registro de activacin tiene un puntero al registro que lo llam, la sucesin de punteros se llama cadena dinmica. La cadena dinmica permite que las variables se puedan utilizar sin importar donde estn. Cuando A->B se genera: ADD R0, tamao de A Cuando B->E se genera: ADD R0, tamao de B Cmo volvemos hacia atrs? Necesito el tamao del registro de activacin anterior o el comienzo. Se guarda en una direccin de A el comienzo de B. En cada bloque se guarda el comienzo del que est ms abajo en un lugar fijo dentro del casillero. MOV R0,[R0] 8

    Construccin de la cadena dinmica: A B C Suponiendo que el tamao de B se encuentra en la direccin 12 y el offset de la cadena dinmica es 8: Comienzo del procedimiento C: Para que el registro de activacin de C apunte a B. Sumo el tamao del registro actual a BP(registro cero) y lo tengo apuntando al comienzo del siguiente MOV BX, BP MOV AX, BP ADD AX, [BP]12 (tamao de B) MOV BP, AX MOV [BP]8, BX Final del procedimiento C: BP(registro cero) vuelve a tener la direccin del comienzo de B. MOV BP, [BP]8

    Cadena esttica: Conjunto de punteros donde cada uno apunta al registro de activacin del procedimiento que lo contiene en el rbol de anidamiento. Este tipo de estructura se usa para variables globales. No hay bsqueda porque no hay clave. Se accede siguiendo el puntero. (Pregunta de parcial).

    C

    B

    A B C BP

  • - 9 -

    Modelo de ejecucin A->B->B->C->D->E Las variables se buscan en tiempo de compilacin. Para buscar una variable se busca en un entorno local y luego en uno global y as hasta encontrarla, sino hay un error.

    El compilador en tiempo de ejecucin arma el rbol de anidamiento y entonces sabe donde est cada variable. Las variables se las busca en tiempo de compilacin.

    Construccin de la Cadena Esttica: La cadena esttica se utiliza para cuando se trabaja con variables globales. Si en un registro de activacin no estn las variables para resolver la instruccin entonces hay que buscarlas en los registros de activacin de los padres de ste. Esta cadena une cada registro de activacin con su padre. Para formar la cadena esttica el copilador forma el rbol de anidamiento de los registros de activacin y cuenta cuantos arcos se necesitan para llegar a una variable de uno de sus ancestros.

    Tambin el compilador guarda un offset que es la distancia de la base de cada registro de activacin a la posicin donde est la direccin del padre (cadena esttica).

    DCBA

    y

    x

    z

    E

    DE

    CD

    E

    BDE

    BDE

    AD

    E R0 (registro cero)

    Cada registro de activacin tiene un puntero que apunta a la base del registro de activacin que lo llam.

    Con este puntero no se donde estn

    las variables.

    Cadena esttica Cadena dinmica

    A esta secuencia de punteros se la conoce como cadena esttica, est asociada a los anidamientos y la cadena dinmica est asociada al orden

    BA

    CB

    A

    E x:=y+z

    Y es local

    x es variable global y est en C

    z es variable global y est en A

    x

    z

    A

  • - 10 -

    Ejemplo: El offset de X en un registro de activacin es 12, para Y es 4B y para Z es 20 Si se que se ejecuta x=z+y => z est 1 nivel atrs

    y est 2 niveles atrs x est 3 niveles atrs MOV BX, BP MOV BP, [BP]6 MOV AX, [BP]20 MOV BP, BX

    MOV BP, [BP]6 MOV BP, [BP]6 ADD AX, [BP]4B MOV BP, BX MOV BP, [BP]6 MOV BP, [BP]6

    MOV BP, [BP]6 MOV [BP]12, AX MOV BP, BX

    Variables

    Estticas: tienen tamao y lugar fijo en toda la ejecucin del programa. Semiestticas: tienen tamao fijo y lugar variable en distintas ejecuciones. Los limites (estticos) no

    varan no tienen porque esta en el R. A., los limites pueden estar en el cdigo. Las variables solo contienen datos. Pueden ser arreglos, punteros, estructuras, uniones. Ej: A[4]

    Para el acceso a las variables semiestticas, se requiere un offset a las variables semiestticas. Semidinmicas: tamao variable y lugar variable en distintas ejecuciones. Son siempre arreglos con limites variables. El tamao varia en el momento preciso que se crea el R. A. y no varia mas. Las variables contienen datos y los limites de los arreglos, que se los conoce como descriptores. Los limites (descriptores) son semiestticos no cambian de tamao pero si cambian de valor. En los registros de activacin se separan los limites (Descriptores) de los datos. Ej: A[i]

    B

    E

    D C

    A

    F

    G X=Z+Y

    Z

    Y

    X

    Variable

    Tamao Fijo

    Tamao Variable

    < > Ejecucin

    Semiestticas

    Lugar Variable

    < > Ejecucin Semidinamicas

    Dinamicas

    Tipo Variable

    Lugar Variable

    < > Ejecucin

    Lugar Fijo Estticas

    Tamao Variable

    Cualquier Momento Lugar Variable

    Superdinamicas

    var SE DATOS En tiempo de compilacin

    4,17,8,22 var SD DATOS En tiempo de ejecucin

    Descriptores Constantes

  • - 11 -

    El acceso a las variables semidinmicas requiere el acceso al descriptor para buscar el dato. La distancia al descriptor la conoce en tiempo compilacin, en tiempo de ejecucin se conocen los datos. Variables semidinmicas tienen ms flexibilidad y consumen mayor tiempo. Dinmicas: pueden cambiar de tamao en cualquier momento y tienen ubicacin variable.

    Annimas: Es el usuario el que se encarga de la administracin del HEAP, pide, devuelve memoria, y cambia su tamao cuando quiera. El usuario tiene un puntero a las variables dinmicas que no tienen nombre. En C o Pascal: malloc, new y dispose, free, delete.

    Con nombre: Es el lenguaje (RUNTIME PACKAGE) el que se encarga de asignar y liberar memoria en el HEAP. Aparecen en Algol.

    Las VD no se guardan en el registro de activacin, porque pueden cambiar de tamao en cualquier momento. Si las VD son con nombre tienen descriptores que estn en la pila, y los datos estn en el HEAP. Si las VD son annimas solo est el puntero el R A.

    Superdinmicas: Pueden cambiar de tamao en cualquier momento y tienen ubicacin variable. Tienen tipos variables (solo se sabe en tiempo de ejecucin). No se almacena ni la variable, ni su descriptor en el registro de activacin. No las soportan los lenguajes tipo pila como Algol, Pascal, C, C++. Existen solo en los lenguajes dinmicos.

    :

    DATOS VAR SD 2

    DATOS VAR SD 1

    :

    DESCRITOR VAR SD n

    DESCRITOR VAR SD 2

    DESCRITOR VAR SD 1

    VARIABLES SEMIESTTICAS

    puntero

    Tamao constante

    descriptor datos En VD

    Registro de Activacin

    Variable

    Descriptores de VD Datos

    En VD

    Lenguajes Tipo Algol

    Nombre Tipo Otras cosas Direccin de Datos

    Prog. Semitraducido

    Tabla de Smbolos (Punteros)

    En Algol, no importa el nombre porque se pisa al

    compilar

    HEAP

    ( Tabla de Smbolos )

  • - 12 -

    Qu tipos de variables usan los lenguajes orientados a la pila?y los dinmicos? Lenguajes orientados a la pila --- VAR semiestticas y semidinmicas. Descriptor de las Var Dinamicas. Lenguajes dinmicos ------------- VAR superdinmicas. Qu tipos de lenguajes poseen variables que pueden cambiar de tamao en tiempo de ejecucin? Los lenguajes dinmicos pueden tener variables que cambien de tamao en tiempo de ejecucin. Y lenguajes tipo algol si utilizan variables semidinmicas o dinmicas.

    Qu tipos de variables pueden cambiar de tamao en tiempo de ejecucin y dnde se almacenan? Las semidinmicas cambian de tamao solos cuando se crea el registro de activacin, es decir el comienzo de la ejecucin del bloque. Y se almacena en el R A como un descriptor mas el dato. Las las dinmicas pueden cambiar de tamao en cualquier momento de la ejecucin. Poseen un

    descriptor en el R A si son con nombre, y en caso de ser annimas existe solo un puntero en el R A. Y los datos se almacenan en el HEAP. Las superdinmicas (adems cambian el tipo) se almacena el puntero, el tipo, el nombre y otras cosas en la tabla de smbolos y los datos en el HEAP. Quin le otorga el espacio en memoria? En Algo el RUNTIME PACKAGE es el que otorga el espacio de memoria y Pascal el usuario. Dnde se alojan las variables tipo puntero? Por qu? Las variables de tipo puntero se almacenan en el registro de activacin, debido a que son variables semiestticas. Y se requiere un offset para el acceso a las variables semiestticas. Las VD annimas se guarda el puntero en RA y el dato en el HEAP, porque puede cambiar de tamao en cualquier momento. Porque se dice que las variables semidinmicas solo pueden ser arreglos o estructuras mas

    complejas. Son siempre arreglos (o estructuras mas complejas) con limites variables. Y estos limites (descriptores) son semiestticos no cambian de tamao pero si cambian de valor. Entonces las variables semidinmicas tienen tamao variable y lugar variable en distintas ejecuciones. Ej: A[i]

    Leng. Dinamicos, el nombre esta en la tabla smbolos. El nombre esta presente en tiempo de ejecucin.

    LISP, APL, SNOBOL4, PROLOG.

  • - 13 -

    Quin se encarga de asignar el espacio en memoria de las variables que se almacenan en el HEAP, para Pascal y Algol? En Algol el que se encarga de otorgar espacio en memoria es el RUNTIME PACKAGE. Y en Pascal el que se ocupa de asignar espacio es el usuario. Qu diferencia tienen las variables dinmicas de Pascal con las de Algol?Qu similitud?

    La diferencia es que Pascal tiene compatibilidad de tipo por nombre y Algol por estructura. La similitud es que tienen alcance y tipo esttico, cambian de tamao en tiempo de ejecucin. Almacenamiento dinmico, no ocupa un tamao fijo en memoria. En que casos el nombre de una variable est presente en tiempo de ejecucin? Cuando esta se trata de variables superdinmicas. Esto es as ya que existe una tabla de smbolos para

    mantener y administrar este tipo de variables en memoria. Pueden las variables semiestaticas poseer limites estaticos? Las variables semiestaticas tienen sus limites esttico, si no los tendra serian variables semidinamicas. Ejemplo: Variable semiestatica A[4] (los limites estn en el cdigo) - Variable semidinamica B[i].

    Donde se almacena los limites de los arreglos? Si hablamos de variables estticas los limites se almacenan en el cdigo. Y si hablamos de variables semiestaticas y semidimamicas los limites se almacenan en el R.A. Y tanto para los lenguajes que verifican limites como los que no verifican limites. Las semiestticas pueden almacenarse en el cdigo. Los limites de los arreglos estn en algn lugar de memoria en tiempo de ejecucin?El lenguaje verifica limites?

    El programa tiene los valores guardados en algn lugar de memoria, entonces el lenguaje verifica lmites. Si el lenguaje no verifica lmites, no lo guarda, despus lo interpreta. Si el lenguaje verifica limites, y hablamos de variables semidinmicas, el ejecutable necesita conocer todos los limites (porque puede cambiar el R.A.). Matriz (4 limites), array (2 limites). Si el lenguaje verifica limites, y hablamos de variables semiestticas, el ejecutable necesita conocer para Array 1 limite (limite inferior) y para Matriz 3 limites. Ej Z [7..45,9..22] - Por Filas (7,9,22) - Por Columna (7,45,9) Vemos la memoria como una matriz: integer q [4..22,8..17] q4,8 q4,9 .q4,17 q5,8 .q5,17 q [i,j]

    q22,8 .q22,17 la direccin de q [i,j] es igual a la direccin de q [4,8] por que por filas o por columnas siempre es el primero. Matriz organizada por filas

    direccin q [i,j] = direccin [4,8] + tamao de cada elemento x [(i-4) * (17-8+1) + (j-8)] cantidad de filas cantidad de elementos de cada fila cantidad de elementos que hay antes en la fila

    en tiempo de ejecucin necesito conocer el 4,8 y 17.

  • - 14 -

    Matriz organizada por columnas direccin q [i,j] = direccin [4,8] + tamao de cada elemento * [(j-8) * (22-4+1) + (i-4)] Necesito conocer los dos comienzos y 1 final (4,22 y 8). Por qu no existe garbage en los lenguajes dinamicos?

    En los lenguajes dinmicos, todos los datos estn referenciados por un smbolo en la tabla de smbolos. Toda zona de memoria que no est referenciada por un smbolo en la tabla de smbolos se considera libre para ser utilizado. Por esta razn no hay zona que contengan datos sin ser refenciados por la tabla de smbolos, por lo tanto no existe garbage. Lo que se considera como garbage en los lenguajes dinmicos es la fragmentacin, producida por la asignacin no contigua de memoria.

    Puede el MAIN en un lenguaje con variables semidinmicas tener un registro de activacin de diferente tamao en diferentes ejecuciones?

    No. MAIN es una palabra clave. No hay sentencias de asignacin en ejecucin. No hay programas fuera del MAIN. Puede haber variables fuera del MAIN, pero no tienen valor. Entonces, las variables semidinmicas tienen variables como parte de los lmites y tienen que ser globales

    y haber adquirido valor. Los bloques annimos de C {} no requieren un registro de activacin propio, pese a que tienen variables locales. Verdadero. Los bloques annimos no tienen nombre, por lo que no tienen parmetros, ni direccin de retorno. Por consecuencia, no pueden ser recursivos. No voy a tener nunca dos registros de activacin para un bloque annimo. No necesito registro de activacin propio, porque al no repetirse, puede estar en el registro de activacin de otro archivo .C. Esto hace al programa ms eficiente. Si tendra un registro de activacin por cada FOR o WHILE, ocupara ms lugar y tendra ms accesos a memoria. La mayora de los C no asignan registros de activacin por eficiencia. El tiempo de vida de una variable entera de un bloque de C {} no necesariamente coincide con su alcance.

    Verdadero, el tiempo de vida es mayor porque viven durante todo el tiempo de la funcin. La variable vive ms tiempo que el se puede usar. El tiempo de vida de una variable declarada en un programa en lenguaje Pascal, sin llamadas a procedimientos ni funciones, coincide siempre con su alcance. Verdadero, no tiene procedimientos ni funciones. El tiempo de vida no tiene nada que ver con el alcance.

    Teniendo en cuenta el alcance y el tiempo de vida, refleje la diferencia entre ambos en un programa escrito en C. Int main() void funcion() {funcion(); { static int a=0; funcion(); a++;

    return 0; } } La diferencia se muestra cuando termina la ejecucin de funcion(), ya que la variable estatica a sigue manteniendo su valor (su tiempo de vida). Pero es local a funcion(), su alcance termina cuando termina funcion(). Por lo tanto, no se puede ser accedida por el main(). Cuando se ejecuta a++ en la segunda llamada a funcion(). a va a valer 2. Ya que mantuvo su valor por ser esttica. Dado el siguiente fragmento del programa. Clasificar de acuerdo a su binding. Int a; char h[30]; int *c,*d,*I,*j; int **g; cin>>a;

    void procedim(int j) {c:=(int *) malloc (sizeof(int));

  • - 15 -

    char f[a]; int c[a][3]; int c[a][3] :={205,306,405,101,125,115}; d:=(int *) malloc (200); I:=(int *) malloc (100); }

    Tipo: De acuerdo a las operaciones del programa se puede decir que todas las variables tienen tipo estatico (no cambian durante la ejecucin). Alcance: Todas las variables son de alcance esttico ya que se sabe que instrucciones pueden hacer uso de cada una de ellas (tanto si son globales como locales). Valor: El valor de todas las variables es dinmico, es decir, se conoce en tiempo de ejecucin. Almacenamiento: Como el lenguaje permite variables semidinamicas f[a] el almacenamiento debe ser dinmico ya que las posiciones tienen que poder variar de un ejecucin a otra. Para el caso de los punteros (int *c, *d, *j, *i), el puntero es una variable semiestatica (est en la pila, no puede cambiar de tamao pero se de posicin de una ejecucin a otra) pero el bloque de memoria en el HEAP apuntado por el puntero. Qu implica el tipo esttico y el alcance esttico? Implica: Que las variables tienen una caracterstica razonablemente esttica.

    Que las variables son bastante conocidas. Tamao fijo. Las variables de un procedimiento o una funcin, se crean y desaparecen todas juntas. Aparecen en bloque. No son recursivos. Asociados a copilador.

    Una variable declarada en C C++ como static posee almacenamiento y alcance estticos. Verdadero, tiene alcance y es esttico. Si una variable definida en el interior de un bloque de C {} contiene una inicializacin, por ejemplo, int x=3; la misma se ejecuta cada vez que comienza el bloque.

    FALSO. Bloque annimo: La variable se crea una sola vez, pero se inicializa cada vez que se utiliza el bloque. Bloque con nombre: Se crea y se inicializa cada vez que se llama al bloque. Las inicializaciones en C solo se ejecutan cuando se crea el registro de activacin. FALSO. En los bloques annimos en C, las variables se crean una vez y se inicializan muchas veces.

    Si un lenguaje tiene variables dinmicas su RA puede cambiar de tamao. FALSO. La variables dinmicas no se guardan en el RA porque cambian de tamao en cualquier momento. En el RA se guarda el descriptor que apunta a la variable dinmica que esta almacenada en el HEAP. Si un lenguaje tiene variables semidinamicas su RA no cambia de tamao. FALSO. Puede cambiar el tamao de los datos pero el descriptor tiene tamao fijo.

    Los lenguajes tipo Algol no se pueden compilar. FALSO. Traduce completamente el programa fuente en lenguaje mquina y lo traduce en un ejecutable cuyo cdigo difiere del programa fuente. Los lenguajes Dinamicos no se pueden compilar.

    Verdadero. Estn relacionados a interprete. Entiende la instruccin pero el programa fuente queda exactamente igual como lo escribi el programador. No encuentra errores de gramtica. En que casos el puntero de la cadena dinmica apunta al mismo lugar que el puntero de la cadena esttica? Cuando cada padre llama a un hijo y este a otro y as sucesivamente. Es decir llama a alguien en forma local. Cmo se construye la cadena dinmica?

  • - 16 -

    Cada puntero apunta al inicio del procedimiento que lo llam. Para que se usa? Sirve para saber donde volver cuando un procedimiento termina. La cadena dinmica permite que las variables se puedan utilizar sin importar donde estn. Porque los lenguajes con alcance dinmicos necesitan un tabla de smbolos en tiempo de

    ejecucin. Los lenguajes con alcance dinmicos define el mbito de una variable de acuerdo a la ejecucin del programa. Dicha tabla tiene la informacin de las variables del programa, como nombre, tipo, y los punteros que apuntan al rea de datos. Explicar porque el uso de variables semidinmicas es ms lento que el uso de variables

    semiestticas. A las variables semidinmicas hay que acceder primero al descriptor, quien contiene los lmites y un puntero a la variable. Explicar porque el uso de variables globales de la pila es ms lento que el uso de variables locales.

    Porque el alcance de las variables locales es mas chico que el alcance de las variables globales. Es tambin para las variables estticas? Las variables semiestticas poseen lmites estticos

    Verdadero, los lmites son constante. Por lo tanto estos tienen tamao fijo y ubicacin fija.

    Pasaje de parmetros

    Es la transferencia de datos entre un mtodo invocado y un mtodo/procedimiento invocador. Tienen ventajas en trminos de legibilidad y modificabilidad. La mayora de los LP usan un mtodo posicional para asociar los parmetros actuales a los formales en las llamadas a los subprogramas. Tipos de parmetros:

    Formales: Son aquellos que se utilizan en el momento de definicin. Ejemplo:

    int pepe (int x,int y) variables locales de la funcin, aunque de alguna manera provienen de afuera.

    Reales: Datos del llamado que se entregan en cada ejecucin.

    Ejemplo: pepe (3,b) parmetros reales Sintaxis del pasaje de parmetros: Quin con quien? El pasaje de parmetros es la asociacin de los parmetros formales y reales. Por Posicin

    Completa Faltante

    Al final. En cualquier lado.

    Explcita: pepe (use 3 as b, use 4 as c). En ADA: pepe (3=>b, 4=>c) Annimas: no digo cuales van a ser los parmetros. int pepe (float x, ) printf (%s, ,%d,x,y) Tcnicas de pasaje de parmetros de asociacin (parmetros formales y reales) Por posicin: La misma cantidad de parmetros formales y reales. 1 pf con 1 pr, 2 pf con 2 pr Ejemplo: int pepe (int a, int b, int c);

    Sin faltantes. Pepe (2, 3, z) Faltantes al final. Pepe (2, 3 )

  • - 17 -

    Faltantes en cualquier lugar. Pepe (2, z) Pepe (3, z) Explcita: La asociacin se indica bien claramente. Ejemplo: pepe (use 3 as b, use 4 as c); //3 se asocia con b y 4 con c. Esta tcnica casi siempre ha sido opcional. En Ada la invocacin se hace as: pepe (3 => b, 4 => c) //Las comas ya no indican posicin sino que solo separan. pepe (4 => c, 3 => b) Annimas: Son aquellas en que no digo cuales van a ser los parmetros. Ejemplo: int pepe (float x, ) int printf (char * fint, ) pepe (7.2) pepe (7.3, b, 22, texto, ) se pueden poner muchos o ningn parmetro. printf (%s, %d, x,y); printf (%s,%d, x,y,z); //Solo imprime X e Y. Semntica del pasaje de parmetros: Como se asocia (no quien se asocia con quien) (LLAMADOR) A->B (LLAMADO)

    Referencia: B(x), existe un solo x y est en A (llamador), el parmetro real es el nico que existe, y el formal no

    existe, solo es otro nombre para x (alias o sinnimos). La unidad llamadora pasa a la unidad llamada la direccin del parmetro actual, se trata como una referencia a la posicin cuya direccin se pas. Estndar de Fortran. Pascal permite pasar valores por referencia.

    Nombre: El mecanismo es muy similar. Tampoco existen 2 parmetros (copias textuales). Cada ocurrencia del parmetro formal se reemplaza textualmente por el parmetro actual. Estndar en Algol 60.

    Copia: Existen 2 parmetros, el real y el formal. Ambos tienen ubicaciones distintas y estn en registros de activacin diferentes.

    Los parmetros formales no comparten almacenamiento con los parmetros actuales; sino que actan como variables locales. As, la llamada por copia protege a la unidad llamadora de modificaciones inadvertidas de los parmetros actuales. El pasaje de parmetros por copia tiene tres variantes:

    Por valor: Se utiliza a la ida cuando los datos van del llamador al llamado. La unidad llamadora evala los parmetros actuales, y estos valores se usan para inicializar los parmetros formales, los cuales actan como variables locales en la unidad llamada. La llamada por valor no permite ningn flujo de informacin de retorno al llamador, as que las asignaciones a los parmetros formales no afectan a la unidad llamadora. Pascal permite pasar parmetros por valor.

    Por resultado: Se copia a la vuelta, la unidad llamada termina y devuelve el dato. las variables locales correspondientes a los parmetros formales no son seteadas en la llamada al procedimiento, pero su valor, al retorno, se copia en la posicin del parmetro actual en el ambiente del llamador. La llamada por resultado no permite ningn flujo de informacin a la unidad llamada.

    Por valor/resultado: Se copia a la ida y a la vuelta. , las variables locales que denotan parmetros formales son inicializadas en la llamada al subprograma (como en la llamada por valor) y al retorno, copian sus valores a los parmetros (como en la llamada por resultado). La llamada por valor-resultado y la llamada por referencia pueden tener efectos diferentes.

    Ejemplos de pasajes de parmetros: Programa modelo: a:array[15] int; h:int; //h es global. procedure parte 1 (x, y:int) h:=h+1;

    B

    A x

    A x

    B z

  • - 18 -

    x:=x+1; print (H, h, X, x, Y, y); fin {main} h:=1; a[1]:=2, a[2]:=3, a[3]:=4; parte1 (h, a[h]); print (h, h, a[h], a[h]); 1. Referencia: Pasa como parmetro la direccin de memoria, entonces la variable local queda apuntando a esa direccin de memoria. h-> 1 2 3 a[1]->2 3,3,2 -> parte1 3,4 -> main 2. Por nombre: Reemplazo el nombre dentro de la funcin. Primero se hace un reemplazo textual y despus se ejecuta. h=h+1 2 h=h+1 3 h, h, a[h] 3, 3, 4 -> parte1 3, 4 -> main 3. Copia resultado: Primero se inicializan los parmetros en cero. Y una vez terminada la funcin se copian los resultados de los parmetros formales hacia los reales. Se inicializan los parmetros del procedimiento x=0 y=0 h=h+1 2 x=0+1 1 2,1,0 -> parte1 Y una vez terminada la funcin se copian los resultados de los parmetros formales hacia los reales. h parte1 2,3 -> main 5. Copia valor-resultado: Hace ambas cosas.

    El vector quedara:

    a[1]=0 a[2]=3 a[3]=4

    El vector quedara: a[1]=2 a[2]=3 a[3]=4

  • - 19 -

    Copia parmetros formales con el valor de los parmetros reales. procedure parte 1 (x=1, y=a[h]=a[1]=2) x=1 y=2 h=h+1 2 x=1+1 2 2,2,2 -> parte1 Y una vez terminada la funcin se copian los resultados de los parmetros formales hacia los reales. h

  • - 20 -

    Introdujo un nuevo problema que hace muy difcil descubrir los errores. proc swap (int x, int y) : void begin int tmp ; tmp:=x ; x:=y; y:=tmp; end; intercambio del ndice con el contenido del arreglo. swap (i,a[i]) swap (a[i],i) si a[i] tmp:=i; 4 tmp:=a[i]; 9 12,7,3,9 i:=a[i]; 9 a[i]:=i; a[4]=4 i:=4 a[i]:=tmp; a[9]=4 i :=tmp; i:=9

    El programa se comporta diferente cuando se cambian los argumentos de lugar. Cmo influye el uso de variables semidinamicas en el pasaje de parmetros por nombre? El uso de variables semidinamicas en el pasaje por nombre puede generar resultados diferentes siempre que los parmetros estn acoplados. Por ejemplo la funcin SWAP para intercambiar dos datos. Si tengo un vector a a[1] e i=1 Si llamo a la funcin asi SWAP(i,a[i]), entonces swap (i,a[i]) tmp:=i; // tmp=1 i:=a[i]; // i=5 a[i]:=tmp; a[5] No es lo que quiero En cambio si lo llamo como SWAP (a[i],i) tmp:=a[i]; //tmp= a[i]:= i; //a[i]=1 i:=tmp; //i=5 Intercambio correcto

    Tipos de datos

    Predefinidos (built-in): Construido por el lenguaje. Integer, real, float, etc. Definidos por el usuario (user defined). (de Algol en adelante) Fortran no tena definicin de tipos de datos. Escasez de tipos de datos. Ante la pobreza de datos de Fortran surgi:

    PL1: gran cantidad de datos predefinidos en el lenguaje. Algol: redujo la cantidad de datos y ofreci la posibilidad que el usuario definiera sus propios tipos de

    datos. La solucin fue la gran caracterstica de este lenguaje. Hoy da todos los lenguajes se caracterizan porque se le de la posibilidad al usuario de crear datos. Formas de construir tipos de datos Producto cartesiano: Es un juego de elementos ordenado por tuplas. Puedo definir I*R*C (entero*real*carcter) => es una variable vlida. En Pascal son los record. En C son los struct. La mayora de los lenguajes tienen la posibilidad de tener producto cartesiano. Arreglos: Una sucesin de tipo de valores donde se le asocia un nmero entero que acta como ndice. Usa un ndice con un valor que no pertenece al dominio. En Ada se acepta un mapeo de las enumeraciones sobre otro tipo. Ejemplo: Gastos [mar] lun, mar, mierc. Enlace de una sucesin a un tipo:

    i a[4] tmp a[9]

    4 9 4 4

    9

    i a[4] tmp

    4 9 9

    9 4

  • - 21 -

    En tiempo de compilacin: soporta variables estticas y semiestticas. Ejemplo: FORTRAN, C y PASCAL. En tiempo de creacin: se hace en tiempo de ejecucin cuando se crea la variable. Son arrays

    dinmicos. Estos son de tipo semidinmicos (?). Ejemplo: ALGOL 69, SIMULA67. En tiempo de uso: es el ms flexible y el ms costoso. El tamao del array puede cambiar en tiempo de

    ejecucin. Es tpico de lenguajes dinmicos como SNOBOL4 y APL. Secuencias: Ejemplo: STRING, FILE. Un nmero de ocurrencias seguidas de un cierto tipo de datos. Difcil manipulacin y problema de almacenamiento (dinmico), porque no se conoce su tamao. Recursin: No se invoca n veces, sino una sola. Pueden contener componentes que alarguen el mismo tipo. Ejemplo: Un rbol binario. Una lista doblemente enlazada usando nodos. {typedef struct pepe int x; char z; pepe *q;} uso lo que estoy definiendo como parte de la definicin. En la definicin recursiva, slo se puede utilizar para definir punteros. Recursividad en tipos de datos se restringe a punteros. Uniones: Agregado de datos producido cuando 2 o ms datos ocupan el mismo lugar en diferente momento. Para qu sirven las uniones? Hace mas flexible el cdigo.

    Ahorro de espacio, memoria. Dar soporte de tipos dinmicos en lenguajes tipo Algol.

    Ejemplo: unin (int,float) x; (lo que digo es que x puede cambiar a int float y nada ms). El compilador de Algol o C reserva el tamao para el tipo de datos ms grande. Discriminante: 1 o 2 bytes pegados a la variable. Se usa para saber cual es el tipo de valor almacenado por una unin. Funciona como descriptor. En Pascal: A las uniones se las llama registros variantes. Estos tienen discriminantes, la variable es explcita, las uniones en Pascal son inseguras, puedo guardar un real teniendo guardado un entero. En Algol: A las uniones se las llama uniones. Estas uniones tienen discriminantes y este discriminante es implcito, el programador no lo ve. Unin segura. El compilador no me deja equivocar. En Ada: Las uniones son registros variantes que tienen discriminante y ste es explcito y se trata de una unin segura. En C: Son uniones, no tienen discriminante y son uniones inseguras. Escribo un discriminante o n segn el programador quiera. Ejemplos: En Algol: unin (int,real) x; En C: unin (int x,real y) z; _El compilador reserva 4 bytes (2bytes para int y 4 bytes para real). _Si hay un int desperdicio una parte. _Si hay un real uso todo En Algol reserva 5 bytes, 4 para el real o el int y 1 para el discriminante (pista del tipo almacenado). Si int => Sin real => En Algol: z:=2 a:=x las variables unin no pueden estar del lado derecho. En C: z:=2 a:=z Cmo s si hay almacenado un real o un int?. No lo S. Por la variable misma nos d que hay guardado. En Algol: si z es de tipo unin y a de cualquier tipo, no puedo hacer a:=z. En C: Es fcil tener problemas con las uniones. Clusula de conformidad de Algol: Permite al lenguaje tener uniones seguras. Para usar un dato de una unin se interroga sobre el tipo de dato. Solo se puede usar la unin (a la derecha) dentro de una clausura de conformidad CASE. Las uniones por si solas son inseguras. Por eso Algol verifica los tipos de datos. Ejemplo: Sumar una unidad a una unin en Algol unin (int,real)x;

    i r

    i 2

    2

  • - 22 -

    case x in when int x: x:=x+1 when real x: x:=x+1.0 esac Como se asegura Algol que las uniones no creen conflictos? Usando la clusula de conformidad. Unin en PASCAL record producto; nmero:integer; parte comn pventa:real; discriminante explcito: lo tengo que escribir. case stock: bolean of true: (cant:integer); false: (ordenado:real, unin esperado:real) end p1:producto; p1.nmero:=10; p1.stock:=true; p1.ordenado:=3.5; uniones inseguras Si un lenguaje tiene discriminante obligatorio en sus uniones, las uniones son seguras. FALSO. Pascal utiliza discriminante explicito que representa la unin y las mismas son inseguras.

    Registro variante en ADA Type PRODUCTO (STOCK:boolean) is record NMERO:integer; P.VENTA:float; case STOCK of when TRUE => CANT:integer; when FALSE => ORDENADO:float; ESPERADO:float; end case end record p1, p2, p3:PRODUCTO; P1.CANT:=7; ERROR p1:=( , ,TRUE,7); p2:=( , ,FALSE,7.3,8.5); p3:=p1; El compilador verifica que la parte variante sea consistente, siempre se maneja con registros variantes consistentes, por lo tanto las uniones en ADA son seguras. Nunca se acepta un valor inconsistente. El discriminante puede ser cualquier enumeracin, n nicamente booleano. Registro variante congelado en ADA: No puede cambiar de variante en ningn momento de la ejecucin, al discriminante se le da un valor fijo. p4:PRODUCTO(false); Cuando se declaran variables hay que especificar obligatoriamente el valor del campo discriminante (excepto en la declaracin de parmetros formales), una vez hecha la declaracin no se puede cambiar. Cmo se asegura ADA que las uniones no creen conflicto? ADA se asegura que las uniones no creen conflictos mediante el uso de un descriptor explcito con nombre. No permite el compilador que se cambie el topo de la variable si no se cambia tambin el descriptor. Ejemplo: TYPE UNION (t: BOOLEAN) IS RECORD CASE t IS WHEN TRUE => x: FLOAT;

    Parte variante con un discriminante lamado stock (representa la unin)

    Me indica que las uniones son inseguras en Pascal ya que uno tendra que guardar una cantidad entera y no una real.

    Ada no me permite alterar el valor de una variable que est en la parte

    variante.

    Es correcto ya que el compilador verifica que toda la parte variante

    sea consistente.

  • - 23 -

    WHEN FALSE => x: INTEGER; END CASE END RECORD

    Entonces, para cambiar: x => (t=>TRUE; x=>3,4) (en la misma instruccin!) Cules son las limitaciones para el uso de registros variantes congelados en ADA? No puede cambiar de variante en ningn momento de la ejecucin, al discriminante se le da un valor fijo. Si cambio el discrimnate tengo que cambiar el dato. Diferencia entre Pascal, Ada, C, Algol. En Pascal se puede modificar el discriminante y no los datos, entonces las uniones son inseguras. En Ada eso no se permite, si cambio el discriminante tengo que cambiar el dato, las uniones son seguras. C no utiliza discriminante, ni nada que permita saber que tipo de dato contiene la variable. Las uniones son inseguras. Algo tiene discriminante, entonces las uniones son seguras.

    LENGUAJE NOMBRE DISCRIMINANTE SEGURIDAD

    Pascal Registros Variantes Explicito (Con Nombre) Inseguras

    C Uniones No Tiene Inseguras

    Algol Uniones Implcito (Annimo) Seguras

    Ada Registros Variantes Explicito (Con Nombre) Seguras

    Puede una variable de tipo unin o registro variante, almacenarse en el heap. Si, mientras sean lenguajes permitan utilizar variables dinmicas. Ejemplo: C, C++, Pascal, ADA. Puede una variable de tipo unin pasarse como parmetro, si se pasa por referencia?Y por nombre? Puede pasarse por referencia, pero hay que tener cuidado con el uso que se le da en el procedimiento, porque las uniones no pueden ser usadas del lado derecho de una asignacin(Exepto en Algol si uso la Clusula de Conformidad). El pasaje por nombre tambin es vlido pero hay que tener cuidado dentro del procedimiento como se usa.

    Asignaciones

    a:=b En C -> edevalio:=errevalio valor (tiene que ser del mismo tipo de la celda apuntada por la direccin)(evalue). direccin (lvalue) Segn Algol: Las variables son referencias a celdas. Cuando mencionamos la variable hablamos de la direccin y n del contenido. int x; (variable entera). ref int y; (puntero a entero). ref ref int z; (puntero a puntero de entero). x es la direccin de un entero. y es la direccin de un puntero a entero el cual a su vez tiene una direccin de otra celda que es un entero. z es la direccin de una celda que a su vez es un puntero a puntero de entero que contiene una celda la cual es un entero. x, y, z son variables de distinto tipo, en las que difieren que unas son enteros y otras son punteros.

    x y

    z Asignaciones en ALGOL x:=y; copia un entero (2 desreferencing) x:=z; copia un entero (3 desreferencing) y:=x; copia un puntero a entero (0 desreferencing) y:=z; copia un puntero a entero (2 desreferencing) z:=x; copia un puntero a puntero a entero (MAL) z:=y; copia un puntero a puntero a entero (0 desreferencing)

    int

    puntero a int int

    puntero a puntero a int puntero a int int

  • - 24 -

    En Algol cuando el lado derecho tiene un valor que no satisface las exigencias del lado izquierdo, entonces se hacen extracciones de valor, la cantidad necesaria. Extracciones de valor: Seguir un puntero (hasta encontrar uno que sirva). Extraer valor. Desreferencig.

    Asignacin en C: x:=y; (2 desreferencing) x=*y; x:=z; (3 desreferencing) x=**y; y:=x; (0 desreferencing) y=&x; (& no me da el dato, sino me da una direccin) y:=z; (2 desreferencing) y=*z; z:=x; (MAL) MAL z:=y; (0 desreferencing) z=&y; En C existe una extraccin de valor implcita fija, si se necesitan ms hay que escribirlas, por eso para el desreferencing se debe hacer *y. Cuando no hay desreferencing en C se utiliza & que se suele denominar extracto de desreferencing. En C las variables tambin son direcciones como en Algol. Si quiero colocar en int un 4 para y =>

    y En Algol sera: (ref int)y:=4; En C sera: (*y=4); Lo mismo si quiero poner un 4 en z =>

    z En Algol sera: (ref ref int)z:=4; En C sera: (**z=4);

    Casting en Algol: En Algol quiere decir seguir un puntero del lado izquierdo de una asignacin. Int x; ref int c; Casting: es un puntero y referencia a la primer celda. c:=2; (ref int) y:=x;

    Casting en C: Cambiar el tipo de la variable en la instruccin. Ejemplo 1: Char z[20]; (int *) & z[3]; // ve al puntero a carcter en esta instruccin como puntero a entero. Ejemplo 2: float a; *((char *)(&a) + 3)=z &a bytes

    Control de precisin

    Aritmticas para representar nmeros. Que utilizan los diferentes lenguajes para representar variables reales. Hay dos aritmticas bsicas (BCD y base 2 (IEEE)). float a=0.0 for ( ; a!=1.0; a=a+0.1) Cuntas veces imprime a? { printf (%f,a); } Cuando compilo con bcdlib (BCD) imprime a 10 veces y con stdlib (IEEE - Base2) +.

    puntero a int int 4

    puntero a puntero a int puntero a int int 4

    z

  • - 25 -

    float a=0.1 if (a*10.0==1.0) printf (que bien); else Qu imprime qu bien o que mal? printf (que mal); Estas respuestas dependen de con que se compil el programa: Si fue con bcdlib (BCD) (que bien). Porque el nmero que est almacenado en la variable a tiene que poder representarse con 1/10. Si fue con stdlib (IEEE- Base2) (que mal). Porque el nmero que est almacenado en la variable a tiene que poder representarse con 1/21, 1/22, 1/2n. Base 10 (aritmtica BCD) BCD = Binario Codificacin Decimal (bcdlib) Ejemplo: 1212.33

    4 bits => 16 combinaciones (solo utiliza del 0 al 9. Las A, B, C, D, E y F no).

    O sea que 8 + 4 da un nmero prohibido. Desventajas: Ocupa mucho espacio. Mas costosas Mas lentas. No aprovecha las combinaciones hexadecimales de la A a la F. 10+0.1=1 Ventajas: 10*0.1=1 Ms preciso

    decimal binario

    6 110

    5.5 101.1

    5.25 101.01

    4.75 100.11

    1/10 0.1

    Base 2 (IEEE) (stdlib) Tomando por ejemplo 5.25 => La parte entera o sea el 5 lo divido por 2 para obtener el nmero binario. La parte real o sea el .25 lo multiplico por 2 para obtener el nmero binario. 5 1 0.25 *2 2 0 0.50 *2 1 1 1.00 *2 (cuando nos d 00 => fin) 0.1 es un nmero peridico. 0.110 -> 0.000110011001100110011.2

    Desventajas: 10*0.11 No tiene precisin Ventajas: Ms econmicas. Ms rpidas. Aprovecha mejor el espacio

    Cmo controlan los diferentes lenguajes la precisin de las variables reales?

    1 2 1 2 3 3

  • - 26 -

    Cobol (BCD). Fortran (Formato propietario IBM, luego IEEE). Pascal (IEEE). C (Se elige para todo el programa, Link-editor). Ada (Se elige para cada variable). Algol (Se elige para cada variable). Ejemplo: Type REALES 10 is new FLOAT delta 0.001 1 El tipo real es 10 y es un tipo real que tiene matemtica BCD. 2 Su precisin son 3 decimales. A:REALES 10; B:FLOAT; A+B da error. Para corregir el error se debe hacer: A + REALES 10 (B); //Convierte B a tipo REALES 10. FLOAT (A) + B Cuntas y cules son las formas que tienen los lenguajes para controlar la precisin de las variables reales? Los lenguajes tienen dos formas de controlar la precisin de las variables reales: Es lo establecido por la IEEE en la cual se tiene mantiza y exponente para expresar el nmero. El lmite es el tamao del tipo real. Algunos lenguajes utilizan BCD para expresar estos nmeros. Por ejemplo, en ADA se fija la precisin y se utiliza BCD para representarlos.

    Conversiones de datos

    Conversiones Explcitas: El lenguaje exige que se escriban las conversiones con claridad. Dificulta la escritura, pero facilita la lectura (mantenibilidad). Se utiliza en ADA. Conversin Explicita: REAL X; INT Z; X:=REAL(Z); Conversiones Explcitas en Ada: type PERAS is NEW FLOAT; type NARANJAS is NEW FLOAT; A:PERAS; B:NARANJAS; C:FLOAT; C:=A+B (No se pueden sumar PERAS con NARANJAS, por lo tanto da error) C:=A+PERAS(B); Error por la asignacin C:=NARANJAS(A)+B; C:=FLOAT(A+PERAS(B)); C:=FLOAT(NARANJAS(A)+B)); est bien C:=FLOAT(A)+FLOAT(B) Cmo son las conversiones entre tipos en ADA? Qu consecuencias trae? Las conversiones en ADA son explcitas. Esto trae la consecuencia que se deben castear las variables de diferentes tipos antes de una asignacin. hace que el lenguaje sea ms legible y mantenible, aunque hay que escribir ms. Conversiones implcitas: Las conversiones se hacen automticamente. Se hace una mezcla de tipos. Dificulta la lectura (mantenibilidad) y facilita la escritura. Se utiliza en C, Algol, Pascal, Fortran. Conversiones implcitas en C: El compilador hace todo el esfuerzo de acuerdo con la expresin y el tipo de variable involucrada. char short int int long int float double long double Conversiones implcitas en FORTRAN: COMPLEX A INTEGER B DOUBLE PRECISION C REAL D

  • - 27 -

    Se transforma Complex en real Double

    B = B * D + A + C REAL COMPLEX COMPLEX DOUBLE SE REDUCE A ENTERO PARA ASIGNAR A B Se convierte a un nivel superior para poder hacer las operaciones y luego se busca el nivel adecuado para la asignacin final. Conversiones implcitas en Algol: Voiding Rowing Desreferencing Desproceduring Uniting Widening Desproceduring: Asigna el valor devuelto por un procedimiento a una variable. Cuando el lado derecho es un procedimiento y el izquierdo es un tipo numrico => se ejecuta el procedimiento (desproceduring). cuerpo del procedimiento: instrucciones que lo componen. Si en Algol escribo: proc xx (---) ----- ----- ----- proc zz (---) ----- ----- ----- proc temp; temp:=xx; xx:=zz; dieron vuelta los cuerpos de los procedimientos, en C esto fue parecido a punteros a funciones. zz:=temp; El cuerpo del procedimiento xx se copia en el procedimiento temp. Cuando el lado derecho es un procedimiento y el izquierdo tambin => se copia el procedimiento. En Algol los procedimientos se copian. u:=v (Si u es un nmero y v es un procedimiento => se debe ejecutar el procedimiento que devuelve el nmero que

    se necesita). Rowing: Asignar un valor a un arreglo. Si no se especifica posicin se almacena a todas las filas. [4:12] int x; x es un arreglo de enteros. x:=0; cada componente del arreglo recibe el valor cero, y si x hubiera tenido algn nmero => el arreglo recibira dicho nmero. x:=x[6]; para todos los componentes del arreglo adquiere el valor que exista en la fila nmero 6. Widening: Un valor de un tipo, puede ser asignado a una variable de tipo ms amplio. real x; Esto es widening, cuando el lado izquierdo es un real y el derecho es un entero. int z; x:=z;

    COMPLEX DOUBLE

    COMPLEX DOUBLE PRECISION

    REAL

    INTEGER

  • - 28 -

    Voiding: Un valor puede ser asignado a una variable nula, perdindose el valor. void a; Esto es voiding, cuando el lado izquierdo es void y el derecho es un real. real b; a:=b; Desreferencing: Seguir el puntero, el lado derecho se adapta al lado izquierdo. Uniting: Cambia automticamente el discrimnate segn el tipo de dato a asignar. Algol no permite uniones del lado derecho. union (int , character) x; x := 3; // guarda el valor 3. Compatibilidad: Para algunos lenguajes dos variables son compatibles cuando el tipo de datos y para otros cuando tiene la misma estructura. Se usan cuando en una operacin pueden participar dos tipos de datos. En C la estructura de las mismas son iguales, la forma de representacin es igual. Typedef struct clientes Typedef struct producto { { int ncli; int npro; int deuda; int cant; }CL1; }PR1; CL1=PR1; (esto est permitido en C Standard, ya que para las dos estructuras tengo dos int). Muchos compiladores de C++ realizan la compatibilidad por estructura (casi siempre conversiones implcitas) y por tamao (si dos estructuras tienen el mismo tamao se pueden copiar). En C Typedef pepe int; pepe x; Int y; Para C x e y son compatibles porque tienen la misma estructura. Para Pascal y ADA no son compatibles porque pepe int. Pascal usa compatibilidad por nombre. En Ada la compatibilidad es el nombre, si el nombre del tipo son los mismos, ah dos variables son compatibles. LADO : INTEGER SUMA : FLOAT SUMA = LADO no se puede hacer, para ADA son incompatibles. SUMA = FLOAT(LADO) se realiza la conversin explicita para poder operar. Algol tiene compatibilida por estructura, para igual tipo de variable. Uso de conversiones implcitas. Por ejemplo desreferencing y windening. Qu diferencia existe entre las compatibilidades entre tipos de ADA y Algol? En ADA la compatibilidad es por nombre, o sea, todas las variables del mismo tipo de datos se pueden usar en operaciones. Las que tengan igual estructura pero distinto nombre son incompatibles para ADA. Usa conversiones explicitas. Algol tiene compatibilidad por estructura. Para igualar tipos de variables y hace uso de conversiones implcitas. ADA tiene la ventaja de tener buena legibilidad y matenibilidad pero se debe escribir mucho. Algol mejora la escribilidad pero es difcil de leer y de escribir. Que caractersticas tiene que tener un lenguaje de programacin para ser confiables? Legibilidad: Propiedad que dice cuanto fcil o difcil es leer un programa. Mantenibilidad: Propiedad que dice cuanto fcil o difcil es mantener un programa. Escribilidad: Propiedad que dice cuanto fcil o difcil es escribir un programa. Legibilidad con mantenibilidad se llevan bien y legibilidad con escribilidad, enemigas. Instruccin en APL: +/100 (suma de 1 a 100) 100 -/100 (es (-i)i x i) i=1

  • - 29 -

    Dificultades con los punteros

    Los primeros punteros tenan los siguientes inconvenientes: En PL1 => DECLARE P POINTER; DECLARE X FIXED; Problemas con el tipo de dato de la celda apuntada ALLOCATE X SET P; Declara X como un entero, aloja memoria para X y hace que apunte a X. 1) En PL1 no sabemos a que tipo de dato apuntan los punteros. Esto trae problema con el tipo de dato de la celda apuntada. Se puede estar usando mal el dato que se apunta. 2) El segundo problema es lo que se denomina punteros colgados o dangling reference que surge cuando un puntero apunta a una celda de memoria cuyo contenido no se puede garantizar. Regla de alcance de Algol: En toda asignacin en la que se copian direcciones el alcance del lado izquierdo debe ser que el alcance del lado derecho. El apuntador no puede vivir menos el apuntado, sino lo mismo. El apuntador no puede sobrevivir apuntando a algo que no existe(regla de alcance). Esto previene el dangling pointer o dangling referente. Algol prohbe que halla punteros colgados. Ejemplo 1 begin ref int rx, int x; begin ref int ry, int y; rx:=x; //Mismo alcance y tiempo de vida. rx:=y; //ERROR cuando muere la funcin muere la variable y y ry apunta a algo que no existe. ry:=x; //El alcance de ry es mas reducido que el alcance de x que desaparece primero. ry:=y; //Mismo alcance y tiempo de vida. end rx apunta a algo que no existe end. Ejemplo 2 Begin int a; ref int p; Begin int b; ref int q; p:=a; //copia de direcciones donde el lado izq y el der forman el mismo mbito. p:=b; //Dangling reference. Asignacin prohibida ya que b desaparece 1 que p. q:=a; //El alcance de q es ms reducido que el alcance de a que desaparece 1. q:=b; //copia de direcciones donde el lado izq y el der forman el mismo mbito. End End Como se puede producir punteros colgados por problamas de Alcance? Se originan cuando el alcance de la variable del lado izq de la asignacin es mayor al alcance del lado derecho, ya que puede darse el caso que el puntero, viva mas que lo apuntado. Cmo lo evita Algol? Lo evita a travs de la regla de alcance en la que prohbe que el alcance de la variable de lado izquierdo sea mayor a la del lado derecho. Escribir un ejemplo que refleje como ALGOL evita los punteros colgantes (dailing reference) utilizando su regla de alcance y describa que pasa en la misma situacin en Pascal.

    BEGIN ref INT Px, int x; ... BEGIN ref INT Py; INT y; Px = x; Px = y; Py = x; // Sin problemas Py = y; // Desaparecen los dos juntos. END

  • - 30 -

    END En ALGOL, el alcance del referenciador tiene que ser menor o igual al del referenciado. Los punteros en PASCAL no dan lugar a tales problemas porque solamente se pueden limitar a UNNAMED : referenciar annimos data objects, que son almacenados explcitamente al hacer NEW. La Instruccin NEW de PASCAL, asigna espacio de memoria para el almacenamiento necesario de una variable dinmica (ejemplo: una palabra). A medida que NEW va asignando espacio en el HEAP1, el espacio disponible se va reduciendo. El puntero que apunta a la cima del HEAP, va subiendo por las direcciones de memoria, reduciendo cantidad de memoria disponible para otros valores. Esto puede provocar que la memoria del HEAP se agote, lo que producira un error al intentar crear una variable dinmica. En C: C, como la mayora de los lenguajes permite que halla punteros colgados. Los tres inconvenientes con los punteros son: 1) Se utiliza mal el puntero. Acceso a celda confundiendo el tipo. 2) Puntero colgados: int *p1, *p2; p1=(int*)malloc(100); p2=p1; free(p2); //si libero p2 => p1 apunta a algo que no existe, este es el caso de puntero colgado. 3) Garbage o Basura: Se fabrica una variable annima y el puntero desaparece. Ejemplo 1 int *p1, *p2; P1=(int*)malloc(100); P2=(int*)malloc(200); P1=P2 //se desperdician 100 bytes que apuntaba P2. Ejemplo 2 p=(char *)malloc(100); if (a

  • - 31 -

    Administracin del Heap

    Fragmentacin: Con la creacin y eliminacin de variables dinmicas se producen huecos, que en algn momento se ocuparn o n. Estos huecos se producen porque el programador puede cambiar el lugar y el tamao de las variables. (Similar a la fragmentacin de disco) Garbage o basura: Zona de memoria inutilizable por el programa, para crear otras variables. La basura se encuentra en el Heap. Es slo propiedad de los lenguajes tipo Algol. En los lenguajes estticos no es posible que exista garbage porque tiene almacenamiento esttico. Estos lenguajes garantizan que los requerimientos de memoria antes del comienzo de la ejecucin del programa. Por lo tanto, toda la memoria necesaria puede ser ubicada antes de la ejecucin del programa. Explicar porque no existe garbage en los lenguajes dinmicos. Un lenguaje dinmico todos los datos estn referenciados por un smbolo en la tabla de smbolos. Toda zona de memoria que no est referenciada por un smbolo en la tabla de smbolo se consideran libres para reutilizarlos por la tabla de smbolos, por lo tanto no existe garbage. Lo que se comporta como garbage en los lenguajes dinmicos es la fragmentacin producida por la asignacin no contigua de memoria. Lenguajes dinmicos: Lenguajes dinmicos todas las variables accedidas desde la tabla de smbolos.

    En lenguajes dinmicos la organizacin de memoria es:

    Defragmentacin (compactar la memoria): Se recorre la tabla de smbolos buscando el puntero que tenga la direccin ms alta y corro los datos hasta al final, cambio el puntero (en la tabla de smbolos) apuntando al lugar en donde qued el dato. As sucesivamente, compactando los datos en un extremo y en el otro los espacios libres de memoria.

    Interprete Tabla de smbolos Heap

    Intrprete

    Programa

    Tabla de smbolos

    Heap Punteros

    Cuando la memoria llena est fragmentada se comporta como el garbage. Necesito poner los espacios ocupados de memoria en un mismo lugar, uno a continuacin del otro para generar ms espacio en

    memoria (compactacin de memoria). Defragmentacin.

  • - 32 -

    Garbage collection: Se utiliza para resolver el garbage o basura. Las variables estn dispersas en el Heap. Los punteros los administra el lenguaje, no el usuario. Hay porciones de memorias no usadas. En memoria virtual el garbage collection casi no ocurre. En memoria real el garbage collection ocurre frecuentemente.

    Lenguajes tipo Algol: Lenguajes tipo Algol variables dinmicas accedidas desde la pila de registros de Activacin.

    Hay un riesgo de que la memoria destinada al Heap se termine. Hay garbage + fragmentacin. En lenguajes tipo Algol la organizacin de la memoria es:

    En el Heap hay 3 grupos de cosas: Zonas libres (L). Dinmicos Zonas usadas (U). Garbege (G). Cmo se hace el garbage collection? El lenguaje fabrica dos listas para administrar el Heap, lista de bloques usados y lista de bloques libres. Un bloque inaccesible (G1 y G2) es un miembro de la cadena de usados al que no se le puede acceder desde la pila. 1. Marca todos los bloques que considere que son usados. 2. Se recorre la pila. Se buscan todos los punteros que existen en la pila y para cada uno de ellos se le borra la

    marca, a los bloques ellos referencian (se borran las marcas de los bloques que se pueden acceder). 3. Cuando se recorri toda la pila, al bloque que le qued la marca, ese es basura (G). El garbage collection se hace cuando necesito memoria, se crea un rbol, pero para crear el rbol necesito memoria. Veremos un algoritmo de recorrido del rbol utilizando prcticamente nada de memoria (recorrido recursivo): Cada vez que se transita un puntero, antes de irme pongo un puntero al padre, cada vez que avanzo pongo un puntero al padre, cuando llego a la hoja retrocede teniendo todo el camino. Siempre voy a tener un lugar para poder volver. Es como poner una marca para saber por donde pas.

    Ejecutable Pila R.A. Heap

    A B C D L4 U5 L3 U4 G2 L2 G1 U3 U2 U1 L1

    U

    L

    Ejecutable

    Pila

    Heap Garbage: El lenguaje y el programador no saben donde est

  • - 33 -

    Luego viene la desfragmentacin: Se borra el primer usado en la cabecera de usado y se lleva al final de la memoria. Luego se busca todos los punteros que apuntan a este puntero. Luego se repite la operacin. Hay una estrategia para disminuir el costo de este proceso que se denomina estrategia de contador referencia. Cada objeto tiene un contador de referencia. Cada puntero sabe cuantas variables est apuntando. Cada variable sabe los punteros que la estn apuntando. Ejemplo: p y q son 2 punteros. p=q; resto uno sumo uno Cuando un bloque tiene su contador de referencia en cero, se borra impidiendo la necesidad de un algoritmo complicado.

    Cuando se crea una estructura tipo anillo se utiliza este algoritmo.

    R1

    1 1

    p

    Raz

    U3

    U4 U2

    U1

  • - 34 -

    Indique un ejemplo de lenguajes para cada una de las siguientes combinaciones. a) Lenguaje sin garbage collector y sin defragmentacin. C o Pascal. El RUNTIME PACKAGE no se

    involucra. Y el garbage collector lo hace el programador.

    b) Lenguaje con garbage collector y sin defragmentacin. Algol. c) Lenguaje sin garbage collector y con defragmentacin. Lenguajes dinmicos. d) Lenguaje con ambos. No hay. Qu es la lista de espacios libres y que problema se le ocurre que puede surgir en un programa que genera punteros colgantes? La lista de espacios libres es una secuencia de punteros en el HEAP de porciones de memoria libre (no utilizada), cuando hay punteros colgantes, en la pila algn descriptor puede estar apuntando a un espacio de memoria que pertenezca a la lista de libres. Qu se le ocurre que puede ser ms peligroso, permitir punteros colgantes o generacin de basura? Generacin de basura, porque eso espacios de memoria usados, inaccesibles hacen que el HEAP crezca y se choque con la pila. Pero tiene la ventaja que algunos lenguajes tienen algoritmos de recuperacin (Garbage colection, contador de referencio). Punteros colgante porque no puedo acceder a la informacin que preciso, porque el espacio de memoria que la guardaba fue liberado y si es asignado nuevamente a otro puntero puedo obtener informacin errnea. Suponga que la administracin del heap del lenguaje del siguiente ejemplo se basa en la existencia de contadores de referencia. Cules de las siguientes asignaciones afectan dichos contadores y de qu manera? Dnde estn ubicados los mismos? int a,b; int *pa, *pb, *pc, *pd; pa=&a; pb=&b; pc=(int*)malloc(sizeof(int)); pd=(int*)malloc(sizeof(int)); pa=pc; pd=pb; Contador de referencia: En el algoritmo de conteo de referencia cuando hago malloc o free este algoritmo, reserva un pedazo en el heap (celda) que es el contador de referencia. pc=(int*)malloc(sizeof(int)); pc=1 pd=(int*)malloc(sizeof(int)); pd=1 pa=pc; pc=2 pd=pb; pd=0 Cules son las condiciones para que un elemento del n heap sea devuelto a la cadena de libre utilizando contador de referencia? En el algoritmo de conteo de referencia cuando hago malloc o free este algoritmo reserva un pedazo en el heap (celda), que es el contador de referencia. Cuando hay un puntero en el heap cuyo contador de referencia es igual a cero, ese pedazo de memoria est libre.

    q=malloc (200);

    p=q;

    200 1

    2

    Contador de referencia

    Con malloc (200) lo que hago es crear un espacio de memoria de 200 bytes que es asignado al puntero q, entonces su contador de referencia se pone automticamente en 1 ya que solo es apuntado por q ese espacio de memoria. Pero cuando hago p=q, el puntero p tambin apunta a ese espacio de memoria donde apunta q, por lo tanto el contador de referencia de q pasa a 2 ya que son dos los punteros apuntando

    a dicho espacio.

    Otro ejemplo:

    p=malloc (100);

    q=malloc (200);

    p=q;

    100 1

    200 12

    0

    2

    Cuando hay un bloque en el heap cuyo contador de referencia es igual a 0, ese pedazo de memoria

    est libre.

    Cuando p deja de apuntar a su espacio de memoria y apunta al de q, entonces se desreferencia y se decrementa el contador de referencia de p (que es 0). Y por el contrario ya que al espacio de memoria de q apuntan 2 punteros (p y q), su contador de referencia es 2.

  • - 35 -

    Parsing Ascendente (LR o SLR)

    Se basa esencialmente en la operacin de reduccin, en reemplazar el lado derecho por el lado izquierdo de las reglas. Durante el desarrollo del parsing ascendente trabajaremos con la gramtica a continuacin

    descripta, la hacemos recursiva a derecha y luego la factorizamos para ver cual es la accin que nos dice el terminal que hay que hacer. El PA no requiere modificaciones esenciales.

    1) E E+T

    2) E T

    3) T T*F 4) T F

    5) F id

    6) F cte

    7) F (E)

    E(Expresin), T (Trmino), F (Factor) Algoritmo de PA: Hay que empezar marcando el Estado de Avance del Reconocimiento de una Regla (llamado Item), se

    expresa con un punto. Ej:

    T .T*F No se ha reconocido nada de la regla. T T.*F Se ha reconocido parcialmente. T T*.F Se ha reconocido parcialmente.

    T T*F. Se ha reconocido toda la regla.

    Primer Paso del PA: a) El PA exige que la gramtica tenga una sola definicin. Si no se cumple esa condicin se agrega una

    regla nueva donde se cambia la Hiptesis y se redefine la Hiptesis en base a la regla vieja. Un ejemplo de definicin duplicada es el caso de E.

    0) E E

    1) E E+T 2) E T

    3) T T*F

    4) T F

    5) F id

    6) F cte

    7) F (E)

  • - 36 -

    b) Luego se construyen grupos de tems: Grupo Cero:

    El primer grupo se construye poniendo el punto delante del lado derecho de las reglas. Luego, si el punto qued delante de un No Terminal se escribe su definicin. Para finalizar agregamos la palabra recursivamente.

    Como el punto qued delante de T, E y F

    (No Terminales), escribo sus definiciones.

    0) E . E E . E+T Definicin de E

    E . T

    T