Sie sind auf Seite 1von 109

Modelos de lenguajes de programación

José A. Rodríguez Melquiades

11 de febrero de 2018

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 1 / 32


Modelos de lenguajes de programación: Principio 2.1

1 Nombres
Cuestiones sintácticas
Variables
Alcance
Referencias
Tiempo de vida

2 Ejercicios

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 2 / 32


Nombres

La nomenclatura de las variables, funciones, tipo, clases y otras


entidades es importante en programación.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 3 / 32


Nombres

La nomenclatura de las variables, funciones, tipo, clases y otras


entidades es importante en programación.

Enlazar (binding) es una asociación entre una entidad (ejm. variable) y


una propiedad (ejm. su valor).

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 3 / 32


Nombres

La nomenclatura de las variables, funciones, tipo, clases y otras


entidades es importante en programación.

Enlazar (binding) es una asociación entre una entidad (ejm. variable) y


una propiedad (ejm. su valor).

Definición: Un enlace es estático si la asociación ocurre antes de la


ejecución.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 3 / 32


Nombres

La nomenclatura de las variables, funciones, tipo, clases y otras


entidades es importante en programación.

Enlazar (binding) es una asociación entre una entidad (ejm. variable) y


una propiedad (ejm. su valor).

Definición: Un enlace es estático si la asociación ocurre antes de la


ejecución.

Definición: Un enlace es dinámico si una asociación ocurre en tiempo


de ejecución.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 3 / 32


Nombres

La nomenclatura de las variables, funciones, tipo, clases y otras


entidades es importante en programación.

Enlazar (binding) es una asociación entre una entidad (ejm. variable) y


una propiedad (ejm. su valor).

Definición: Un enlace es estático si la asociación ocurre antes de la


ejecución.

Definición: Un enlace es dinámico si una asociación ocurre en tiempo


de ejecución.

Por lo tanto: El momento en que un enlace ocurre con un nombre,


desempeña un papel fundamental.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 3 / 32


Ejemplo:
El alcance estático debe ser conocido para todos los programadores
pues es el mecanismo usado por todos los lenguajes para resolver
referéncias.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 4 / 32


Ejemplo:
El alcance estático debe ser conocido para todos los programadores
pues es el mecanismo usado por todos los lenguajes para resolver
referéncias.

El tiempo de vida del nombre de una variable, se refiere al intervalo de


tiempo durante el cual la variable queda asignada en la memoria. Puede
ser estática o dinámica.
En el caso dinámico, el tiempo de vida de una variable debe ser la
ejecución de los comandos pertenecientes a su alcance. Algunos
lenguajes ofrecen mecanismos para extender el tiempo de vida de tales
variables.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 4 / 32


Cuestiones sintácticas

Los nombres se usan en los programas para denotar muchas entidades


diferentes:
variables, tipos, funciones, etc.
Discutimos la sintáxis básica de los nombres. Otro término para nombre
es Identificador.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 5 / 32


Cuestiones sintácticas

Los nombres se usan en los programas para denotar muchas entidades


diferentes:
variables, tipos, funciones, etc.
Discutimos la sintáxis básica de los nombres. Otro término para nombre
es Identificador.

Las reglas léxicas determinan como un nombre puede ser construido.


Ejemplo:
Un Identificador en Clite esta formada por una série de letras y dígitos,
empezando con una letra.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 5 / 32


Cuestiones sintácticas

Los nombres se usan en los programas para denotar muchas entidades


diferentes:
variables, tipos, funciones, etc.
Discutimos la sintáxis básica de los nombres. Otro término para nombre
es Identificador.

Las reglas léxicas determinan como un nombre puede ser construido.


Ejemplo:
Un Identificador en Clite esta formada por una série de letras y dígitos,
empezando con una letra.

La declaración de un identificador difiere en los lenguajes.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 5 / 32


Cuestiones sintácticas

Los nombres se usan en los programas para denotar muchas entidades


diferentes:
variables, tipos, funciones, etc.
Discutimos la sintáxis básica de los nombres. Otro término para nombre
es Identificador.

Las reglas léxicas determinan como un nombre puede ser construido.


Ejemplo:
Un Identificador en Clite esta formada por una série de letras y dígitos,
empezando con una letra.

La declaración de un identificador difiere en los lenguajes.

Definición: La mayoria de los lenguajes poseen un conjunto predefinido


de nombres llamados palabras reservadas o palabras-clave, que tienen
un significado especial y no pueden ser usados como identificadores.
José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 5 / 32
Palabras reservadas incluyen nombres que son útiles en el análisis de un
programa, pues identifican construcciones importantes.
En C, las palabras-clave: int, if y while.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 6 / 32


Palabras reservadas incluyen nombres que son útiles en el análisis de un
programa, pues identifican construcciones importantes.
En C, las palabras-clave: int, if y while.

En ciertos lenguajes (Pascal y Scheme), además de las palabras


reservadas, existen identificadores predefinidos que poseen un
significado especial; diferentemente de las palabras reservadas, el
programador puede redefinirlos.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 6 / 32


