Apuntes de Programación y estructuras de datos. Control ...pred/control_datos2.pdf · Control de...
Transcript of Apuntes de Programación y estructuras de datos. Control ...pred/control_datos2.pdf · Control de...
Apuntes de Programación y estructuras dedatos. Control de datos
Nikos Mylonakis, Fernando Orejas y Ana Cristina Zoltan
Dept. Llenguatges i Sistemes Informatics Universitat Politecnica de Catalunya
Barcelona
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.1/33
Contenido
• Relación identificadores con su entidad denotada• Ambito, visibilidad y vida de los identificadores• Lenguajes con estructura de bloques• Módulos• Lenguajes orientados a objetos
• Paso de parámetros
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.2/33
• Un identificador puede denotar constantes, tipos,variables, parámetros, subprogramas, módulos,etc
• En general un identificador puede denotar más deuna entidad en un programa
• Esto es debido a que los identificadores no sonvisibles en todas las partes de un programa
• Un identificador es visible en una parte delprograma si se puede utilizar en esa parte
• Ejemplo: Una variable es visible en unsubprobgrama si está declarada como variablelocal o parámetro
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.3/33
• El ámbito (scope) de un identificador es la zonadel programa donde es visible
• El ámbito puede ser estático o dinámico• El ámbito estático se define en las partes del
programa escrito• El ámbito dinámico se define en el flujo de
ejecución del programa y sus subprogramas
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.4/33
• La vida de un identificador es el intervalo detiempo que va desde que nace hasta quedesaparece
• La entidad denotada por un identificador puede noser visible en una parte del programa pero estarviva
• Ejemplo: Subprogramas imbricados de Pascal convariables locales con el mismo nombre
• Dado un identificador determinar a qué entidadnos referimos depende de las reglas de ámbito yvisibilidad 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 definir subrprogramas y bloquesanidados
• Regla de visibilidad estática: Toda entidad esvisible en el bloque que se declara y en susbloques internos
• En caso de ambigüedad se utiliza el identificadordefinido más cerca entre los bloques quecontienen al bloque donde se utiliza el identificador
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.6/33
• Lo que hace el compilador de estos lenguajesdado una referencia a un identificador es buscarloen la estructura de bloques del más anidado almás externo
• Los lenguajes que usan la regla de visibilidadanterior no tienen visibilidad dinámica
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.7/33
• Si la regla de visibilidad fuese dinámica lasreferencias se determinan en tiempo de ejecución
• La búsqueda de la declaración de la referencia serealiza por la secuencia de llamadas y no por laestructura estática de los bloques
• Ejemplos de lenguajes con reglas de visibilidaddinámica son Lisp y Java (éste último sólo parasubprogramas y con limitaciones(methods) y novariables)
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.8/33
Módulos
• Los lenguajes de programación tipo Pascalpermitían el uso de variables globales para pasarinformación entre bloques
• Esto se considera que dificulta la legibilidad• Los lenguajes modulares evitaron esto• Un lenguaje modular tiene estructura de bloques
normalmente restringida y unidades llamadasmódulos (Las clases de Java son módulos)
• Un módulo sirve para encapsular tipos ysubprogramas
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.9/33
• Todo tipo o subprograma declarado en un móduloes visible dentro de éste
• Además un módulo puede importar o usar tipos ysubprogramas de otros módulos
• Nada impide que dentro de un módulo hayaestructura de bloques
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.10/33
• Los lenguajes con módulos también permitenrestringir el acceso a ciertas declaraciones delmódulo (en Java private)
• En caso de ambigüedad al referenciar a unidentificador primero se intenta resolver entre losidentificadores definidos en el módulo
• Si no existe declaración del identificadorreferenciado en el módulo se busca en losmódulos importados.
• Si hay varias declaraciones en módulos diferentesse ha de referenciar precediendo el nombre delmódulo (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, módulos(clases) y además herencia con subclases
• Nosotros utilizaremos una notación similar a la deJava o C++
• Veamos como ejemplo la definición de lista deenteros usando esta nueva notación
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.12/33
claseNodo
valor : entero;
sig :↑ Nodo;
fclase
claseLista_enteros
l :↑ Nodo
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 definir el tipo Cola_enteros lo podemos hacer
como subclase de lista de enteros•
claseCola_enteros
es subclasedeLista_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 yc : Cola_enteros
• Si hacemos l.insertar_entero(5) y l.borrar_entero(6)se ejecutan las acciones definidas en Lista_enteros
• Si hacemos c.insertar_entero(5) se ejecuta laacción de Lista_entero y al hacerc.borrar_elemento(6) se ejecuta la acción deCola_enteros.
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.15/33
• Ejemplo 2: Supongamos que tenemos unaempresa con 3 clases de trabajadores: directivos,ejecutivos y administrativos
• Queremos tener una base de datos de lostrabajadores y calcular el salario y los impuestosde todos los trabajadores
• El salario de los directivos depende de losbeneficios de la empresa, los ejecutivos tienengratificaciones eventuales y los administrativostienen sueldo fijo
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.16/33
• Para ello definiríamos los tiposLista_Trabajadores, Trabajador y los tiposdirectivos, ejecutivos y administrativos comosubclase de la clase trabajador
• Las subclases de trabajadores tendrían unaoperación específica para el cálculo del salario
• La acción Calcular_salarios recorrería la lista detrabajadores y para cada trabajador realizaría lallamada a la acción salarios
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.17/33
• En tiempo de compilación no sabemos qué acciónse ejecutará.
• En tiempo de ejecución en función de la subclasedel trabajador se ejecutará una acción salario uotra
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.18/33
Regla de visibilidad con subclases
• Si una operación f es redefinida en una subclasede una clase y es llamada por un objeto seutilizará la función f de la subclase más cercana altipo del objeto en la jerarquía de subclases
• Si SC es subclase de C y oc : C, osc : SC, alrealizar la asignación oc := osc (la asignaciónosc := oc no se puede realizar), esto tiene lassiguientes implicaciones:
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.19/33
• oc continúa teniendo el tipo C.• Sólo los atributos de la clase C se actualizan con
los valores de osc en oc.• También sólo podemos utilizar las operaciones de
C con parámetro implícito oc y por asociacióndinámica de los métodos redefinidos, se utilizaránlas operaciones redefinidas de SC.
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.20/33
• Además existen mecanismos para ocultar lasvariables y los métodos definidos en una clase
• En Java podemos escribir
classA{
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 elpackage
• Si ponemos public int p la variable es visible desdecualquier parte del programa
• Si ponemos protected int p la puede ver todo elpackage y cualquier subclase de A
• Si ponemos private int p sólo 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 porfunciones miembros de cualquier clase.
• Las declaraciones protected son visibles porfunciones miembros y amigas de la misma clase ode sus subclases
• Las declaraciones private son visibles porfunciones miembros y amigas de la misma clase
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.23/33
La relación de subclase se define comoclassSC : public |protected |privateC, . . . {. . .} dondeC es la clase de la cual hereda SC.
• Si no se especifica el tipo de acceso es como sifuera privado que definiremos a continuación.
• Acceso public: Todos los miembros public yprotected de la clase C son heredadosconservando su acceso, mientras que losmiembros private no son accesibles.
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.24/33
• Acceso private:Todos los miembros public yprotected de la clase C son heredados con accesoprivate mientras que los miembros private no sonaccesibles.
• Acceso protected: Todos los miembros public yprotected de la clase C son heredados con accesoprotected mientras que los miembros private noson accesibles.
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.25/33
Herencia múltiple
• En lenguajes como C++ y Lisp se permite laherencia múltiple
• Ejemplo:
claseC1 claseC2 claseC3...
... es subclasedeC1, C2
fclase fclase fclase
• La herencia múltiple tiene problemas adicionales.Ejemplo: Si en C3 se referencia f pero no estadeclarada en C3 pero sí en C1 y C2 qué fescogemos. En Java no existe herencia múltiplepor seguridad
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.26/33
Paso de parámetros
• Un subprograma contiene un identificador para serllamado y parámetros formales
• La llamada de un subprograma contiene elidentificador y parámetros reales, actuales oargumentos
• Mecanismo que permite pasar datos entreunidades de programas (subprogramas, módulos,procesos, etc)
• Los subprogramas pueden tener parámetros deentrada, salida y entrada/salida
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.27/33
• Los parámetros de entrada sirven para transferirinformación del subprograma principal alsubprograma llamado
• Los parámetros de salida sirven para transferirinformación del subprograma llamado alsubprograma principal después de ejecutar elsubprograma llamado
• Los parámetros de entrada/salida sirven paratransferir información en ambos sentidos
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.28/33
Implementación de paso deparámetros
• Recordamos que en subprogramas tenemos ladefinición (accionP (. . . x : entero)) y la llamadaP (exp)
• Las diferentes implementaciones de pasos deparámetros difieren en lo que denota exp.
• Si exp denota el valor obtenido al evaluar laexpresion el paso de parámetros es por valor. Siademás se permite devolver resultados es porvalor-resultado.
• Este mecanismo requiere copia de valores deparámetro real o argumento a parámetro formal yviceversa si es por valor-resultado. Ineficiente silos valores son muy grandes Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.29/33
• Cuando exp denota una dirección de memoria oreferencia el paso de parámetros es por referencia
• En este caso el parámetro formal pasa a ser unalias de la dirección de memoria del parámetroreal
• Necesariamente exp ha de ser una expresión quedenota una variable
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.30/33
• Cuando exp denota la expresión sin evaluar elpaso de parámetros es por nombre (anecdótico)
• Ejemplo
Accion principal accion inic(x : entero)
var i : entero Para i := 1hasta 100hacer
T : tabla [1..100]de entero x := 0
fvar fpara
inic(T [i]) faccion
• El efecto de la ejecución de este programa es quetoda la tabla se inicializa a 0
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.31/33
En diferentes LP el tipo de paso de parámetros quetenemos es el siguiente
• Pascal: Paso por valor sólo se indica el parámetroy el paso por referencia requiere la palabra clavevar delante del parámetro
• Ada: Tiene tres clases diferenciadas por laspalabras claves in, out e inout. Cada compiladorlas implementa como quiere
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.32/33
• Fortran Lo decide el compilador. Generalmente lostipos estructurados (ej. tablas) se pasan porreferencia
• Java Siempre es por valor. Esto implica que lostipos básicos se pasan por valor y con el resto hayque tener en cuenta que lo que se realiza es unacopia de la referencia que denota el parámetroreal al parámetro formal
• C++ Paso por valor y por referencia
Nikos Mylonakis, UPC (Spain) March 4, 2010 – p.33/33