Apuntes de Programación y estructuras de datos. Tipos de datos



Documentos relacionados
Apuntes de Programación y estructuras de datos. Control de datos

Aspectos de los LP. Diseño de compiladores. Estático vs. Dinámico. Estático vs. Dinámico. Scope. Scope 24/03/2015

Expresión, Operador, Operando, Asignación, Prioridad

Tema 3. Programación orientada a objetos en Java (Parte 1)

Tema 7: Polimorfismo. Índice

Modulo 11. Clases y Objetos en Java

1.2. Es Java un lenguaje ideal para aprender a programar? 1.4. Cuáles son las versiones y distribuciones Java y cuál usar?

Introducción a la programación orientada a objetos

TEMA 1 FUNDAMENTOS DE PROGRAMACIÓN

Tema 4 Genericidad en Java. Programación Orientada a Objetos Curso 2013/2014

POO - Programación Orientada a Objetos

Algoritmos y Diagramas de flujo

La sintaxis básica para definir una clase es la que a continuación se muestra:

CLAVE ASIGNATURA REQUISITOS HORA/SEMANA CREDITOS TI-8 PROGRAMACION II 80% DE ASISTENCIA 4 6

CURSO DE LENGUAJE C. 4.1 Conceptos básicos de funciones 4.2 Funciones que regresan valores no enteros 4.3 Variables externas 4.4 Reglas de alcance

Diseño de algoritmos paralelos

Tema 2. Variables, ámbitos y comprobación de tipos

Declaración de variables. Sentencias de entrada/salida

ANÁLISIS SEMÁNTICO VERIFICACIÓN DE TIPOS

Programación Orientada a Objetos. Sesión 4: Herencia

Introducción a Java. Fernando Cerezal López. 24 Noviembre 2005

UNIVERSIDAD SAN MARCOS

REPASO ARRAYS MULTIDIMENSIONALES EN JAVA. DECLARACIÓN Y USO. EJEMPLOS Y EJERCICIOS RESUELTOS. (CU00905C)

3. Tipos primitivos de dato

Herencia. Implementación en Java

UNIDAD 2 COMPUERTAS LOGICAS

Práctica 2. Reutilización de código Elementos básicos del lenguaje Java Definición de variables, expresiones y asignaciones

APUNTES PARA LENGUAJES Y COMPILADORES

Qué es Java? Un lenguaje de programación Un entorno de desarrollo Un entorno de aplicación Un entorno de despliegue Es similar en sintaxis de C + +.

CONTENIDOS. La herencia permite: - Adoptar automáticamente características ya implementadas. Ahorro de tiempo y esfuerzo

Operando1 operador de relación Operando2

descripción del argumento identificador tipo longitud condición restricción

FUNDAMENTOS DE INFORMÁTICA

METODOS, SOBRECARGA Y CONSTRUCTORES

El lenguaje C. 1. Estructuras. Principios de Programación Definicion de estructuras

Problemas de Recursividad

CAPÍTULO 1 INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS

Procesadores de lenguaje Tema 5 Comprobación de tipos

Introducción a las sentencias de control

Sistemas Operativos. Clase 2: Administración de procesos.

Diseño Dirigido por Responsabilidades con los patrones GRASP. Pearson Educación, S.A. Todos los derechos reservados.

Una Clase: define un grupo de objetos que tienen propiedades similares y se comportan de manera similar.

Tema 3 Constantes, Variables y Tipos

CONCEPTO O DEFINICIÓN DE HERENCIA EN JAVA Y EN PROGRAMACIÓN ORIENTADA A OBJETOS. QUÉ ES? EXTENDS. EJEMPLOS. (CU00684B)

PROGRAMACIÓN ALGORITMOS y DIAGRAMAS

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

Declaración de variables (integer, single, double, boolean, etc.) en Visual Basic. Dim. Ejemplos. (CU00309A)

Conjuntos disjuntos (Relaciones de equivalencia)

