Está en la página 1de 33

Apuntes de Programacin y estructuras de datos.

Control de datos
Nikos Mylonakis, Fernando Orejas y Ana Cristina Zoltan
nicos@lsi.upc.edu

Dept. Llenguatges i Sistemes Informatics Universitat Politecnica de Catalunya Barcelona

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.1/33

Contenido

Relacin identicadores con su entidad denotada


Ambito, visibilidad y vida de los identicadores Lenguajes con estructura de bloques Mdulos Lenguajes orientados a objetos

Paso de parmetros

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.2/33

Un identicador puede denotar constantes, tipos, variables, parmetros, subprogramas, mdulos, etc En general un identicador puede denotar ms de una entidad en un programa Esto es debido a que los identicadores no son visibles en todas las partes de un programa Un identicador es visible en una parte del programa si se puede utilizar en esa parte Ejemplo: Una variable es visible en un subprobgrama si est declarada como variable local o parmetro
Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.3/33

El mbito (scope) de un identicador es la zona del programa donde es visible El mbito puede ser esttico o dinmico El mbito esttico se dene en las partes del programa escrito El mbito dinmico se dene en el ujo de ejecucin del programa y sus subprogramas

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.4/33

La vida de un identicador es el intervalo de tiempo que va desde que nace hasta que desaparece La entidad denotada por un identicador puede no ser visible en una parte del programa pero estar viva Ejemplo: Subprogramas imbricados de Pascal con variables locales con el mismo nombre Dado un identicador determinar a qu entidad nos referimos depende de las reglas de mbito y visibilidad del tipo de lenguaje
Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.5/33

Lenguajes con estructura de bloques


Ejemplos de estos lenguajes son Algol60, Pascal, Ada, C, etc Permiten denir subrprogramas y bloques anidados Regla de visibilidad esttica: Toda entidad es visible en el bloque que se declara y en sus bloques internos En caso de ambigedad se utiliza el identicador denido ms cerca entre los bloques que contienen al bloque donde se utiliza el identicador

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.6/33

Lo que hace el compilador de estos lenguajes dado una referencia a un identicador es buscarlo en la estructura de bloques del ms anidado al ms externo Los lenguajes que usan la regla de visibilidad anterior no tienen visibilidad dinmica

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.7/33

Si la regla de visibilidad fuese dinmica las referencias se determinan en tiempo de ejecucin La bsqueda de la declaracin de la referencia se realiza por la secuencia de llamadas y no por la estructura esttica de los bloques Ejemplos de lenguajes con reglas de visibilidad dinmica son Lisp y Java (ste ltimo slo para subprogramas y con limitaciones(methods) y no variables)

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.8/33

Mdulos

Los lenguajes de programacin tipo Pascal permitan el uso de variables globales para pasar informacin entre bloques Esto se considera que diculta la legibilidad Los lenguajes modulares evitaron esto Un lenguaje modular tiene estructura de bloques normalmente restringida y unidades llamadas mdulos (Las clases de Java son mdulos) Un mdulo sirve para encapsular tipos y subprogramas
Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.9/33

Todo tipo o subprograma declarado en un mdulo es visible dentro de ste Adems un mdulo puede importar o usar tipos y subprogramas de otros mdulos Nada impide que dentro de un mdulo haya estructura de bloques

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.10/33

Los lenguajes con mdulos tambin permiten restringir el acceso a ciertas declaraciones del mdulo (en Java private) En caso de ambigedad al referenciar a un identicador primero se intenta resolver entre los identicadores denidos en el mdulo Si no existe declaracin del identicador referenciado en el mdulo se busca en los mdulos importados. Si hay varias declaraciones en mdulos diferentes se ha de referenciar precediendo el nombre del mdulo (Ej: M.x) (En algunos LP es obligatorio)
Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.11/33

Lenguajes orientados a objetos

Los LOO tienen estructura de bloques, mdulos (clases) y adems herencia con subclases Nosotros utilizaremos una notacin similar a la de Java o C++ Veamos como ejemplo la denicin de lista de enteros usando esta nueva notacin

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.12/33

clase N odo valor : entero; sig : N odo; fclase clase Lista_enteros l : N odo accion lista_vacia()... accion insertar_entero(n : entero)... accion borrar_entero(n : entero)... accion recorrido()

. . .
fclase
Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.13/33

Veamos ahora como funciona la herencia Para denir el tipo Cola_enteros lo podemos hacer como subclase de lista de enteros
clase Cola_enteros es subclase de Lista_enteros cola : Lista_enteros accion borrar_entero(n : entero)... fclase

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.14/33

Sean las variables l : Lista_enteros y c : Cola_enteros Si hacemos l.insertar_entero(5) y l.borrar_entero(6) se ejecutan las acciones denidas en Lista_enteros Si hacemos c.insertar_entero(5) se ejecuta la accin de Lista_entero y al hacer c.borrar_elemento(6) se ejecuta la accin de Cola_enteros.

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.15/33

Ejemplo 2: Supongamos que tenemos una empresa con 3 clases de trabajadores: directivos, ejecutivos y administrativos Queremos tener una base de datos de los trabajadores y calcular el salario y los impuestos de todos los trabajadores El salario de los directivos depende de los benecios de la empresa, los ejecutivos tienen graticaciones eventuales y los administrativos tienen sueldo jo

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.16/33