Palabras reservadas incluyen nombres que son útiles en el análisis de un
programa, pues identifican construcciones importantes.
En C, las palabras-clave: int, if y while.

En ciertos lenguajes (Pascal y Scheme), además de las palabras


reservadas, existen identificadores predefinidos que poseen un
significado especial; diferentemente de las palabras reservadas, el
programador puede redefinirlos.

Por un lado, esto ayuda a minimizar la cantidad de palabras reservadas


del lenguaje. Por otro lado, puede llevar a programas confusos.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 6 / 32


Ejemplo:
El seguinte fragmento de programa en Pascal, redefine el significado
del identificador predefinido true:

program confuso;
const true = false;
begin
...
if (a < b) = true then
f(a)
else
g(b);
...
end.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 7 / 32


Ejemplo:
El seguinte fragmento de programa en Pascal, redefine el significado
del identificador predefinido true:

program confuso;
const true = false;
begin
...
if (a < b) = true then
f(a)
else
g(b);
...
end.
I El procedimiento g es llamado sí a >= b. Permitir la redefinición de un
identificador importante como true es, de esa forma, una decisión errada
para la planificación de diseño de un lenguaje.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 7 / 32


El planificador de lenguajes debe decidir entre hacer identificadores
predefinidos reservados, o permitir que el programador redefina tales
identificadores.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 8 / 32


El planificador de lenguajes debe decidir entre hacer identificadores
predefinidos reservados, o permitir que el programador redefina tales
identificadores.
I Ejemplo:
El LP Cobol usó la primera decisión, siendo el resultado centenas de
palabras reservadas.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 8 / 32


El planificador de lenguajes debe decidir entre hacer identificadores
predefinidos reservados, o permitir que el programador redefina tales
identificadores.
I Ejemplo:
El LP Cobol usó la primera decisión, siendo el resultado centenas de
palabras reservadas.

La mayoria de los lenguajes modernos usan alguna forma de la segunda


decisión, minimizando asi la cantidad de palabras reservadas.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 8 / 32


El planificador de lenguajes debe decidir entre hacer identificadores
predefinidos reservados, o permitir que el programador redefina tales
identificadores.
I Ejemplo:
El LP Cobol usó la primera decisión, siendo el resultado centenas de
palabras reservadas.

La mayoria de los lenguajes modernos usan alguna forma de la segunda


decisión, minimizando asi la cantidad de palabras reservadas.
I Ejemplo:
El LP Pascal permite que los nombres de tipos básicos como integer sean
redefinidos, mientras que para C son reservados.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 8 / 32


Variables

Dar nombres a las variables es fundamental en la programación


imperativa y orientada a objetos. En estos lenguajes una variable es un
nombre para un espacio de memoria.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 9 / 32


Variables

Dar nombres a las variables es fundamental en la programación


imperativa y orientada a objetos. En estos lenguajes una variable es un
nombre para un espacio de memoria.

Definición: Una variable es un enlace entre nombre con una dirección de


memoria. Además, una variable posee un tipo, un valor y un tiempo de
vida.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 9 / 32


Variables

Dar nombres a las variables es fundamental en la programación


imperativa y orientada a objetos. En estos lenguajes una variable es un
nombre para un espacio de memoria.

Definición: Una variable es un enlace entre nombre con una dirección de


memoria. Además, una variable posee un tipo, un valor y un tiempo de
vida.

Cualquiera de ellas o otros enlaces puede ser estática o dinâmica,


creando variaciones entre los LPs.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 9 / 32


Variables

Dar nombres a las variables es fundamental en la programación


imperativa y orientada a objetos. En estos lenguajes una variable es un
nombre para un espacio de memoria.

Definición: Una variable es un enlace entre nombre con una dirección de


memoria. Además, una variable posee un tipo, un valor y un tiempo de
vida.

Cualquiera de ellas o otros enlaces puede ser estática o dinâmica,


creando variaciones entre los LPs.

Los programadores usan variables para dar nombres a los espacios de


memoria individuales y agregados.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 9 / 32


Una variable de programa tiene cuatro enlaces básicos que pueden ser
estáticas o dinámicas:

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 10 / 32


Una variable de programa tiene cuatro enlaces básicos que pueden ser
estáticas o dinámicas:
I Nombre.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 10 / 32


Una variable de programa tiene cuatro enlaces básicos que pueden ser
estáticas o dinámicas:
I Nombre.

I Dirección.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 10 / 32


Una variable de programa tiene cuatro enlaces básicos que pueden ser
estáticas o dinámicas:
I Nombre.

I Dirección.

I Tipo.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 10 / 32


Una variable de programa tiene cuatro enlaces básicos que pueden ser
estáticas o dinámicas:
I Nombre.

I Dirección.

I Tipo.

I Valor.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 10 / 32


Una variable de programa tiene cuatro enlaces básicos que pueden ser
estáticas o dinámicas:
I Nombre.