En este capitulo se estudiarán los conceptos relacionados a métodos, como lo son sobrecarga, métodos estáticos.

Oracle Database 11g: Programación con PL/SQL Nuevo

SISTEMA DE NUMERACIÓN BINARIO

Clase adicional 2. Estructuras básicas de control. Temas

Cristian Blanco

Taller de Programación I. Tema 10: Herencia en Java

Oliverio J. Santana Jaria. Sistemas Digitales Ingeniería Técnica en Informática de Sistemas Curso

INGENIERIA DE SISTEMAS 1 ESTRUCTURAS DE DATOS (Listas simples) INTRODUCCIÓN A LAS ESTRUCTURAS DE DATOS

Conjuntos y relaciones

Categorías de métodos. Métodos constructores y destructores

Programación y matemática

Unidad V Análisis Semántico. M.C. Juan Carlos Olivares Rojas

k k N b Sistemas Númericos Sistemas con Notación Posicional (1) Sistemas con Notación Posicional (2) Sistemas Decimal

Teoría de Conjuntos. Conjunto es: colección de cosas, o una colección determinada de objetos.

Java posee dos grandes categorías de tipos para las variables:

Lógica y Programación

color (yerba, verde) el mismo predicado, pero con diferentes argumentos, puede no ser verdadero: color (yerba, azul) o color (cielo, verde)

Base de Datos Oracle 10g: Programación con PL/SQL NUEVO

Capítulo 4 Memoria virtual

Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria.

Proposiciones Condicionales

INTRODUCCIÓN A VISUAL BASIC

TEMA I PROGRAMACIÓN ORIENTADA A OBJETOS PROGRAMACIÓN N ORIENTADA A OBJETOS OBJETOS (I) OBJETOS (II)

Generación de funciones lógicas mediante multiplexores

APLICACIÓN DE ÁRBOLES BINARIOS

TEMA I: LOS CONCEPTOS FUNDAMENTALES DE LA TEORÍA DE LA COMPUTABILIDAD

DISEÑO CURRICULAR ALGORITMOS, ESTRUCTURAS Y PROGRAMACIÓN I

Clases abstractas e interfaces en Java

PROGRAMACIÓN EN JAVA

Lógica de Predicados MRC

Sintaxis y Semántica del Lenguaje. Gramáticas

Teoría de conjuntos. Tema 1: Teoría de Conjuntos.

UNIDAD I. ALGORITMOS

Programación Digital I

TEMA 5. Agenda. Herencia

Examen Teórico Convocatoria de Junio de 2012

Clases y herencia. FJP Unidad 8. Diseño de clases

Sus socios en ISO Manual de Calidad

Guía práctica de estudio 08: Polimorfismo

Clases Abstractas e Interfaces

Transcripción:

Apuntes de Programación y estructuras de datos. Tipos de datos Nikos Mylonakis, Fernando Orejas y Ana Cristina Zoltan nicos@lsi.upc.edu Dept. Llenguatges i Sistemes Informátics Universitat Politécnica de Catalunya Barcelona March 4, 2010 p.1/36

Introducción a la comprobación de tipos Un tipo se puede definir como una propiedad de un conjunto de valores Ejemplos: booleanos, enteros, entero_par, entero_impar, tablas, tuplas, etc Los tipos también se pueden asociar a todas las construcciones del lenguaje, por ejemplo las operaciones, las instrucciones y los subprogramas Los tipos se introducen en los LPs por motivos de seguridad. March 4, 2010 p.2/36

Los tipos determinan cómo se pueden utilizar las entidades del LP Ejemplo 1: Si x es entero lo podemos sumar a un entero pero no lo podemos utilizar en una operación lógica o como una acción Ejemplo 2: Si A:tabla [1..100] de entero la expresión A[50] es correcta pero A[120] no Para detectar los errores de uso de las diferentes entidades de un LP los LP realizan una comprobación de tipos March 4, 2010 p.3/36