Para ello deniramos los tipos Lista_Trabajadores, Trabajador y los tipos directivos, ejecutivos y administrativos como subclase de la clase trabajador Las subclases de trabajadores tendran una operacin especca para el clculo del salario La accin Calcular_salarios recorrera la lista de trabajadores y para cada trabajador realizara la llamada a la accin salarios

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.17/33

En tiempo de compilacin no sabemos qu accin se ejecutar. En tiempo de ejecucin en funcin de la subclase del trabajador se ejecutar una accin salario u otra

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.18/33

Regla de visibilidad con subclases

Si una operacin f es redenida en una subclase de una clase y es llamada por un objeto se utilizar la funcin f de la subclase ms cercana al tipo del objeto en la jerarqua de subclases Si SC es subclase de C y oc : C , osc : SC , al realizar la asignacin oc := osc (la asignacin osc := oc no se puede realizar), esto tiene las siguientes implicaciones:

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.19/33

oc

contina teniendo el tipo C .

Slo los atributos de la clase C se actualizan con los valores de osc en oc. Tambin slo podemos utilizar las operaciones de C con parmetro implcito oc y por asociacin dinmica de los mtodos redenidos, se utilizarn las operaciones redenidas de SC .

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.20/33

Adems existen mecanismos para ocultar las variables y los mtodos denidos en una clase En Java podemos escribir
class A{ public | protected | private int p; }

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.21/33

Si no ponemos nada int p lo puede ver todo el package Si ponemos public int p la variable es visible desde cualquier parte del programa Si ponemos protected int p la puede ver todo el package y cualquier subclase de A Si ponemos private int p slo la puede ver A

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.22/33

En C++ las declaraciones se dividen en public, private y protected Las declaraciones public son visibles por funciones miembros de cualquier clase. Las declaraciones protected son visibles por funciones miembros y amigas de la misma clase o de sus subclases Las declaraciones private son visibles por funciones miembros y amigas de la misma clase

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.23/33

La relacin de subclase se dene como


class SC : public | protected | private C, . . . {. . .} donde C es la clase de la cual hereda SC .

Si no se especica el tipo de acceso es como si fuera privado que deniremos a continuacin. Acceso public: Todos los miembros public y protected de la clase C son heredados conservando su acceso, mientras que los miembros private no son accesibles.

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.24/33

Acceso private:Todos los miembros public y protected de la clase C son heredados con acceso private mientras que los miembros private no son accesibles. Acceso protected: Todos los miembros public y protected de la clase C son heredados con acceso protected mientras que los miembros private no son accesibles.

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.25/33

Herencia mltiple

En lenguajes como C++ y Lisp se permite la herencia mltiple Ejemplo:


clase C1 clase C2 clase C3

. . .
fclase

. . .
fclase

es subclase de C1, C2 fclase

La herencia mltiple tiene problemas adicionales. Ejemplo: Si en C3 se referencia f pero no esta declarada en C3 pero s en C1 y C2 qu f escogemos. En Java no existe herencia mltiple por seguridad
Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.26/33

Paso de parmetros

Un subprograma contiene un identicador para ser llamado y parmetros formales La llamada de un subprograma contiene el identicador y parmetros reales, actuales o argumentos Mecanismo que permite pasar datos entre unidades de programas (subprogramas, mdulos, procesos, etc) Los subprogramas pueden tener parmetros de entrada, salida y entrada/salida

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.27/33

Los parmetros de entrada sirven para transferir informacin del subprograma principal al subprograma llamado Los parmetros de salida sirven para transferir informacin del subprograma llamado al subprograma principal despus de ejecutar el subprograma llamado Los parmetros de entrada/salida sirven para transferir informacin en ambos sentidos

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.28/33

Implementacin de paso de parmetros

Recordamos que en subprogramas tenemos la denicin (accion P (. . . x : entero)) y la llamada


P (exp)

Las diferentes implementaciones de pasos de parmetros dieren en lo que denota exp. Si exp denota el valor obtenido al evaluar la expresion el paso de parmetros es por valor. Si adems se permite devolver resultados es por valor-resultado. Este mecanismo requiere copia de valores de parmetro real o argumento a parmetro formal y viceversa si es por valor-resultado. Ineciente si los valores son muy grandes
Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.29/33

Cuando exp denota una direccin de memoria o referencia el paso de parmetros es por referencia En este caso el parmetro formal pasa a ser un alias de la direccin de memoria del parmetro real Necesariamente exp ha de ser una expresin que denota una variable

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.30/33

Cuando exp denota la expresin sin evaluar el paso de parmetros es por nombre (anecdtico) Ejemplo
Accion principal var i : entero T : tabla [1..100] de entero fvar inic(T [i])

accion inic(x : entero) Para i := 1 hasta 100 hace x := 0 fpara faccion

El efecto de la ejecucin de este programa es que toda la tabla se inicializa a 0


Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.31/33

En diferentes LP el tipo de paso de parmetros que tenemos es el siguiente


Pascal:

Paso por valor slo se indica el parmetro y el paso por referencia requiere la palabra clave var delante del parmetro

Ada:

Tiene tres clases diferenciadas por las palabras claves in, out e inout. Cada compilador las implementa como quiere

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.32/33

Fortran

Lo decide el compilador. Generalmente los tipos estructurados (ej. tablas) se pasan por referencia Siempre es por valor. Esto implica que los tipos bsicos se pasan por valor y con el resto hay que tener en cuenta que lo que se realiza es una copia de la referencia que denota el parmetro real al parmetro formal Paso por valor y por referencia

Java

C++

Nikos Mylonakis, UPC (Spain)

March 4, 2010 p.33/33