I Dirección.

I Tipo.

I Valor.

Ejemplo:
x =m+1

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 10 / 32


Una variable de programa tiene cuatro enlaces básicos que pueden ser
estáticas o dinámicas:
I Nombre.

I Dirección.

I Tipo.

I Valor.

Ejemplo:
x =m+1
I Atribuye a la dirección de memoria, denotado por la variable x, el valor de la
expresión que es la suma del valor de la variable m y uno.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 10 / 32


Las variables compuestas homogéneas corresponden a las posiciones
de memoria, identificadas con el mismo nombre individualizado por
índices y cuyo contenido esta compuesto del mismo tipo.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 11 / 32


Las variables compuestas homogéneas corresponden a las posiciones
de memoria, identificadas con el mismo nombre individualizado por
índices y cuyo contenido esta compuesto del mismo tipo.

Ejemplo:

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 11 / 32


Las variables compuestas homogéneas corresponden a las posiciones
de memoria, identificadas con el mismo nombre individualizado por
índices y cuyo contenido esta compuesto del mismo tipo.

Ejemplo:
I Vector: Estructura de datos unidimensional.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 11 / 32


Las variables compuestas homogéneas corresponden a las posiciones
de memoria, identificadas con el mismo nombre individualizado por
índices y cuyo contenido esta compuesto del mismo tipo.

Ejemplo:
I Vector: Estructura de datos unidimensional.

I Matriz: Estructura de datos bidimensional.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 11 / 32


Las variables compuestas homogéneas corresponden a las posiciones
de memoria, identificadas con el mismo nombre individualizado por
índices y cuyo contenido esta compuesto del mismo tipo.

Ejemplo:
I Vector: Estructura de datos unidimensional.

I Matriz: Estructura de datos bidimensional.

I Cubos: Estructura de datos multidimensional

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 11 / 32


Las variables compuestas homogéneas corresponden a las posiciones
de memoria, identificadas con el mismo nombre individualizado por
índices y cuyo contenido esta compuesto del mismo tipo.

Ejemplo:
I Vector: Estructura de datos unidimensional.

I Matriz: Estructura de datos bidimensional.

I Cubos: Estructura de datos multidimensional

Algoritmo 1: Calcula la posición de los índices en la memoria

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 11 / 32


Las variables compuestas homogéneas corresponden a las posiciones
de memoria, identificadas con el mismo nombre individualizado por
índices y cuyo contenido esta compuesto del mismo tipo.

Ejemplo:
I Vector: Estructura de datos unidimensional.

I Matriz: Estructura de datos bidimensional.

I Cubos: Estructura de datos multidimensional

Algoritmo 1: Calcula la posición de los índices en la memoria


I Pos1 := Dirección Inicial

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 11 / 32


Las variables compuestas homogéneas corresponden a las posiciones
de memoria, identificadas con el mismo nombre individualizado por
índices y cuyo contenido esta compuesto del mismo tipo.

Ejemplo:
I Vector: Estructura de datos unidimensional.

I Matriz: Estructura de datos bidimensional.

I Cubos: Estructura de datos multidimensional

Algoritmo 1: Calcula la posición de los índices en la memoria


I Pos1 := Dirección Inicial
I Pos2 := Dirección Inicial + Tamaño Elemento

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 11 / 32


Las variables compuestas homogéneas corresponden a las posiciones
de memoria, identificadas con el mismo nombre individualizado por
índices y cuyo contenido esta compuesto del mismo tipo.

Ejemplo:
I Vector: Estructura de datos unidimensional.

I Matriz: Estructura de datos bidimensional.

I Cubos: Estructura de datos multidimensional

Algoritmo 1: Calcula la posición de los índices en la memoria


I Pos1 := Dirección Inicial
I Pos2 := Dirección Inicial + Tamaño Elemento
I Pos3 := Dirección Inicial + (2 *Tamaño Elemento)

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 11 / 32


Las variables compuestas homogéneas corresponden a las posiciones
de memoria, identificadas con el mismo nombre individualizado por
índices y cuyo contenido esta compuesto del mismo tipo.

Ejemplo:
I Vector: Estructura de datos unidimensional.

I Matriz: Estructura de datos bidimensional.

I Cubos: Estructura de datos multidimensional

Algoritmo 1: Calcula la posición de los índices en la memoria


I Pos1 := Dirección Inicial
I Pos2 := Dirección Inicial + Tamaño Elemento
I Pos3 := Dirección Inicial + (2 *Tamaño Elemento)
I Pos4 := Dirección Inicial + (3 * Tamaño Elemento)

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 11 / 32


Las variables compuestas homogéneas corresponden a las posiciones
de memoria, identificadas con el mismo nombre individualizado por
índices y cuyo contenido esta compuesto del mismo tipo.

Ejemplo:
I Vector: Estructura de datos unidimensional.

I Matriz: Estructura de datos bidimensional.

I Cubos: Estructura de datos multidimensional

Algoritmo 1: Calcula la posición de los índices en la memoria