Ejemplo 1: Para que x + y sea correcta x e y han de ser bien enteros bien reales Ejemplo 2: Para que A[50] sea correcta A ha de ser de tipo tabla y 50 ha de estar entre el subrango de la tabla. La comprobación de tipos puede ser estática (en tiempo de compilación) o dinámica (en tiempo de ejecución) Hay comprobaciones de tipos que sólo se pueden realizar en tiempo de ejecución. March 4, 2010 p.4/36

La comprobación de tipos dinámica hace que los programas se ejecuten más lentamente En algunos LP las comprobaciones dinámicas son opcionales. Java las realiza siempre Las ventajas de la comprobación de tipos son fiabilidad (si hay errores se detectan lo más pronto posible) y eficiencia (la memoria asignada a las variables se puede gestionar con una pila si no se utilizan punteros) Las desventajas son que a veces se imponen restricciones innecesarias y que es pesado tener que declarar todo March 4, 2010 p.5/36

Clases de sistemas de tipos Los sistemas de tipos en los LP pueden ser monomórficos (toda entidad sólo tiene un único tipo) o polimórficos ( una entidad puede tener más de un tipo). La notación algorítmica que utilizamos es monomórfica aunque puede haber sobrecarga de operadores y Java es polímorfico (por la relación clase-subclase) Hay dos clases de polimorfismo: polimorfismo de subclase y polimormismo parámetrico Ejemplo de polimorfismo parámetrico: listas de cualquier tipo ([α]) en Haskell donde α denota cualquier tipo March 4, 2010 p.6/36

Otra decisión de diseño de los sistemas de tipo LP es la equivalencia de tipos Ejemplo : x:=y requiere la comprobación de que ambos tipos son equivalentes Hay dos clases de equivalencia: por nombre y por estructura La equivalencia por nombre requiere que los dos tipos tengan el mismo nombre La equivalencia por estructura requieren que los dos tipos tengan la misma estructura March 4, 2010 p.7/36

Ejemplo: tipo T = tabla [1..100]deentero T = tabla [1..100]deentero ftipo var t1,t2 : T; t3 : T ; t4 : tabla [1..100]deentero fvar March 4, 2010 p.8/36

Si hay equivalencia por nombre t1 := t2 es correcto pero t1 := t3 y t1 := t4 no. Si hay equivalencia estructural t1 := t2, t1 := t3 y t1 := t4 son correctas En Java la equivalencia de tipos es por nombre La equivalencia estructural varía según el LP March 4, 2010 p.9/36

Otro tema relacionado con la equivalencia de tipos son las coerciones Las coerciones son conversiones ímplicitas de tipos Ejemplo: En C se realiza una coerción al realizar x = y si x es real y y entero En Java no existen coerciones Siempre se permite realizar conversiones explícitas March 4, 2010 p.10/36

Concepto de subclase Se dice que existe una relación de subclase entre SC y C (SC es subclase de C) si siempre que podemos utilizar elementos de la clase C también podemos utilizar elementos de la subclase SC La relación de subclase no es lo mismo que la relación de subconjunto en teoría de conjuntos March 4, 2010 p.11/36

tipo t = tupla A : entero; B : booleano; ftupla st = tupla A : entero; B : booleano; C : caracter; ftupla ftipo March 4, 2010 p.12/36

Los valores de st no están incluidos en t pero en cambio sí que puede existir una relación de subclase El motivo es porque las operación de acceso a un campo de las tuplas hace que siempre que se utilice un elemento de t se puede utilizar un elemento de st pues los campos de t están incluidos en st. En algunos LP como en Java para que puede existir relación de subclase se tiene que declarar explícitamente March 4, 2010 p.13/36

Reglas de inferencia en sistema de tipos Si los tipos son propiedades de conjuntos de valores, la lógica es una buena herramienta para tratarlas Un sistema de tipos quedará definido por un conjunto de reglas para inferir si una cierta construcción del LP tiene su tipo correcto Las reglas de inferencia tendrán la forma premisa1... premisan conclusion March 4, 2010 p.14/36

