Sintaxis y Semantica

download Sintaxis y Semantica

of 26

Transcript of Sintaxis y Semantica

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Tema 2. Variables, mbito y comprobacin

    de tipos

    1. Variables

    Variable: (nombre, direccin, valor, tipo, tiempo de vida, mbito)

    1.1. Nombre

    Nombre o identificador: cadena de caracteres empleada

    para reconocer alguna entidad del programa

    Los nombres de variables son los identificadores ms numerosos en

    los programas, aunque no todas las variables tienen nombre

    Subprogramas, parmetros formales y otras entidades de

    programa tambin poseen nombre o identificador

    Cuestiones relativas al diseo de nombres:

    1. Cul es la longitud mxima de un identificador?

    2. Pueden emplearse caracteres conectores?

    3. Se distinguen maysculas de minsculas?

    4. Las palabras especiales son palabras reservadas o palabras

    clave? Cul es la longitud mxima de un identificador?

    Algunos lenguajes limitan el nmero de caracteres (31 en

    C), mientras que otros, como Ada, no lo hacen

    Pueden emplearse caracteres conectores?

    El conector ms empleado es _

    Departamento de Informtica 5 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Se distinguen maysculas de minsculas?

    Lenguajes como C, C++, Modula-2 o Java distinguen el uso

    de maysculas y minsculas en los identificadores

    Ej. de tres nombres distintos en C: suma, Suma, SUMA problemas

    de legibilidad (nombres que parecen muy similares denotan

    entidades distintas). Solucin: utilizar solamente minsculas

    En Java (o Modula-2) muchos nombre predefinidos incluyen

    maysculas y minsculas. Ej.: nombre del mtodo para convertir

    una cadena de caracteres en un valor entero parseInt

    (ParseInt o parseint son incorrectos) problema para

    escribir los programas (hay que recordar la forma en que se

    escriben estos nombre predefinidos)

    Las palabras especiales son palabras reservadas o palabras clave?

    Palabras especiales: indican acciones a realizar o se

    emplean para separar entidades sintcticas de los programas.

    Pueden ser: palabras clave o palabras reservadas

    Palabras clave: slo son palabras especiales en

    determinados contextos Ej: Fortran

    REAL ALTURA INTEGER REAL

    REAL = 8.25 REAL INTEGER

    Aunque tanto el compilador como los programadores distinguen

    un identificador de una palabra especial por su contexto, el uso

    de palabras clave puede conllevar problemas de legibilidad

    Palabras reservadas: palabra especial de un LP que no

    puede emplearse como identificador

    Nombres predefinidos: nombres que tienen un significado

    predefinido pero que puede ser cambiado (redefinido) por el

    usuario Ej: Ada (integer, float), Pascal (readln, writeln,

    trunc, round), C (printf, scanf)

    Departamento de Informtica 6 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    1.2. Direccin

    Direccion de una variable: direccin de memoria a la que

    est asociada

    Un mismo nombre puede tener asociados diferentes direcciones en

    lugares diferentes del programa (funciones f1 y f2 empleando la

    variable i) o en momentos diferentes durante la ejecucin del

    programa (activaciones recursivas de un subprograma)

    La direccin de una variable se denomina l-valor la aparicin de una

    variable en la parte izquierda de una asignacin denota su direccin

    Alias

    Alias: cuando se usa ms de un nombre de variable para referenciar

    la misma direccin

    Son un obstculo a la legibilidad y verificacin de programas. Ej: si A

    y B son alias cualquier cambio en A tambin cambia B y viceversa

    Formas de crear alias:

    Registros variantes de Pascal y Ada o uniones de C y C++:

    Medio de ahorrar espacio: la misma direccin se usa para

    almacenar tipos diferentes en momentos diferentes

    Medio de evitar las reglas de tipos del lenguaje: permite manipular diferentes tipos de datos en la misma localizacin

    de memoria Departamento de Informtica 7 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    En lenguajes con apuntadores, dos variables apuntador son alias cuando apuntan a la misma localizacin de memoria. En C y C++, si un apuntador hace referencia al espacio designado por un nombre de variable, este nombre y el apuntador son alias Ej: C

    int a, *pa;

    pa = &a; /* pa y a son alias */

    Empleando paso de parmetros por referencia a los subprogramas

    1.3. Tipo

    Tipo de una variable: determina el rango de valores que puede tomar

    la variable y el conjunto de operaciones definidas para los valores del tipo

    Ej. integer: [-32768..32767], {+, -, *, /}

    1.4. Valor

    Valor de una variable: contenido de la celda o celdas de

    memoria asociadas a las variables

    El valor de una variable se denomina r-valor la aparicin de una

    variable en la parte derecha de una asignacin denota su valor

    (Para acceder a un r-valor primero debe determinarse su l-valor)

    2. Ligadura (binding)

    Ligadura: asociacin entre un atributo y una entidad

    El momento en el que se produce se denomina tiempo de

    ligadura. Ejemplos:

    Tiempo de compilacin la ligadura de una variable de

    un programa en Pascal a su tipo de datos Departamento de Informtica 8 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Tiempo de linkado la ligadura de una llamada a un

    subprograma de biblioteca al cdigo del subprograma

    Tiempo de carga la ligadura de ciertas variables (ej: globales)

    a sus celdas de memoria (su direccin)

    Tiempo de ejecucin la ligadura de las variables locales

    (no estticas) a sus celdas de memoria

    Ligadura esttica: si ocurre antes del tiempo de ejecucin

    y permanece inalterable durante la ejecucin del programa

    Ligadura dinmica: si ocurre durante del tiempo de ejecucin

    o puede cambiar en el transcurso de la ejecucin del programa

    2.1. Ligadura de tipos

    Antes de que una variable pueda ser referenciada en un programa debe haber sido ligada a un tipo de dato. Aspectos importantes:

    cundo se liga el tipo y cmo se especifica

    A. Ligadura esttica de tipos

    Puede hacerse mediante:

    Declaracin explcita: se utiliza una sentencia que declara

    una lista de identificadores como de un tipo determinado

    Declaracin implcita: forma de asociar variables con tipos

    a travs de convenciones sintcticas. La primera aparicin

    del identificador constituye su declaracin implcita

    Ejemplos de LP: Fortran, Basic, Perl

    Problema: variables no declaradas explcitamente de manera

    accidental por el programador toman un tipo por defecto Departamento de Informtica 9 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Algoritmo de inferencia de tipos: determina los tipos de las variables que intervienen en las expresiones sin que sean declaradas de forma explcita por el programador o da un mensaje de error si no puede inferirse Ej: Haskell

    f x y | x == True = y * y

    | otherwise = y / 2

    B. Ligadura dinmica de tipos

    El tipo no se especifica mediante una sentencia de declaracin, sino

    cuando se le asigna un valor mediante una sentencia de asignacin

    se liga al tipo del valor, variable o expresin de la parte derecha

    de la asignacin (APL, SNOBOL4)

    Ventaja: proporciona muchsima flexibilidad de programacin Ej: APL

    (tipo: lista de reales de long. 4)

    lista 3.5 8.3 0.7 10.1

    lista 15 (tipo: variable entera)

    Desventajas:

    No se detectan incorrecciones de tipo en las asignaciones. El tipo de la parte izquierda simplemente se cambia al de la derecha Ej:

    i, x almacenan valores de tipo entero

    y almacena un valor de tipo real

    si por error

    escribimos i y

    en lugar de

    i x no se detecta el error, sino que el tipo de i se cambia a

    real. En lenguajes con ligadura esttica de tipos (Pascal, Ada)

    el compilador detectara el error. Aunque en otros (C), en

    muchas ocasiones el tipo de la parte derecha se convierte

    automticamente al de la izquierda Departamento de Informtica 10 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    El coste de implementacin de la ligadura dinmica de atributos

    es mayor, sobre todo en tiempo de ejecucin:

    Comprobacin de tipos

    Mantenimiento del descriptor asociado a cada variable en el

    que se almacena el tipo actual

    Cambio en el tamao de la memoria asociada a la variable

    2.2. Ligadura de espacio y tiempo de vida

    Proceso de asignacin: ligar celdas de memoria, tomadas de

    zonas de memoria disponible, a variables

    Proceso de desasignacin: desligar las celdas de memoria de la

    variable y devolver las celdas a las zonas de memoria disponible

    Tiempo de vida de una variable de programa: tiempo durante el

    cual la variable est ligada a una localizacin especfica de memoria

    tiempo entre asignacin y desasignacin de espacio

    Clasificacin de las variables en cuatro categoras atendiendo a sus tiempos de vida y a la zona de memoria desde donde se realiza la asignacin

    A. Variables estticas

    Se ligan a celdas de memoria antes de que comience la ejecucin del programa y permanece ligada a las mismas celdas hasta que

    acaba la ejecucin del programa

    Las variables globales son variables estticas

    Puede ser conveniente declarar variables en subprogramas que

    retengan el valor entre ejecuciones diferentes variables

    estticas en subprogramas (ej. static en C) Departamento de Informtica 11 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Ventaja principal: eficiencia

    Todas pueden tener direccionamiento directo (otros tipos de

    variable necesitan direccionamiento indirecto que es ms lento)

    No hay sobrecarga en tiempo de ejecucin por asignacin

    o desasignacin de espacio

    Desventaja: reducida flexibilidad

    Si un LP no dispone de otro tipo de variables no se

    soportan programas recursivos

    B. Variables dinmicas de pila

    La ligadura de espacio se produce cuando se elabora la sentencia

    de declaracin, exceptuando las que se ligan estticamente

    Elaboracin de una sentencia de declaracin: proceso de asignacin

    y ligadura de espacio indicada por la declaracin que tiene lugar

    cuando la ejecucin alcanza el cdigo de dicha declaracin la

    elaboracin se produce en tiempo de ejecucin

    Ej: los procedimientos en Pascal tienen:

    Seccin de declaracin: se elabora justo antes de la ejecucin

    del cdigo, cuando se llama al procedimiento

    Seccin de cdigo

    La asignacin se produce en tiempo de elaboracin y la

    desasignacin al devolver el control al procedimiento que realiza

    la llamada

    El espacio se asigna en la pila de tiempo de ejecucin

    Las variables locales (declaradas en subprogramas) son variables

    dinmicas de pila (a excepcin de las declaradas como estticas)

    Departamento de Informtica 12 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Ventajas:

    Todas las variables comparten el mismo espacio de memoria

    (la pila)

    Permiten recursin permite almacenar una copia diferente de

    las variables locales para cada una de las llamadas recursivas

    Desventaja:

    Sobrecarga en tiempo de ejecucin debido a la asignacin

    y desasignacin de espacio en la pila

    C. Variables dinmicas de montn (heap)

    Montn (heap): coleccin de celdas de almacenamiento cuya estructura est muy desorganizada debido a la naturaleza

    imprevisible de su uso

    Dos clases: explcitas e implcitas

    C.1. Explcitas

    Variables sin nombre cuyo almacenamiento se asigna y desasigna en tiempo de ejecucin mediante la utilizacin por el programador

    de instrucciones especficas

    Slo pueden ser referenciadas mediante apuntadores

    La creacin/destruccin de variables puede hacerse mediante un

    operador (C++, Ada) o una funcin de biblioteca (C, Pascal) Departamento de Informtica 13 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Ejemplo: Pascal

    type pnodo = ^nodo;

    nodo = record end;

    var

    nuevo_nodo: pnodo;

    begin

    { La ligadura del tipo es esttica y

    new(nuevo_nodo);

    la de espacio dinmica}

    dispose(nuevo_nodo);

    end;

    Uso: estructuras dinmicas (listas, rboles, grafos, )

    Desventajas:

    Dificultad para usarlas correctamente

    Coste en tiempo de ejecucin en las operaciones de

    referencia, asignacin y desasignacin

    C.2. Implcitas

    Se les liga espacio del montn slo cuando se le asignan valores (de hecho, todos sus atributos se ligan cada vez que se produce una asignacin)

    Ejemplo: variables de APL

    Ventaja: flexibilidad en la programacin permite escribir cdigo

    muy genrico Departamento de Informtica 14 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Desventajas:

    Dejan de detectarse algunos errores de tipo

    Sobrecarga en tiempo de ejecucin (asignacin/desasignacin

    de espacio y resto de atributos)

    3. Tipos

    3.1. Comprobacin de tipos

    Generalizacin de los conceptos de operandos y operadores para

    incluir a subprogramas y sentencia de asignacin:

    Subprogramas operadores cuyos operandos son sus parmetros

    Asignacin operador binario cuyos operandos son la variable a

    la que se asigna el valor y la expresin a evaluar

    Comprobacin de tipos: actividad que nos asegura que

    los operandos de un operador son de tipos compatibles

    Tipos compatibles: un tipo legal para el operador o un tipo que

    atendiendo a determinadas reglas del lenguaje puede ser convertido

    implcitamente mediante cdigo generado por el compilador en un tipo

    legal. Esta conversin automtica se denomina coaccin (coercion)

    Error de tipos: aplicacin de un operador a un operando de

    tipo inapropiado

    Si todas las ligaduras de tipos a variables son estticas las

    comprobaciones de tipo pueden realizarse de forma esttica

    Si hay ligadura dinmica de tipos a variables debe realizarse una comprobacin dinmica de tipos (ms costosa que en

    tiempo de compilacin)

    Departamento de Informtica 15 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    LP (Pascal, Ada, C) que permiten el almacenamiento en la misma celda de memoria de valores de tipos diferentes en momentos distintos de la ejecucin (registros variantes y uniones) la comprobacin de tipos para estas clases de datos debe ser dinmica requiere mantener durante la ejecucin el tipo actual asociado a la celda de memoria no todos los errores pueden detectarse con una comprobacin esttica de tipos

    3.2. Disciplina de tipos (strong typing)

    Un lenguaje tiene disciplina de tipos si los errores de tipos se

    detectan siempre es necesario determinar los tipos de todos

    los operandos, ya sea en tiempo de compilacin o de ejecucin

    Pascal

    Cercano a tener disciplina de tipos pero no realiza comprobacin

    de tipos en los registros variantes (incluso puede omitirse la

    etiqueta discriminatoria en dichos registros)

    Ada

    Resuelve el problema de los registros variantes realizando

    comprobacin dinmica de tipos (slo en este caso)

    Tiene una funcin de biblioteca que permite extraer un valor de una variable de cualquier tipo (como una cadena de bits) y usarlo

    como un tipo diferente (no es una conversin de tipos) se trata de una suspensin temporal de la comprobacin de tipos

    C

    No tiene disciplina de tipos por:

    No se realiza comprobacin de tipos sobre las uniones

    Permite funciones con parmetros sobre los que no se realiza

    comprobacin de tipos

    Departamento de Informtica 16 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Java

    Tiene disciplina de tipos (no hay

    uniones) ML y Haskell

    Poseen disciplina de tipos

    Los tipos de los parmetros de las funciones (y de estas mismas)

    se conocen en tiempo de compilacin (ya sea por declaracin del

    usuario o por inferencia de tipos)

    3.3. Compatibilidad de tipos

    Mtodos:

    Compatibilidad de tipos nominal: dos variables tienen

    tipos compatibles si estn ligadas al mismo nombre de tipo Ej:

    type

    T = array [1..10] of integer;

    var

    a, b:

    T; begin

    a := b;

    Compatibilidad de tipos estructural: dos variables tienen

    tipos compatibles si sus tipos tienen la misma estructura Ej:

    type

    T = array [1..10] of integer;

    S = array [1..10] of integer;

    var

    a: S;

    b: T;

    begin

    a := b; Departamento de Informtica 17 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Equivalencia de declaracin: dos variables tienen tipos

    compatibles si uno de los tipos est definido con el nombre del otro Ej:

    type

    T = array [1..10] of

    integer; S = T;

    var

    a: S;

    b: T;

    begin

    a := b;

    La mayora de LP utilizan combinaciones de estos tres mtodos

    de compatibilidad

    Tipo annimo: tipo asociado directamente con una variable mediante

    una declaracin sin proporcionarle un nombre Ej. en Ada:

    a, b: array (1..10) of INTEGER;

    c: array (1..10) of INTEGER;

    La interpretacin es obvia usando compatibilidad de

    tipos estructural

    Compatibilidad nominal? Ej. Ada a, b y c son incompatibles

    Compatibilidad de tipos nominal:

    Fcil de implementar pero muy restrictiva

    Ej. usando un lenguaje con interpretacin estricta de

    la compatibilidad de tipos nominal: Departamento de Informtica 18 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    type

    tipo_indice = 1..100;

    var

    contador: integer;

    indice: tipo_indice;

    begin

    contador := indice;

    indice := contador;

    Compatibilidad de tipos estructural:

    Debe compararse la estructura de ambos tipos, pero:

    Son compatibles dos registros con la misma estructura pero

    con nombres de campos diferentes?

    Son compatibles arrays del mismo tipo y con el mismo nmero

    de elementos pero con rangos de ndices diferentes (0..9 / 1..10)?

    Son compatibles tipos enumerados con el mismo nmero de

    componentes pero literales diferentes?

    No acepta diferencias entre tipos con la misma estructura Ej:

    type

    longitud = real;

    tiempo = real;

    var

    l: longitud;

    t: tiempo;

    l y t son compatibles (tienen la misma estructura), aunque

    quizs no deberan considerarse equivalentes: son

    abstracciones de diferentes categoras de valores del problema

    Departamento de Informtica 19 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Subtipos y tipos derivados

    Subtipo: versin (posiblemente restringida en el rango) de un

    tipo existente con el que es compatible. Evita uno de los

    problemas de la compatibilidad de tipos nominal

    Ej. Ada: subtype Natural is Integer range

    0.. IntegerLast;

    subtype Temperatura is Integer range -

    20..45; n: Natural;

    i: Integer;

    t: Temperatura;

    Las siguientes asignaciones son posibles:

    n := i;

    i := n;

    t := i;

    Se necesita una comprobacin en tiempo de ejecucin que

    asegure que el valor que se asigna est en el rango adecuado

    Para la funcin: function "**" (i: Integer; n:

    Natural) return Integer;

    y la llamada

    j ** k;

    el compilador comprueba que j y k sean del tipo Integer

    (o de uno de sus subtipos). Durante la ejecucin se asegura

    que el valor actual de k est en el rango de Natural. Un

    lenguaje con compatibilidad de tipos nominal slo aceptara

    que j fuese del tipo Integer y n del tipo Natural.

    Tipo derivado: nuevo tipo basado en algn otro previamente definido con el que es incompatible, aunque sean estructuralmente

    idnticos. Heredan todas las propiedades de su tipo padre. (Tambin

    pueden incluir restricciones sobre el rango)

    Departamento de Informtica 20 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Ej. Ada:

    type Longitud is new Float;

    type Tiempo is new Float;

    Las variables de estos tipos son incompatibles entre ellas y con otras de tipo float (esta regla no se aplica a los literales

    como 12.5)

    4. mbito

    mbito de una variable de programa: rango de sentencias en las

    que es visible la variable

    Una variable es visible en una sentencia si puede referenciarse

    en dicha sentencia

    Las reglas de mbito de un lenguaje determinan cmo se asocian las referencias a variables declaradas fuera del subprograma o bloque que se est ejecutando con sus declaraciones con sus atributos

    Una variable es local en una unidad de programa o bloque si est declarada en l. Las variables no locales de una unidad de

    programa o bloque son aquellas visibles en dicha unidad o bloque

    pero no declaradas en l

    4.1. mbito esttico

    mbito esttico (introducido por ALGOL 60): mtodo de ligadura de

    nombres a variables no locales que ocurre en tiempo de compilacin

    En la mayora de lenguajes con mbito esttico (C es una de las

    excepciones) pueden anidarse los subprogramas cada subprograma

    crea su propio mbito el resultado es una jerarqua de mbitos Departamento de Informtica 21 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Cmo se determinan los atributos de una variable en un lenguaje

    con mbito esttico?

    1. Se busca su declaracin local, y si no se encuentra

    2. Se contina la bsqueda en el bloque que lo declara, su

    padre esttico. Si no se encuentra,

    3. Se contina la bsqueda en la unidad que declara a esta ltima. As hasta que se encuentra la declaracin de la variable o se

    alcance la unidad de declaracin mayor error: utilizacin de una variable no declarada

    El padre esttico de un subprograma y los padres estticos de ste

    hasta el programa principal se denominan antepasados estticos

    Ejemplo: procedure mayor;

    var x: integer;

    procedure

    sub1; begin

    x end; {de sub1}

    procedure

    sub2; var x:

    real; begin

    end; {de

    sub2} begin

    end. {de mayor}

    La referencia a la variable x en sub1 se corresponde con

    la declaracin de x en mayor

    En lenguajes con mbito esttico, una declaracin de una variable

    oculta cualquier declaracin de otra variable con el mismo nombre en un mbito que englobe al que incluye dicha declaracin

    La referencia a la variable x en sub2 se corresponde con la

    declaracin en sub2 se oculta la declaracin de x en mayor Departamento de Informtica 22 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Hay lenguajes que permiten hacer referencia a variables

    ocultas declaradas en antepasados estticos

    Ej: Ada. Sintaxis:

    nombre_unidad_de_programa.nombre_variable mayor.x

    Algunos lenguajes (herederos de ALGOL 60) permiten definir nuevos mbitos estticos en mitad de cdigo ejecutable son variables locales a esa seccin de cdigo. Son variables dinmicas de pila se les asigna espacio al comenzar la seccin y se desasigna cuando se

    sale de ella

    Las secciones de cdigo en la que pueden definirse variables locales

    se denominan bloques

    Ej. de bloque en Ada:

    declare temp:

    Integer; begin temp := x;

    x := y; y :=

    temp; end;

    Los bloques son el origen de la expresin

    lenguajes estructurados en bloques

    Aunque a Pascal se le considera un lenguaje estructurado

    en bloques no dispone de bloques no procedurales

    En C, cualquier grupo de sentencia compuesta (secuencia de

    sentencias englobadas entre llaves) puede definir un nuevo

    mbito. Ejemplo: if (lista[i] < lista[j])

    {

    int temp;

    temp := lista[i];

    lista[i] := lista[j];

    lista[j] := temp; }

    Departamento de Informtica 23 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Java permite que la definicin de una variable aparezca en cualquier

    lugar de una funcin el mbito de la variable comienza en la

    sentencia de definicin y acaba en el final del bloque que la incluye

    Los mbitos definidos por bloques se tratan igual que los

    creados por subprogramas

    Evaluacin del mbito esttico

    Proporciona un mtodo de acceso a variables no locales adecuado en

    la mayora de los casos

    Problemas:

    Acceso a demasiados datos. Por ejemplo, todas las

    variables declaradas en el programa principal son visibles

    en todos los procedimientos, se desee o no

    Los cambios pueden ser complicados:

    principal A

    C

    D

    B E

    1. Es necesario acceder a variables de D desde E. Soluciones:

    Mover E dentro de D E deja de tener acceso al mbito de B

    Mover las variables de D que necesita E a principal

    puede accederse a ellas desde otros procedimientos.

    Adems, supongamos que D y E necesitan la variable x.

    Si en A hay una variable con nombre x oculta la

    variable x que necesita D y hemos movido a principal Departamento de Informtica 24 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    2. E necesita llamar al procedimiento D. Soluciones:

    Mover D dentro de principal deja de tener acceso a las

    variables de A

    Esta falta de flexibilidad provoca una tendencia en los

    programadores a usar ms variables globales de las que necesitan

    4.2. mbito dinmico

    mbito dinmico (APL, SNOBOL4): basado en la secuencia de

    llamadas a subprogramas y no en la relacin sintctica entre ellos

    el mbito slo puede determinarse en tiempo de ejecucin

    Cmo se determinan los atributos de una variable en un lenguaje con mbito dinmico? En tiempo de ejecucin:

    1. Se busca su declaracin local, y si no se encuentra

    2. Se contina la bsqueda en su padre dinmico, el

    subprograma que realiz la llamada. Si no se encuentra,

    3. Se contina la bsqueda en los antepasados dinmicos. As

    hasta que se encuentra la declaracin de la variable. Si no se

    encuentra la declaracin en ningn antecesor dinmico error en tiempo de ejecucin

    Departamento de Informtica 25 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Ejemplo: procedure mayor;

    var x: integer;

    procedure

    sub1; begin

    x end; {de sub1}

    procedure

    sub2; var x:

    real; begin

    end; {de

    sub2} begin

    end. {de mayor}

    Secuencia de llamadas: mayor sub2 sub1 la referencia a x

    en sub1 corresponde con la declaracin de x en sub2

    Secuencia de llamadas: mayor sub1 la referencia a x en

    sub1 corresponde con la declaracin de x en mayor

    Evaluacin del mbito dinmico

    Una sentencia en un subprograma que contiene una referencia a una

    variable no local puede relacionarse con una variable diferente cada

    vez que se ejecuta muchos tipos de problemas:

    Durante el tiempo que transcurre entre el comienzo y la finalizacin

    de la ejecucin de un subprograma todas las variables locales del

    subprograma son visibles en los subprogramas a los que se llame.

    No hay forma de protegerlas de esta accesibilidad programas

    menos fiables que con mbito esttico

    Imposibilidad de realizar una comprobacin de tipos esttica de

    las referencias no locales (es imposible determinar

    estticamente su declaracin)

    Los programas son ms difciles de leer y seguir por un

    lector humano

    Departamento de Informtica 26 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Ventaja: el subprograma hereda el contexto de sus llamadores

    mtodo de comunicacin entre unidades de programa (menos

    seguro que otros mtodos, como el paso de parmetros)

    4.3. Entorno de referencia

    Entorno de referencia de una sentencia: coleccin de todos

    los identificadores visibles en dicha sentencia

    Lenguajes con mbito esttico: el entorno de referencia de una

    sentencia est compuesto por las variables declaradas en su mbito

    local ms todas las variables visibles de sus antepasados estticos

    Lenguajes con mbito dinmico: el entorno de referencia de

    una sentencia est compuesto por las variables declaradas

    localmente ms todas las variables visibles del resto de

    subprogramas activos Ej.: principal sub2 sub1 procedure sub1;

    var a,b:

    integer; begin

    {A} end; {de sub1}

    procedure sub2;

    var b,c:

    integer; begin {B}

    sub1; end; {de sub2}

    procedure principal;

    var c,d: integer;

    begin {C}

    sub2; end. {de principal}

    Punto Entorno de referencia A y de , de , de

    a b sub1 c sub2 d

    principal

    B b y c de sub2, d de principal

    C c y d de principal

    Departamento de Informtica 27 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    5. Constantes

    Constante: objeto al que se le liga un valor slo en el momento en

    el que se le liga el espacio su valor no puede cambiarse por

    asignacin o por sentencia de entrada

    Ventajas:

    Aumenta la fiabilidad y legibilidad de los programas

    El valor aparece en una sola lnea de programa ms fcil

    su modificacin

    Constantes manifiestas: constantes con ligadura esttica de valores

    Pascal: la declaracin de una constante requiere un valor simple

    Modula-2: permite expresiones constantes (constantes

    ya declaradas, literales y operadores)

    Otros lenguajes (Ada, Java) permiten ligadura dinmica de valores

    a constantes pueden aparecer variables

    Ada: num_elementos: constant Integer := 2 * i + j;

    6. Inicializacin de variables

    Inicializacin: ligadura de un valor a una variable en el momento

    en el que tambin se le liga el almacenamiento

    Variables estticas: inicializacin sucede una sola vez antes

    del momento de la ejecucin

    Variables con ligadura dinmica de espacio: la inicializacin tambin

    es dinmica Departamento de Informtica 28 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Inicializacin en algunos lenguajes:

    Pascal: No tiene sentencias de inicializacin

    C: en la sentencia de declaracin puede indicarse un valor

    inicial Ej.: int i = 10;

    Ada: la inicializacin puede incluir nombres de otras constantes o

    variables visibles en el momento de la elaboracin de la

    inicializacin Ej.: contador: integer := num_elem + 1;

    num_elem puede ser el nombre de una variable o constante

    Variables no inicializadas

    Las declaraciones sin inicializacin crean variables no inicializadas: se les liga memoria pero su contenido es arbitrario y no puede ser

    interpretado como un valor del tipo del objeto declarado. El uso de un valor no incializado produce resultados impredecibles y debe evitarse

    Posibles aproximaciones que pueden utilizar los LP:

    Se ignora el problema y se considera responsabilidad del

    programador no emplear valores no inicializados. Poco elegante

    Todas las declaraciones inicializan el espacio asignado a un valor apropiado, definido para cada tipo bsico. Por ej., punteros a

    null y valores numricos a cero. Puede llevar a errores

    No existen declaraciones sin inicializacin el programador debe proporcionar un valor de inicializacin adecuado para cada

    elemento declarado

    Existe un valor especial para cada tipo denominado omega, que

    representa la propiedad de ausencia de inicializacin. Este valor

    se propaga en las expresiones (omega + 3 omega). Permite

    al programador comprobar dinmicamente si una variable est

    o no inicializada

    Departamento de Informtica 29 rea de Lenguajes y Sistemas Informticos

  • Lenguajes de Programacin E.S. Ingeniera Informtica

    Ejemplos de algunos LP:

    Pascal: ignora el problema

    Ada: inicializa apuntadores a null e ignora el problema para

    el resto de tipos

    C: inicializa las variables estticas a una forma apropiada de

    cero. Ignora el problema para el resto de las variables

    Departamento de Informtica 30 rea de Lenguajes y Sistemas Informtico