I Pos1 := Dirección Inicial
I Pos2 := Dirección Inicial + Tamaño Elemento
I Pos3 := Dirección Inicial + (2 *Tamaño Elemento)
I Pos4 := Dirección Inicial + (3 * Tamaño Elemento)
I ...

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 11 / 32


Las variables compuestas homogéneas corresponden a las posiciones
de memoria, identificadas con el mismo nombre individualizado por
índices y cuyo contenido esta compuesto del mismo tipo.

Ejemplo:
I Vector: Estructura de datos unidimensional.

I Matriz: Estructura de datos bidimensional.

I Cubos: Estructura de datos multidimensional

Algoritmo 1: Calcula la posición de los índices en la memoria


I Pos1 := Dirección Inicial
I Pos2 := Dirección Inicial + Tamaño Elemento
I Pos3 := Dirección Inicial + (2 *Tamaño Elemento)
I Pos4 := Dirección Inicial + (3 * Tamaño Elemento)
I ...
I Posn := Dirección Inicial + ((n-1) * Tamaño Elemento)

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 11 / 32


Ejemplo:

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 12 / 32


Ejemplo:
I En C un vector tiene como sintáxis:
Tipo Dato Nombre Vector [Tamaño Vector]

int i[4 ]; char c[3];


i[0] = 25; c[0] = a;
i[1] = 47 c[1] = b;
i[2] = 83; c[2] = c;
i[3] = 35;

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 12 / 32


Ejemplo:
I En C un vector tiene como sintáxis:
Tipo Dato Nombre Vector [Tamaño Vector]

int i[4 ]; char c[3];


i[0] = 25; c[0] = a;
i[1] = 47 c[1] = b;
i[2] = 83; c[2] = c;
i[3] = 35;

I En la memoria los vectores son representados como:

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 12 / 32


José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 13 / 32
Un puntero es una variable que contiene una dirección de memoria.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 14 / 32


Un puntero es una variable que contiene una dirección de memoria.

Un puntero es un tipo de dato como int, float o char. La diferencia del


puntero en relación a otros tipos de datos, es que una variable que sea
puntero guarda una dirección de memoria.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 14 / 32


Un puntero es una variable que contiene una dirección de memoria.

Un puntero es un tipo de dato como int, float o char. La diferencia del


puntero en relación a otros tipos de datos, es que una variable que sea
puntero guarda una dirección de memoria.

De este modo, por medio de la dirección es posible accesar a la


información, es decir, la variable puntero apunta a una posición de
memoria.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 14 / 32


Un puntero es una variable que contiene una dirección de memoria.

Un puntero es un tipo de dato como int, float o char. La diferencia del


puntero en relación a otros tipos de datos, es que una variable que sea
puntero guarda una dirección de memoria.

De este modo, por medio de la dirección es posible accesar a la


información, es decir, la variable puntero apunta a una posición de
memoria.

Problema con el puntero es: Entender cuando se esta trabajando con su


valor, es decir, la dirección; y cuando se esta trabajando con la
información apuntada por el.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 14 / 32


Ejemplo:
int x, y;
init *p;
x = *p;
*p = y;

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 15 / 32


Ejemplo:
int x, y;
init *p;
x = *p;
*p = y;
I x = *p; : Atribuye o asigna al valor de x, el valor de la dirección de memoria
referenciado por p.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 15 / 32


Ejemplo:
int x, y;
init *p;
x = *p;
*p = y;
I x = *p; : Atribuye o asigna al valor de x, el valor de la dirección de memoria
referenciado por p.
I *p = y; : Atribuye al espacio de memoria referenciado por p, el valor de y.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 15 / 32


Ejemplo:
int x, y;
init *p;
x = *p;
*p = y;
I x = *p; : Atribuye o asigna al valor de x, el valor de la dirección de memoria
referenciado por p.
I *p = y; : Atribuye al espacio de memoria referenciado por p, el valor de y.

Ejemplo:

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 15 / 32


Ejemplo:

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 16 / 32


Alcance

Los primeros computadores tenian memorias muy limitadas comparado


con los estandares actuales, de algunos kilobytes (millares de bytes) a
algunas centenas de kilobytes.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 17 / 32


Alcance

Los primeros computadores tenian memorias muy limitadas comparado


con los estandares actuales, de algunos kilobytes (millares de bytes) a
algunas centenas de kilobytes.

Para permitir que los programadores reutilizen el mismo identificador


dentro de un programa, se usa el concepto de alcance de un nombre.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 17 / 32


Alcance

Los primeros computadores tenian memorias muy limitadas comparado


con los estandares actuales, de algunos kilobytes (millares de bytes) a
algunas centenas de kilobytes.

Para permitir que los programadores reutilizen el mismo identificador


dentro de un programa, se usa el concepto de alcance de un nombre.

Definición: El alcance de un nombre es el conjunto de comandos que


pueden acessar a ese enlace de nombre.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 17 / 32


Alcance