Ejemplo de reglas lógicas A B A B A B B Las premisas y conclusiones de las reglas de un sistema de tipos para determinar el tipo de una expresión podrían ser de la forma Expr : T (Expr tiene el tipo T ) Ejemplo de estas reglas serían A E1 : entero E2 : entero E1 + E2 : entero E1 : entero E2 : entero E1 E2 : booleno March 4, 2010 p.15/36

El problema está en que la comprobación de tipos requiere un conjunto de declaraciones de constantes y variables ademas de la aridad de las operaciones predefinidas Por tanto las reglas requieren de entorno Γ que contiene una lista con todas las declaraciones definidas y predefinidas Nosotros no veremos las reglas de generación del entorno pero si veremos el formato general de las reglas para comprobar el tipo de las expresiones March 4, 2010 p.16/36

Γ {x : T } x : T Γ {f : T1... TN T } f : T1... TN T Γ f : T1... TN T Γ E1 : T1... Γ EN : TN Γ f(e1,...,en) : T Los operadores unarios y binarios tendrían reglas específicas por su posición infija y prefija March 4, 2010 p.17/36

Las reglas para las instrucciones serían: Γ x : T Γ E : T Γ x := E : Instr Γ I1 : Instr Γ I2 : Instr Γ I1;I2 : Instr Γ E : booleano Γ I1 : Instr Γ I2 : Instr Γ SiE entoncesi1sinoi2 : Instr Γ E : booleano Γ I : Instr Γ mientrase hacer I fmientras : Instr March 4, 2010 p.18/36

La comprobación de tipos de los subprogramas requeriría un nuevo tipo (por ejemplo Subpr) El entorno se tendría que actualizar con la lista de parámetros y variables locales A continuación se pasaría a comprobar que el tipo del cuerpo del subrprograma es una instrucción March 4, 2010 p.19/36

Finalizada la comprobación el entorno se tiene que actualizar con el nombre del subprograma y el tipo de sus parámetros para comprobar que las llamadas a los subprogramas son correctas Debido a que pueden haber llamadas recursivas esta actualización se ha de hacer antes de comprobar el tipo del cuerpo del subprograma March 4, 2010 p.20/36

Ejercicio: Comprobar el tipo de la siguiente función funcionf(x,y : entero)retorna b : booleano x := x + 1; y ::= y + 2; b := x y retorna b ffuncion March 4, 2010 p.21/36

Algoritmos de comprobación de tipos Los compiladores de los LP no implementan sistemas deductivos de comprobación de tipos por ser ineficientes Los compiladores utilizan una tabla de símbolos para guardar la información que tenemos en el entorno de las reglas La representación del programa es mediante un árbol sintáctico La comprobación de tipos requiere realizar un recorrido recursivo del árbol sintáctico desde las hojas hasta la raíz asociando un tipo a cada nodo March 4, 2010 p.22/36

Reglas de inferencia con subtipo Recordemos que un tipo st es subtipo de un tipo t si cualquier elemento de st puede ser utilizado en un contexto en el que se utiliza t Las reglas de inferencia con subtipos tienen reglas adicionales como la reflexividad y la transitividad de la relación de subtipos y la regla de subsumción. La regla para subsumir nos dice que cuando un elemento es de un tipo st, ese elemento también tiene los tipos de los supertipos de st, esto es, de todos los tipos t de los cuales st es subtipo March 4, 2010 p.23/36

La formalización de las reglas es la siguiente Γ T < T Γ T1 < T2 Γ T2 < T3 Γ T1 < T3 Γ {ST < T } ST < T Γ expr : ST Γ ST < T Γ expr : T March 4, 2010 p.24/36

Veamos cómo se implementa la comprobación de tipos con subtipos El funcionamiento general es el mismo teniendo una tabla de símbolos y un árbol sintáctico al que hay que comprobar su tipo La tabla de símbolos contiene el menor subtipo asociado a las variables, constantes y parámetros de las operaciones y las relaciones de subtipos entre los tipos El proceso recursivo es el mismo de las hojas a la raíz pero con comprobaciones adicionales March 4, 2010 p.25/36