Los primeros computadores tenian memorias muy limitadas comparado


con los estandares actuales, de algunos kilobytes (millares de bytes) a
algunas centenas de kilobytes.

Para permitir que los programadores reutilizen el mismo identificador


dentro de un programa, se usa el concepto de alcance de un nombre.

Definición: El alcance de un nombre es el conjunto de comandos que


pueden acessar a ese enlace de nombre.

Definición: En el alcance estático, el nombre es enlazado a una colección


de comandos de acuerdo con su posición en el programa fuente.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 17 / 32


El alcance estático puede ser ejecutado en tiempo de compilación y es
independiente de la ejecución del programa. Este alcance mejora la
legibilidad y permite un mejor nivel de verificación en tiempo de
compilación.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 18 / 32


El alcance estático puede ser ejecutado en tiempo de compilación y es
independiente de la ejecución del programa. Este alcance mejora la
legibilidad y permite un mejor nivel de verificación en tiempo de
compilación.

Ejemplo:
C/C++, Java, Python y Ada, usan alcance estático. Este alcance esta
basado en la estructura gramatical de un programa, por eso es llamado
alcance léxico.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 18 / 32


El alcance estático puede ser ejecutado en tiempo de compilación y es
independiente de la ejecución del programa. Este alcance mejora la
legibilidad y permite un mejor nivel de verificación en tiempo de
compilación.

Ejemplo:
C/C++, Java, Python y Ada, usan alcance estático. Este alcance esta
basado en la estructura gramatical de un programa, por eso es llamado
alcance léxico.

En la mayoria de los LPs, los alcances pueden ser anidados.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 18 / 32


La tabla siguiente es un intento que resume la cuestión de lo que
constituye un alcance para LPs importantes.

LP/ Cualidades Algol C Java Ada


Paquete no soporta no soporta si si
Clase no soporta no soporta anidado si
Función anidado si si anidado
Bloque anidado anidado anidado anidado
for no no si automático

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 19 / 32


La tabla siguiente es un intento que resume la cuestión de lo que
constituye un alcance para LPs importantes.

LP/ Cualidades Algol C Java Ada


Paquete no soporta no soporta si si
Clase no soporta no soporta anidado si
Función anidado si si anidado
Bloque anidado anidado anidado anidado
for no no si automático

Donde:

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 19 / 32


La tabla siguiente es un intento que resume la cuestión de lo que
constituye un alcance para LPs importantes.

LP/ Cualidades Algol C Java Ada


Paquete no soporta no soporta si si
Clase no soporta no soporta anidado si
Función anidado si si anidado
Bloque anidado anidado anidado anidado
for no no si automático

Donde:
I Paquetes y clases: El LP no soporta paquetes ni clases, de modo que la
cuestión no es aplicable.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 19 / 32


La tabla siguiente es un intento que resume la cuestión de lo que
constituye un alcance para LPs importantes.

LP/ Cualidades Algol C Java Ada


Paquete no soporta no soporta si si
Clase no soporta no soporta anidado si
Función anidado si si anidado
Bloque anidado anidado anidado anidado
for no no si automático

Donde:
I Paquetes y clases: El LP no soporta paquetes ni clases, de modo que la
cuestión no es aplicable.

I Funciones: Constituyen un alcance, pero no pueden ser anidados.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 19 / 32


La tabla siguiente es un intento que resume la cuestión de lo que
constituye un alcance para LPs importantes.

LP/ Cualidades Algol C Java Ada


Paquete no soporta no soporta si si
Clase no soporta no soporta anidado si
Función anidado si si anidado
Bloque anidado anidado anidado anidado
for no no si automático

Donde:
I Paquetes y clases: El LP no soporta paquetes ni clases, de modo que la
cuestión no es aplicable.

I Funciones: Constituyen un alcance, pero no pueden ser anidados.

I Bloques: Existe una lista de comandos dentro de llaves. El bloque constituye


un alcance y pueden ser anidados.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 19 / 32


La tabla siguiente es un intento que resume la cuestión de lo que
constituye un alcance para LPs importantes.

LP/ Cualidades Algol C Java Ada


Paquete no soporta no soporta si si
Clase no soporta no soporta anidado si
Función anidado si si anidado
Bloque anidado anidado anidado anidado
for no no si automático

Donde:
I Paquetes y clases: El LP no soporta paquetes ni clases, de modo que la
cuestión no es aplicable.

I Funciones: Constituyen un alcance, pero no pueden ser anidados.

I Bloques: Existe una lista de comandos dentro de llaves. El bloque constituye


un alcance y pueden ser anidados.

I for:

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 19 / 32


Ejemplo:
Alcance en C:

(1) void sort(float a[ ], int size {


(2) int i, j;
(3) for (i = 0; i < size; i++)
(4) for (j = i + 1; j < size; j++)
(5) if (a[j] < a[i]) {
(6) float t;
(7) t = a[i];
(8) a[i] = a[j];
(9) a[j] = t;
(10) }
(11) }

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 20 / 32


Ejemplo:
Alcance en C:

(1) void sort(float a[ ], int size {


(2) int i, j;
(3) for (i = 0; i < size; i++)
(4) for (j = i + 1; j < size; j++)
(5) if (a[j] < a[i]) {
(6) float t;
(7) t = a[i];
(8) a[i] = a[j];
(9) a[j] = t;
(10) }
(11) }
I El alcance de t incluye las lineas 6-9, donde todas las referencias para t son
locales. De este modo, t solamente puede ser referenciado por los
comandos entre las líneas 5 y 10

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 20 / 32


Ejemplo:
Un tipo de alcance en C++/ Java es el comando for, en el que una
nueva variable de control puede ser declarada. En este caso, el alcance
de la variable queda limitado al cuerpo del lazo:
for (int i = 0; i < 10; i++) {
System.out.println(i);
...
}
. . . i . . . // referencia invalida para i

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 21 / 32


Ejemplo:
Un tipo de alcance en C++/ Java es el comando for, en el que una
nueva variable de control puede ser declarada. En este caso, el alcance
de la variable queda limitado al cuerpo del lazo:
for (int i = 0; i < 10; i++) {
System.out.println(i);
...
}
. . . i . . . // referencia invalida para i

I La referencia a i segun el cuerpo del lazo for es inválida, pues el alcance de


la variable i esta limitado al cuerpo del laco.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 21 / 32


Referencias
El ambiente de referencias es importante porque define la colección de
comandos, en los cuales un nombre puede ser válidamente referenciado.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 22 / 32


Referencias
El ambiente de referencias es importante porque define la colección de
comandos, en los cuales un nombre puede ser válidamente referenciado.

Definición: Para el alcance estático, el ambiente de referencia para un


nombre es su alcance definido y todos los subalcances anidados.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 22 / 32


Referencias
El ambiente de referencias es importante porque define la colección de
comandos, en los cuales un nombre puede ser válidamente referenciado.

Definición: Para el alcance estático, el ambiente de referencia para un


nombre es su alcance definido y todos los subalcances anidados.

Ejemplo:
Sean alcances anidados y disjuntos en los cuales existen tres
declaraciones del nombre i, dos de j y una de todos los otros. Las tablas
de nombres individuales para cada alcance se basan en:

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 22 / 32


Referencias
El ambiente de referencias es importante porque define la colección de
comandos, en los cuales un nombre puede ser válidamente referenciado.

Definición: Para el alcance estático, el ambiente de referencia para un


nombre es su alcance definido y todos los subalcances anidados.

Ejemplo:
Sean alcances anidados y disjuntos en los cuales existen tres
declaraciones del nombre i, dos de j y una de todos los otros. Las tablas
de nombres individuales para cada alcance se basan en:
I Alcance externo consiste de dos variables declaradas en la línea 1 mas las
tres funciones:
< h, 1 >, < i, 1 >, < B, 2 >, < A, 8 >, < main, 14 >

I Alcance de la función B contiene el parámetro mas las dos variables de la


línea 3:
< w, 2 >, < j, 3 >, < k , 3 >

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 22 / 32


Referencias
El ambiente de referencias es importante porque define la colección de
comandos, en los cuales un nombre puede ser válidamente referenciado.

Definición: Para el alcance estático, el ambiente de referencia para un


nombre es su alcance definido y todos los subalcances anidados.

Ejemplo:
Sean alcances anidados y disjuntos en los cuales existen tres
declaraciones del nombre i, dos de j y una de todos los otros. Las tablas
de nombres individuales para cada alcance se basan en:
I Alcance externo consiste de dos variables declaradas en la línea 1 mas las
tres funciones:
< h, 1 >, < i, 1 >, < B, 2 >, < A, 8 >, < main, 14 >

I Alcance de la función B contiene el parámetro mas las dos variables de la


línea 3:
< w, 2 >, < j, 3 >, < k , 3 >
I Alcance de la función A consiste de los dos parámetros de la línea 8 mas la
declaración de la línea 9:
< x, 8 >, < y , 8 >, < i, 9 >, < j, 9 >
José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 22 / 32
(1) int h, i;
(2) void B( int w) {
(3) int j, k;
(4) i = 2*w;
(5) w = w + 1;
(6) ...
(7) }

(8) void A ( int x, int y) {


(9) float i, j;
(10) B(h);
(11) i = 3;
(12) ...
(13) }

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 23 / 32


(14) void main( ) {
(15) int a, b;
(16) h = 5; a = 3; b = 2;
(17) A(a, b);
(18) B(h);
(19) ...
(20) }

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 24 / 32


(14) void main( ) {
(15) int a, b;
(16) h = 5; a = 3; b = 2;
(17) A(a, b);
(18) B(h);
(19) ...
(20) }

Ejemplo (cont.)

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 24 / 32


(14) void main( ) {
(15) int a, b;
(16) h = 5; a = 3; b = 2;
(17) A(a, b);
(18) B(h);
(19) ...
(20) }

Ejemplo (cont.)
I El alcance de la función main consiste de dos variables declaradas en la
línea 15:
< a, 15 >, < b, 15 >

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 24 / 32


Ejemplo (cont.)

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 25 / 32


Ejemplo (cont.)
I Cuando estas funciones se compilan, la pila de la tabla de símbolos para
cada función tendra el contenido siguiente:

Función Pila de tabla de símbolos


B < w, 2 >, < j, 3 >, < k , 3 >, < h, 1 >, < i, 1 >, < B, 2 >, < A, 8 >, < main, 14 >

A < x, 8 >, < y , 8 >, < i, 9 >, < j, 9 >, < h, 1 >, < i, 1 >, < B, 2 >, < A, 8 >, < main, 14 >

main < a, 15 >, < b, 15 >, < h, 1 >, < i, 1 >, < B, 2 >, < A, 8 >, < main, 14 >

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 25 / 32


Ejemplo (cont.)
I Cuando estas funciones se compilan, la pila de la tabla de símbolos para
cada función tendra el contenido siguiente:

Función Pila de tabla de símbolos


B < w, 2 >, < j, 3 >, < k , 3 >, < h, 1 >, < i, 1 >, < B, 2 >, < A, 8 >, < main, 14 >

A < x, 8 >, < y , 8 >, < i, 9 >, < j, 9 >, < h, 1 >, < i, 1 >, < B, 2 >, < A, 8 >, < main, 14 >

main < a, 15 >, < b, 15 >, < h, 1 >, < i, 1 >, < B, 2 >, < A, 8 >, < main, 14 >

I Con estas informaciones, se puede resolver las referencias no-locales o


definidas multiplemente:

Línea Referencia Declaración


4 i 1
10 h 1
11 i 9
16, 18 h 1

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 25 / 32


Tiempo de vida

Los primeros lenguajes imperativos usaban asignación estática tanto para


variables como para funciones, es decir, la memoria a ser usada era atribuída
en tiempo de compilación.
La asignación estática:

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 26 / 32


Tiempo de vida

Los primeros lenguajes imperativos usaban asignación estática tanto para


variables como para funciones, es decir, la memoria a ser usada era atribuída
en tiempo de compilación.
La asignación estática:
I Sucede en tiempo de compilación, es decir, en el momento en que se define
una variable o estructura es necesario que se definan su tipo y tamaño.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 26 / 32


Tiempo de vida

Los primeros lenguajes imperativos usaban asignación estática tanto para


variables como para funciones, es decir, la memoria a ser usada era atribuída
en tiempo de compilación.
La asignación estática:
I Sucede en tiempo de compilación, es decir, en el momento en que se define
una variable o estructura es necesario que se definan su tipo y tamaño.

I En este tipo de asignación, al colocar el programa en ejecución, la memoria


necesaria para usar las variables y estructuras estáticas necesita ser
reservada y debe quedar disponible hasta el fin del programa.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 26 / 32


La asignación dinámica:

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 27 / 32


La asignación dinámica:
I Sucede en tiempo de ejecución, es decir, las variables y estructuras son
declaradas sin necesidad de definir su tamaño, pues ninguna memoria
será reservada al colocar el programa en ejecución.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 27 / 32


La asignación dinámica:
I Sucede en tiempo de ejecución, es decir, las variables y estructuras son
declaradas sin necesidad de definir su tamaño, pues ninguna memoria
será reservada al colocar el programa en ejecución.

I Durante la ejecución del programa, en el momento en que una variable o


parte de una estructura necesite ser utilizada, su memoria será reservada y,
en el momento en que no fuese necesaria, debe ser liberada. Esto se
efectúa con comandos que permiten reservar y/o liberar memoria.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 27 / 32


Ejemplos:

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 28 / 32


Ejemplos:
I Los vectores y matrices son estructuras estáticas.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 28 / 32


Ejemplos:
I Los vectores y matrices son estructuras estáticas.

I Las estructuras encadenadas dinámicas tienen tamaño variable, pues a


diferencia de los vectores, su memoria es reservada por elemento y no para
toda la estructura.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 28 / 32


Ejemplos:
I Los vectores y matrices son estructuras estáticas.

I Las estructuras encadenadas dinámicas tienen tamaño variable, pues a


diferencia de los vectores, su memoria es reservada por elemento y no para
toda la estructura.

En C la asignación se hace con las funciones:

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 28 / 32


Ejemplos:
I Los vectores y matrices son estructuras estáticas.

I Las estructuras encadenadas dinámicas tienen tamaño variable, pues a


diferencia de los vectores, su memoria es reservada por elemento y no para
toda la estructura.

En C la asignación se hace con las funciones:


I malloc: Permite efectuar la asignación de una nueva área de memoria para
una estructura.
void* malloc(int qty bytes alloc)

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 28 / 32


Ejemplos:
I Los vectores y matrices son estructuras estáticas.

I Las estructuras encadenadas dinámicas tienen tamaño variable, pues a


diferencia de los vectores, su memoria es reservada por elemento y no para
toda la estructura.

En C la asignación se hace con las funciones:


I malloc: Permite efectuar la asignación de una nueva área de memoria para
una estructura.
void* malloc(int qty bytes alloc)

I calloc: Igual funcionalidad de malloc, excepto que se debe ofrecer el tamaño


de la área y la cantidad de elementos.
void* calloc(int qty, int size)

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 28 / 32


Ejemplos:
I Los vectores y matrices son estructuras estáticas.

I Las estructuras encadenadas dinámicas tienen tamaño variable, pues a


diferencia de los vectores, su memoria es reservada por elemento y no para
toda la estructura.

En C la asignación se hace con las funciones:


I malloc: Permite efectuar la asignación de una nueva área de memoria para
una estructura.
void* malloc(int qty bytes alloc)

I calloc: Igual funcionalidad de malloc, excepto que se debe ofrecer el tamaño


de la área y la cantidad de elementos.
void* calloc(int qty, int size)

I free: Libera una área asignada previamente con las funciones malloc, calloc
o realloc.
free(void * pointer)

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 28 / 32


Elementos de configuraciones computacionales que imponen
condiciones a los planificadores de LP:

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 29 / 32


Elementos de configuraciones computacionales que imponen
condiciones a los planificadores de LP:
I En el caso de funciones: Habia una única área de memoria tanto para
argumentos como para la dirección de retorno; por este motivo, las
funciones recursivas no eran soportadas.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 29 / 32


Elementos de configuraciones computacionales que imponen
condiciones a los planificadores de LP:
I En el caso de funciones: Habia una única área de memoria tanto para
argumentos como para la dirección de retorno; por este motivo, las
funciones recursivas no eran soportadas.

I En el caso de variables: En caso de que se excediese la cantidad de


memoria requerida, el trabajo de gerenciar la memoria era responsabilidad
del programador.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 29 / 32


Elementos de configuraciones computacionales que imponen
condiciones a los planificadores de LP:
I En el caso de funciones: Habia una única área de memoria tanto para
argumentos como para la dirección de retorno; por este motivo, las
funciones recursivas no eran soportadas.

I En el caso de variables: En caso de que se excediese la cantidad de


memoria requerida, el trabajo de gerenciar la memoria era responsabilidad
del programador.

Con el desarrollo de Algol se tuvo la noción de que la memoria para las


variables, incluyendo parámetros de funciones y direcciones de retorno,
deberia ser asignada y no asignada en tiempo de execución, cuando se
entre o saliese de un alcance. La administración basica de memoria
usado por los LPs actuales se fundamenta en este concepto.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 29 / 32


Definición: El tiempo de vida de una variable es el intervalo de tiempo
durante el cual la variable tiene un bloque de memoria asignado para si.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 30 / 32


Definición: El tiempo de vida de una variable es el intervalo de tiempo
durante el cual la variable tiene un bloque de memoria asignado para si.

Ejemplo:

(1) void sort(float a[ ], int size {


(2) int i, j;
(3) for (i = 0; i < size; i++)
(4) for (j = i + 1; j < size; j++)
(5) if (a[j] < a[i]) {
(6) float t;
(7) t = a[i];
(8) a[i] = a[j];
(9) a[j] = t;
(10) }
(11) }

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 30 / 32


Definición: El tiempo de vida de una variable es el intervalo de tiempo
durante el cual la variable tiene un bloque de memoria asignado para si.

Ejemplo:

(1) void sort(float a[ ], int size {


(2) int i, j;
(3) for (i = 0; i < size; i++)
(4) for (j = i + 1; j < size; j++)
(5) if (a[j] < a[i]) {
(6) float t;
(7) t = a[i];
(8) a[i] = a[j];
(9) a[j] = t;
(10) }
(11) }

I En el código analizando la variable t, vemos que en cada del lazo para j,


cualquier memoria que pueda ser asignada para t también es no asignada.
Para este caso, la no asignación no es problema, ya que t no necesita
recordar su valor.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 30 / 32


Modelos de lenguajes de programación: Principio 2.1

1 Nombres
Cuestiones sintácticas
Variables
Alcance
Referencias
Tiempo de vida

2 Ejercicios

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 31 / 32


Ejercicios

(1) C y C++ distinguen declaraciones y definiciones. ¿Qué es una distinción


?. Dar un ejemplo para cada una de ellas.

(2) Explicar el uso de archivos de cabecera en C y C++. ¿Porqué Java no


usa archivos de cabecera ?

(3) Investigar que tipos de datos de hardware existen en un computador y


que operaciones se pueden ejecutar con ellos.

(4) Explicar con detalle como es la programación con punteros.

(5) Investigar sobre el uso de la memoria en el lenguaje de programación


java.

(6) Proporcione un ejemplo de como usar malloc, calloc y free en el LP C.

José A. Rodríguez Melquiades Modelos de lenguajes de programación 11 de febrero de 2018 32 / 32