Si tenemos que f : T1... TN y al realizar la comprobación de f(e1,...,en) tenemos que E1 : T1,...,EN : TN si TJ < TJ para todo J entre 1 y N el tipo de f(e1,...,en) será correcto y de tipo T. Si hay sobrecarga se tienen que tratar todas las alternativas posibles March 4, 2010 p.26/36

El sistema de tipos de Java El sistema de tipos de Java es polimórfico (por relación de subclase/subtipo) No realiza coerciones implícitas Permite sobrecarga si no hay ambiguedades Ejemplo g : t1 t2 ts,g : t1 t2 ts, t1 < t1,t2 < t2 y a : t1,b : t2, la expresión g(a,b) da error cuando es ambigua. Si hiciesemos x = g(a,b) y x : ts podríamos desambiguar pero en Java da error March 4, 2010 p.27/36

Recordamos que en Java la asociación de tipos es estática pero la asociación de métodos es dinámica con ciertas restricciones En Java se puede asignar a una variable x de clase C un valor de una subclase de C SC pero x continua siendo de la clase C y x sólo puede acceder a los atributos declarados en C Con respecto de los métodos, por asociación dinámica si hay una redefinición de un método de C en SC una llamada a ese método con la variable x utilizaría el de SC March 4, 2010 p.28/36

La relación de subclase en Java se define mediante la cláusula extends entre clases como ya vimos y sólo se puede heredar de una superclase (herencia simple) En Java también se permite dejar sin definir ciertos métodos de una clase. En estos casos la clase se denomina abstracta March 4, 2010 p.29/36

Mediante la herencia podremos completar la clase definiendo los métodos no definidos Así podríamos implementar en Java el ejemplo del programa del cálculo de los salarios de los trabajadores de una empresa En Java también existen interfaces y son similares a las clases abstractas con la particularidad que permiten la herencia múltiple March 4, 2010 p.30/36

En Java tenemos dos clases de tipos: los primitivos y los referencia subclase de la clase general Object Los primitivos denotan un conjunto de valores y son por ejemplo int, boolean, byte, float, long, etc Los tipos referencia incluyen los strings, arrays y las clases definidas por el usuario Los tipos referencia denotan una posición de memoria que contiene un valor del tipo referenciado March 4, 2010 p.31/36

Una decisión de diseño de Java que se le critica de insegura es que si B es subclase de A entonces los arrays de B (B[]) son subclase de los arrays de A (A[]) Si generamos una tabla de 10 posiciones de clases de B mediante la inicialización B[]b = newb[10] y declaramos a como un array de A A[]a Como los arrays de B son subclase de los arrays de A podemos realizar la asignación a=b, March 4, 2010 p.32/36

Ahora podríamos hacer la asignación a[4] = new A() y por tanto el array b contendría un valor de A La implementación de Java no permite ejecutarlo Por este y otros motivos esta relación de subclase en arrays no se considera una buena decisión de diseño March 4, 2010 p.33/36

El sistema de tipos de C++ El sistema de tipos de C++ también es polimórfico (por relación de subclase/subtipo) C++ sí que realiza coerciones implícitas También permite sobrecarga si no hay ambiguedades March 4, 2010 p.34/36

En C++ la asociación de tipos es estática y la asociación de métodos redefinidos también es dinámica Para ello se tienen que definir los subprogramas como virtuales y los objetos como referencias a sus clases. Si no se definen como virtuales se considera el subprograma sobrecargado March 4, 2010 p.35/36

La relación de subclase en C++ se define mediante el símbolo : y una lista de superclases separadas por comas. Por tanto se permite herencia multiple. Como ya vimos en el anterior capítulo se puede poner operadores de acceso private, public o protected. En C++ también se permite dejar sin definir los métodos virtuales de una clase. March 4, 2010 p.36/36