Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin
NDICE
Objetivos de la Unidad .........................................................................................................................4 Contenidos Abordados ..........................................................................................................................4 1. INTRODUCCION: Conceptos lgicos y transversales ..........................................................................4 1.1 1.2 Abstraccin..............................................................................................................................4 Modularizacin, encapsulamiento y delegacin.......................................................................4
Objetivos de la Unidad .........................................................................................................................4 Contenidos Abordados ..........................................................................................................................4 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 2. Declaratividad .........................................................................................................................5 Tipos de datos .........................................................................................................................7 Estructuras de datos ................................................................................................................7 Polimorfismo y software genrico ...........................................................................................7 Transparencia referencial y efecto de lado ..............................................................................8 Asignacin y unificacin ...........................................................................................................9 Modo de evaluacin ................................................................................................................9 Orden superior ...................................................................................................................... 10 Recursividad .......................................................................................................................... 10
Abstraccin .....................................................................................................................................10 2.1 2.2 2.2.1 El progreso de la abstraccin .................................................................................................11 tipos de abstraccin............................................................................................................... 14 Abstraccin de datos ......................................................................................................... 14
3.
Tipos de Datos ................................................................................................................................ 15 3.1 3.1.1 3.1.2 3.2 3.3 3.4 3.5 3.6 3.6.1 3.6.2 3.6.3 3.6.4 Teora de valores y tipos ........................................................................................................ 15 Valor .................................................................................................................................15 Tipo ...................................................................................................................................15 Clasificacin de los tipos ........................................................................................................ 16 Verificacin de tipos .............................................................................................................. 17 Sistemas de tipos ................................................................................................................... 20 Conversin de tipos ............................................................................................................... 21 Ejemplos de Tipos de Datos en diferentes lenguajes .............................................................. 22 Tipos de datos en el lenguaje funcional Haskell .................................................................22 Tipos de datos en el lenguaje lgico Prolog ....................................................................... 22 Tipos de datos en Java ....................................................................................................... 23 Tipos de datos en Smalltalk ............................................................................................... 23 Pgina 2
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin 3.6.5 4. Tipos de datos en C ........................................................................................................... 23
Mecanismos de control de flujo ...................................................................................................... 23 4.1.1 4.2 4.2.1 4.2.2 4.2.3 4.2.4 Organizacin de los mecanismos de control ...................................................................... 24 Ejemplos de Flujo de control en diferentes lenguajes ............................................................ 25 Flujo de Control en C y Java ............................................................................................... 25 Flujo de control en Haskell ................................................................................................ 26 Flujo de control en Prolog .................................................................................................27 Flujo de control en Smalltalk ............................................................................................. 28
5.
Herencia ......................................................................................................................................... 28 5.1 5.1.1 5.1.2 5.1.3 5.2 5.2.1 5.2.2 5.2.3 Estrategias para implementar herencia ................................................................................. 29 Sistemas Basados en clases ............................................................................................... 29 Sistemas basados en Prototipos ........................................................................................ 30 Comparacin de sistemas ..................................................................................................31 modelos de implementacin .................................................................................................31 Herencia por delegacin ....................................................................................................31 Herencia por concatenacin .............................................................................................. 32 Comparacin de Modelos ..................................................................................................32
6.
Polimorfismo ..................................................................................................................................33 6.1 6.2 6.2.1 6.2.2 6.2.3 Definicin de polimorfismo....................................................................................................33 Tipos de Polimorfismo ........................................................................................................... 33 Polimorfismo de sobrecarga .............................................................................................. 33 Polimorfismo paramtrico .................................................................................................34 Polimorfismo de subtipado................................................................................................ 34
7.
Bibliografa .....................................................................................................................................35
Pgina 3
O BJETIVOS DE LA U NIDAD
Que el alumno reconozca los elementos constitutivos, mecanismos y formas de implementacin de las caractersticas de Tecnolgica los lenguajes de programacin dentro del Paradigma de programacin Universidad Nacional correspondiente. Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin C ONTENIDOS A BORDADOS Conceptos lgicos y transversales. Tipos de datos: Teora, clasificacin, verificacin, sistema de tipos, conversin y ejemplos en los diferentes lenguajes de programacin. Mecanismos de control de flujo: Organizacin y ejemplos en los diferentes lenguajes de programacin. Abstraccin y modularizacin: definicin y mecanismos de implementacin. Herencia: Estrategias, modelos. Polimorfismo: Definicin, tipos.
Es la operacin intelectual que ignora selectivamente partes de un todo para facilitar su comprensin. En la resolucin de problemas: implica ignorar los detalles especficos buscando generalidades que ofrezcan una perspectiva distinta, ms favorable a su resolucin. El proceso de abstraerse progresivamente de los detalles, permite manejar niveles de abstraccin. Por ejemplo en un programa que usa un archivo: En un mximo nivel de abstraccin podemos definir: Apertura del archivo Procesamiento Cierre del archivo
1.2
Una estrategia central de la programacin es buscar la manera de organizar y distribuir la funcionalidad de un sistema complejo en unidades ms pequeas de software que se responsabilizan de tareas especficas y que interactan entre ellas . Estas unidades reciben nombres diferentes segn cada lenguaje de programacin, como rutinas, funciones, procedimientos, mtodos, predicados, subprogramas, bloques, entidades, siendo mdulos una de las ms frecuentes y que dan origen al trmino.
Mdulo 1
Mdulo 2
Mdulo N
Pgina 4
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin La clave de cada mdulo es que no conoce el funcionamiento interno de los dems mdulos con los que interacta sino slo su interfaz, es decir, la forma en que debe enviarle informacin adicional en forma de parmetros y cmo va a recibir las respuestas. Esta propiedad recibe diversos nombres, como el de encapsulamiento, ocultacin de informacin o caja negra. Ante la modificacin de una funcionalidad en particular del sistema, en la medida que su implementacin est encapsulada en un mdulo, el impacto que produce su cambio no afectar a los otros mdulos que interactan con l. Facilita el manejo de la complejidad, slo se conoce el comportamiento pero no los detalles internos, nos interesa conocer que hace pero no cmo lo hace.
Entrada Mdulo
Salida
En concordancia con la distribucin de responsabilidades entre las diferentes unidades de software, la delegacin consiste en la invocacin que desde un mdulo se efecta a otro mdulo, de manera que el que invoca explicita qu es lo que pretende y el que es invocado se ocupa de todo lo necesario para realizarlo. Puede realizarse de numerosas maneras, variando el criterio de distribucin de responsabilidades, el modo de evaluacin, la forma de paso de parmetros, los tipos de datos que utiliza, de acuerdo a las posibilidades y restricciones de cada lenguaje y paradigma.
1.3
DECLARATIVIDAD
La declaratividad, en trminos generales, se basa en la separacin del conocimiento sobre la definicin del problema con la forma de buscar su solucin, una separacin entre la lgica y el control. En un programa declarativo se especifican un conjunto de declaraciones, que pueden ser proposiciones, condiciones, restricciones, afirmaciones, o ecuaciones, que caracterizan al problema y describen su solucin. A partir de esta informacin el sistema utiliza mecanismos internos de control, comnmente llamado motores, que evalan y relacionan adecuadamente dichas especificaciones, de manera de obtener la solucin. De esta manera, en vez de ser una secuencia de rdenes, un programa es un conjunto de definiciones sobre el dominio del problema. Basndose en la nocin de delegacin, la declaratividad plantea como criterio para distribuir las responsabilidades, separar las relacionadas con modelar o definir el conocimiento del problema de aquellas de manipular ese conocimiento para alcanzar un objetivo concreto. En otras palabras, distinguir el qu del cmo. La declaratividad brinda la posibilidad de usar una misma descripcin en mltiples contextos en forma independiente de los motores que se utilicen. Permite focalizar por un lado en las cuestiones algortmicas del motor, por ejemplo para trabajar en forma unificada sobre eficiencia, y por otro en la definicin del dominio del problema y la funcionalidad de la aplicacin en s. La nocin opuesta, aunque en cierta medida complementaria, de la declaratividad, puede denominarse proceduralidad. Los programas procedurales se construyen indicando explcitamente la secuencia de ejecucin en la que se procesan los datos y obtienen los resultados. Para ello se detalla un conjunto de sentencias, ordenadas mediante estructuras de control como decisiones, iteraciones y secuencias, que conforman algoritmos. En un sistema complejo, no se puede hablar de declaratividad o proceduralidad como conceptos excluyentes o totalizantes, sino que coexisten y se relacionan en una permanente tensin. Dependiendo de los lenguajes y de las herramientas que se utilicen, y en particular del diseo del sistema, habr
Pgina 5
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin partes del sistema que por su sentido o ubicacin dentro del sistema global sern ms declarativas o procedurales que otras, de manera de aprovechar las ventajas respectivas.
Perifrico Salida
A, B, +
El desarrollador introduce declaraciones que el motor interpreta. El motor abstrae el uso de memoria y la gestin de procesamiento.
Pgina 6
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin
1.4
TIPOS DE DATOS
Un tipo de dato, o como tambin es llamado, un tipo abstracto de dato, es un conjunto de valores y de operaciones asociadas a ellos. La utilizacin de diversos tipos de datos permite la agrupacin o clasificacin del gran volumen y variedad de valores que es necesario representar y operar en un sistema, segn sus semejanzas y diferencias. Tomando como criterio las similitudes en cuanto al contenido de lo que representan, una primera condicin es la existencia de un conjunto de valores o entidades homogneos en su representacin. Otra condicin es que los elementos del mencionado conjunto se comporten en forma uniforme respecto a una serie de operaciones. Cada paradigma de programacin, y en particular cada lenguaje, tiene su forma de determinar tanto la conformacin de cada tipo de dato, con sus valores y operaciones, como la forma en que se relacionan entre s conformando un sistema de tipo de datos. En un lenguaje fuertemente tipado, toda variable y parmetro deben ser definidos de un tipo de dato en particular que se mantiene sin cambios durante la ejecucin del programa, mientras que en uno dbilmente tipado no, sino que pueden asumir valores y tipos de datos diferentes durante la ejecucin del programa. El tipo de dato al que pertenece una entidad determina la operatoria que se puede realizar con ello. Una tarea que realizan muchos de los lenguajes de programacin como forma de su mecanismo interno es el chequeo del tipo de dato de las entidades del programa. Esta accin se realiza de diferentes maneras, con mayor o menor flexibilidad, y en diferentes momentos, como la compilacin o la ejecucin del programa, y en otros no se realiza. De todas maneras, el tipo de datos permite entender qu entidades tienen sentido en un contexto, independientemente de la forma de chequeo o si el tipado es dbil o fuerte. Por ejemplo, a un bloque de software que recibe como argumento una variable, conocer de qu tipo de dato es le permite saber qu puede hacer con ella.
1.5
ESTRUCTURAS DE DATOS
Los valores atmicos, es decir, aquellos que no pueden ser descompuestos en otros valores, se representan mediante tipos de datos simples. En contrapartida, en un tipo de dato compuesto los valores estn compuestos a su vez por otros valores, de manera que conforma una estructura de datos. Cada uno de los valores que forman la estructura de datos corresponde a algn tipo de dato que puede ser tanto simple como compuesto. Su utilidad consiste en que se pueden procesar en su conjunto como una unidad o se pueden descomponer en sus partes y tratarlas en forma independiente. En otras palabras, las estructuras de datos son conjuntos de valores.
1.6
El polimorfismo es un concepto para el que se pueden encontrar numerosos y diferentes definiciones. En un sentido amplio, ms all de las especificidades de cada paradigma y del alcance que se le de a la definicin del concepto desde la perspectiva terica desde la que se lo aborde, el objetivo
Pgina 7
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin general del polimorfismo es construir piezas de software genricas que trabajen indistintamente con diferentes tipos de entidades, para otra entidad que requiere interactuar con ellas; en otras palabras, que dichas entidades puedan ser intercambiables. Mirando con mayor detenimiento los mecanismos que se activan y sus consecuencias para el desarrollo de sistemas, se pueden distinguir dos grandes situaciones. Hay polimorfismo cuando, ante la existencia de dos o ms bloques de software con una misma interfaz, otro bloque de software cualquiera puede trabajar indistintamente con ellos. Esta nocin rescata la existencia de tantas implementaciones como diferentes tipos de entidades se interacte. Una entidad emisora puede interactuar con cualquiera de las otras entidades de acuerdo a las caractersticas de la interfaz comn, y la entidad receptora realizar la tarea solicitada de acuerdo a la propia implementacin que tenga definida, independientemente de las otras implementaciones que tengan las otras entidades. Consistentemente con la nocin de delegacin, la entidad emisora se desentiende de la forma en que las otras entidades implementaron sus respuestas, ya sea fue igual, parecida o totalmente diferente. Analizando el concepto desde el punto de vista de las entidades que responden a la invocacin, el proceso de desarrollo debe contemplar la variedad y especificidad de cada una para responder adecuadamente a lo que se les solicita. Desde el punto de vista de la entidad que invoca, el proceso es transparente, y es en definitiva sta, la que se ve beneficiada por el uso del concepto. Otra forma de obtener un bloque de software genrico es ante el caso en que las entidades con las que el bloque quiere comunicarse, en vez de tener diferentes implementaciones, an siendo de diferente tipo, sean lo suficientemente similares para compartir una misma y nica implementacin. Desde el punto de vista de la entidad que invoca, el proceso contina siendo transparente y sigue aprovechando los beneficios de haber delegado la tarea y haberse despreocupado de qu tipo de entidad es la receptora. En este caso, el concepto de polimorfismo se relaciona o se basa en la coexistencia de herencia, de variables de tipo de dato o en las formas dbiles de declaracin y chequeo de tipos de datos, dependiendo de las diferentes herramientas de cada paradigma.
1.7
La transparencia referencial consiste en que el valor de una expresin depende nicamente del valor de sus componentes, de manera que siempre que se evala el mismo bloque de software con los mismos parmetros, se obtiene el mismo resultado, sin importar el comportamiento interno de dicho bloque. Su evaluacin no produce un cambio en el estado de informacin del sistema que pueda afectar una posterior evaluacin del mismo u otro bloque. Entre las ventajas, la transparencia referencial da robustez, ya que se garantiza que el agregado de nuevas unidades de software no interfiere con las existentes generando algn efecto colateral. Los tests son ms confiables, ya que toda consulta o evaluacin, responde siempre de la misma forma. El conjunto de variables o condiciones iniciales a tener en cuenta est acotado a la misma consulta. Los errores tienden a ser ms locales y a no propagarse por todo el sistema. Aporta independencia entre las unidades de software, ya que trabajan sobre valores diferenciados.
Pgina 8
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin El efecto de lado (side effect), tambin traducido como efecto colateral, se produce cuando el resultado de la evaluacin de un bloque de software depende de otros valores o condiciones del ambiente ms all de sus parmetros. Su evaluacin incluye acciones que afectan un estado de informacin que sobrevive a la evaluacin del bloque, por lo que influye en una posterior evaluacin del mismo u otro bloque. La utilizacin del efecto de lado representa mejor la dinmica del sistema, ya que cuando hay un estado de informacin que mantener actualizado, es un efecto deseado que el funcionamiento del sistema provoque cambios en la informacin . Refleja la interaccin de diferentes partes del sistema, ya que una unidad de software puede realizar cambios en la informacin que incidan en el funcionamiento de otra unidad.
1.8
ASIGNACIN Y UNIFICACIN
La asignacin destructiva es una operacin que consiste en cambiar la informacin representada por una variable, de forma tal que si se consulta su valor antes y despus de dicha operacin, se obtiene un resultado distinto. Estas asignaciones se realizan repetitivamente sobre la misma celda de memoria, remplazando los valores anteriores. La asignacin determina el estado de una variable, que consiste en el valor que contiene en un momento en particular. La asignacin destructiva es la forma ms usual de provocar efecto de lado, pero no la nica, ya que, dependiendo de los lenguajes, hay otro tipo de instrucciones que tambin permiten modificar el estado de informacin de un sistema. La unificacin es un mecanismo por el cual una variable que no tiene valor, asume un valor. Una vez unificada, o ligada, como tambin se le dice, una variable no cambia su valor, por lo q ue no existe la nocin de estado. La duracin de la unificacin est condicionado por el alcance que tienen las variables en cada lenguaje en particular, pudiendo una variable unificarse con varios valores alternativos en diferentes momentos de la ejecucin del bloque de software en el que se encuentran. Se suele denominar como indeterminada a una variable sin ligar o no unificada. La unificacin se encuentra ntimamente relacionado con el mecanismo de encaje de patrones (pattern matching).
1.9
MODO DE EVALUACIN
Los parmetros que se utilizan en la invocacin de cualquier bloque de software pueden ser evaluados en diferentes momentos de acuerdo al modo de evaluacin que utilice el lenguaje de programacin. La evaluacin ansiosa consiste en que los argumentos son evaluados antes de invocar al bloque de software y es responsabilidad de la entidad que invoca.
Pgina 9
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin La evaluacin diferida plantea que la evaluacin de los argumentos es responsabilidad del bloque de software invocado, quien decide el momento en que lo har. Provoca que se difiera la evaluacin de una expresin, permitiendo que en algunos casos, de acuerdo a cmo sea la implementacin, no sea necesario evaluarla nunca, con el consiguiente beneficio en trminos de eficiencia. La evaluacin diferida es utilizada en cierto tipo de situaciones que seran consideradas errneas o imposibles de resolver con la evaluacin ansiosa, como por ejemplo los bucles o las listas infinitas.
1.10
ORDEN SUPERIOR
El poder que brinda esta generalidad puede abrir posibilidades en diferentes contextos. La idea general se explica con la siguiente definicin: Los programas pueden tener como argumento Programas y producir como resultado otros Programas. Segn el paradigma, tambin podemos definirlo de las siguientes formas: En la programacin imperativa: Los procedimientos son tratados como datos y en consecuencia pueden ser utilizados como parmetros, representados en variables, devueltas como resultados. Se denomina de orden superior a los procedimientos que reciben como argumentos otros procedimientos. En la programacin Funcional: el concepto de funciones de orden superior se refiere al uso de funciones como si de un valor cualquiera se tratara, posibilitando pasar funciones como parmetros de otras funciones o devolver funciones como valor de retorno.
1.11
RECURSIVIDAD
La recursividad, entendida como iteracin con asignacin no destructiva, est relacionada con el principio de induccin. En general, un bloque de software recursivo se define con al menos un trmino recursivo, en el que se vuelve a invocar el bloque que se est definiendo, y algn trmino no recursivo como caso base para detener la recursividad.
Recursividad
Llamadas recursivas
2. ABSTRACCIN
Unidad N 2: Elementos Constitutivos de lenguajes y Paradigmas Pgina 10
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin La abstraccin es la operacin intelectual que ignora selectivamente partes de un todo para facilitar su comprensin. En la resolucin de problemas: implica ignorar los detalles especficos buscando generalidades que ofrezcan una perspectiva distinta, ms favorable a su resolucin. El proceso de abstraerse progresivamente de los detalles y as manejar niveles de abstraccin, es el que permite construir sistemas complejos. Las unidades de software que realizan la funcionalidad del sistema requieren tambin de convenciones y criterios de ordenamiento y articulacin interna tanto para un funcionamiento confiable y eficiente del sistema, como para que el proceso de construccin y mantenimiento del software sea de la forma lo ms simple posible.
2.1
EL PROGRESO DE LA ABSTRACCIN
Todos los lenguajes de programacin proporcionan abstracciones. Puede argumentarse que la complejidad de los problemas que sea capaz de resolver est directamente relacionada con el tipo (clase) y la calidad de las abstracciones, entendiendo por "clase", "qu es lo que se va a abstraer?". El lenguaje ensamblador es una pequea abstraccin de la mquina subyacente. Muchos de los lenguajes denominados "imperativos" que le siguieron (como FORTRAN, BASIC y C) fueron abstracciones del lenguaje ensamblador. Estos lenguajes constituyen grandes mejoras sobre el lenguaje ensamblador, pero su principal abstraccin requiere que se piense en trminos de la estructura de la computadora en lugar de la estructura del problema que se est intentado resolver. El programador debe establecer la asociacin entre el modelo de la mquina (en el "espacio de la solucin", que es donde se va a implementar dicha solucin, como puede ser una computadora) y el modelo del problema que es lo que realmente se quiere resolver (en el "espacio del problema", que es el lugar donde existe el problema, como por ejemplo en un negocio). El esfuerzo que se requiere para establecer esta correspondencia y el hecho de que sea extrnseco al lenguaje de programacin, da lugar a programas que son difciles de escribir y caros de mantener, adems del efecto colateral de toda una industria de "mtodos de programacin". La alternativa a modelar la maquina es modelar el problema que se est intentado solucionar. Los primeros lenguajes como LISP y APL eligen vistas parciales del mundo ("todos los problemas pueden reducirse a listas" o "todos los problemas son algortmicos", respectivamente). Prolog convierte todos los problemas en cadenas de decisin. Cada uno de estos mtodos puede ser una buena solucin para resolver la clase de problema concreto para el que estn diseados, pero cuando se aplican en otro dominio resultan inadecuados. El enfoque orientado a objetos trata de ir un paso ms all proporcionando herramientas al programador para representar los elementos en el espacio del Problema. Esta representacin es tan general que el programador no est restringido a ningn tipo de problema en particular. Se hace referencia a los elementos en el espacio del problema denominando "objetos" a sus representaciones en el espacio de la solucin (tambin se necesitarn otros objetos que no tendrn anlogos en el espacio del problema). La idea es que el programa pueda adaptarse por s slo a la jerga del problema aadiendo nuevos tipos de objetos, de modo que cuando se lea el cdigo que describe la solucin, se estn leyendo palabras que tambin expresen el problema. sta es una abstraccin del lenguaje ms flexible y potente que cualquiera de las que se hayan hecho anteriormente'. Por tanto, la programacin orientada a objetos permite describir el problema en trminos del problema en lugar de en trminos de la computadora en la que se ejecutar la solucin. Alan Kay resumi las cinco caractersticas bsicas del Smalltalk, el primer lenguaje orientado a objetos que tuvo xito y uno de los lenguajes en los que se basa Java. Estas caractersticas representan un enfoque puro de la programacin orientada a objetos.
Pgina 11
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin Todo es un objeto, piense en un objeto como en una variable: almacena datos, permite que se le "planteen solicitudes", pidindole que realice operaciones sobre s mismo. En teora, puede tomarse cualquier componente conceptual del problema que se est intentado resolver (personas, edificios servicios, etc.) y representarse como un objeto del programa. Un programa est formado por muchos objetos que se dicen entre s lo que tienen que hacer envindose mensajes. Para hacer una solicitud a un objeto, hay que enviar un mensaje a dicho objeto. Ms concretamente, puede pensar en que un mensaje es una solicitud para llamar a un mtodo que pertenece a un determinado objeto. Cada objeto tiene su propia memoria formada por otros objetos , un objeto se puede crear a partir de objetos existentes y puede contener otros objetos, por lo tanto, se puede incrementar la complejidad de un programa ocultndola tras la simplicidad de los objetos. Todo objeto tiene un tipo asociado. Como se dice popularmente, cada objeto es una instancia de una clase, siendo "clase" sinnimo de "tipo". La caracterstica distintiva ms importante de una clase es "el conjunto de mensajes que se le pueden enviar". Todos los objetos de un tipo particular pueden recibir los mismos mensajes. Como veremos ms adelante, esta afirmacin es realmente importante. Puesto que un objeto de tipo "Circulo" tambin es un objeto de tipo "Figura", puede garantizarse que un crculo aceptar los mensajes de Figura. Esto quiere decir que se puede escribir cdigo para comunicarse con objetos de tipo Figura y controlar automticamente cualquier cosa que se ajuste a la descripcin de una Figura. Esta capacidad de suplantacin es uno de los conceptos ms importantes de la programacin orientada a objetos. Booch ofrece una descripcin an ms sucinta de objeto: Un objeto tiene estado, comportamiento e identidad. Un objeto puede tener datos internos (lo que le proporciona el estado), mtodos (para proporcionar un comportamiento) y que cada objeto puede ser diferenciado de forma unvoca de cualquier otro objeto; es decir, cada objeto tiene una direccin de memoria exclusiva. Todo objeto tiene una interfaz Aristteles fue probablemente el primero en estudiar cuidadosamente el concepto de tipo; hablaba de "la clase de peces y de la clase de pjaros". La idea de que todos los objetos, an siendo nicos, son tambin parte de una clase de objetos que tienen caractersticas y comportamientos comunes ya se emple en el primer lenguaje orientado a objetos, el Simula-67, que usaba su palabra clave fundamental class y que permite introducir un nuevo tipo en un programa. Simula, como su nombre implica, se cre para desarrollar simulaciones como la clsica del "problema del cajero de un banco". En esta simulacin, se tienen muchos cajeros, clientes, cuentas, transacciones y unidades monetarias, muchsimos "objetos". Los objetos, que son idnticos excepto por su estado durante la ejecucin de un programa, se agrupan en "clases de objetos", que es de donde procede la palabra clave class. La creacin de tipos de datos abstractos (clases) es un concepto fundamental en la programacin orientada a objetos. Los tipos de datos abstractos funcionan casi exactamente como tipos predefinidos: pueden crearse variables de un tipo (llamadas objetos u instancias en la jerga de la POO) y manipular dichas variables (mediante el envo de mensajes o solicitudes, se enva un mensaje y el objeto sabe lo que tiene que hacer con l). Los miembros (elementos) de cada clase comparten algunos rasgos comunes. Cada cuenta tiene asociado un saldo, cada cajero puede aceptar un depsito, etc. Adems, cada miembro tiene su propio estado. Cada cuenta tiene un saldo diferente y cada cajero tiene un nombre. Por tanto, los cajeros, clientes, cuentas, transacciones, etc., pueden representarse mediante una entidad unvoca en el programa informtico. Esta entidad es el objeto y cada objeto pertenece a una determinada clase que define sus caractersticas y comportamientos.
Pgina 12
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin Por tanto, aunque en la programacin orientada a objetos lo que realmente se hace es crear nuevos tipos de datos, en la prctica, todos los lenguajes de programacin orientada a objetos utilizan la palabra clave "class". Cuando vea la palabra "type" (tipo) piense en "class" (clase), y viceversa' Dado que una clase describe un conjunto de objetos que tienen caractersticas (elementos de datos) y comportamientos (funcionalidad) idnticos, una clase realmente es un tipo de datos porque, por ejemplo, un nmero en coma flotante tambin tiene un conjunto de caractersticas y comportamientos. La diferencia est en que el programador define un clase para adaptar un problema en lugar de forzar el uso de un tipo de datos existente que fue diseado para representar una unidad de almacenamiento en una mquina. Se puede ampliar el lenguaje de programacin aadiendo nuevos tipos de datos especficos que se adapten a sus necesidades. El sistema de programacin admite las nuevas clases y proporciona a todas ellas las comprobaciones de tipo que proporciona a los tipos predefinidos. Una vez que se ha definido una clase, se pueden crear tantos objetos de dicha clase como se desee y dichos objetos pueden manipularse como si fueran los elementos del problema que se est intentado resolver. Realmente, uno de los retos de la programacin orientada a objetos es crear una correspondencia uno-a-uno entre los elementos del espacio del problema y los objetos del espacio de la solucin. Por ejemplo: Vida real clase objetos
A continuacin podemos ejemplificar de manera general, como se produce la abstraccin en los distintos paradigmas: En el paradigma imperativo la principal abstraccin requiere que se piense en trminos de la estructura de la computadora, en como traducir un problema en instrucciones de computadora. Tanto en el paradigma Orientado a objetos como en los declarativos se permiten describir el problema en trminos del problema en lugar de trminos de la computadora. La abstraccin se realiza: En POO con objetos o entidades. En P. Funcional con funciones matemticas. En P. Lgico con proposiciones lgicas.
Pgina 13
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin
2.2
TIPOS DE ABSTRACCIN
Entendiendo un sistema como una abstraccin de la realidad, los datos son las entidades que representan cada uno de los aspectos de la realidad que son significativos para el funcionamiento del sistema. Para que tenga sentido como abstraccin de la realidad, cada dato implica un determinado valor y requiere de una convencin que permita representarlo sin ambigedad y procesarlo de una manera confiable. En la misma lnea, la lgica del procesamiento de los datos es tambin una abstraccin de los procesos que suceden en la realidad que conforma el dominio de la aplicacin. De estas ideas surgen tres tipos de abstracciones: Abstraccin de Datos (TDA): Tenemos un conjunto de datos y un conjunto de operaciones que caracterizan el comportamiento del conjunto. Las operaciones estn vinculadas a los datos del tipo. Abstraccin Procedimental: Definimos un conjunto de operaciones (procedimiento) que se comportan como una operacin. Abstraccin de Iteracin: Abstraccin que permite trabajar sobre colecciones de objetos sin tener que preocuparse por la forma concreta en que se organizan.
Pgina 14
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin
Hay tres razones por las que podra usar un objeto Number en lugar de un primitivo: 1. Como un argumento de un mtodo que espera un objeto (a menudo usado cuando se manipulan colecciones de nmeros). 2. Para usar las constantes definidas por la clase, tales como MIN_VALUE y MAX_VALUE, que proveen lmites superiores e inferiores del tipo de datos. 3. Para usar mtodos de clase para conservar valores hacia y desde otros tipos de datos primitivos, para convertir hacia y desde cadenas, y para convertir entre sistemas de numeracin (decimal, octal, hexadecimal, binario).
3. TIPOS DE DATOS
3.1 TEORA DE VALORES Y TIPOS
Los valores o datos organizados proveen informacin, todos los sistemas de informacin tienen como objetivo general el de hacer algo requerido por los usuarios con esta informacin. Por lo tanto el estudio de los valores o datos es imprescindible dentro del rea de las ciencias de la computacin.
3.1.1 VALOR
Nuestro mundo gira en torno a valores que adquieren sentido cuando estn organizados, por ejemplo: ``Mara'', 20, 23452, ``Rojas'', 19, 545632, son valores distintos que al parecer organizados cobraran sentido. A continuacin se definir este trmino dentro del contexto de nuestro estudio. Definicin: Un valor es cualquier entidad que puede ser evaluada, almacenada en una estructura de datos, pasada como un argumento a una funcin o procedimiento, retornado como un resultado de una funcin, etc. Cualquier entidad que existe durante una computacin. Todos los lenguajes de programacin involucran el uso de valores. Por ejemplo en Haskell: Valores primitivos (valores de verdad, enteros, reales, etc.). Valores compuestos (tuplas, construcciones, cadenas, listas y abstracciones de funciones).
3.1.2 TIPO
Es til agrupar los valores en tipos. Por ejemplo: los valores de verdad se distinguen claramente de los valores enteros, puesto que existen operaciones propias para los valores de verdad que no son aplicables a los valores enteros y tambin viceversa. Definicin: Un tipo es un conjunto de valores que tienen caractersticas en comn y exhiben un comportamiento uniforme bajo ciertas operaciones. Unidad N 2: Elementos Constitutivos de lenguajes y Paradigmas Pgina 15
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin Es importante recalcar que todo el conjunto de valores en un tipo exhibe un comportamiento uniforme bajo las operaciones asociadas con el tipo. As el conjunto {13,'e', true} no es un tipo; pero {false, true} es un tipo porque sus valores exhiben un comportamiento uniforme bajo las operaciones de negacin, conjuncin y disyuncin. El tipo de una expresin nos indica los valores que sta puede representar y las operaciones que pueden aplicarse a ellas. Es posible sumar los enteros, pero no los valores booleanos verdadero (true) y falso (false). De este modo, el operador + puede aplicarse a dos expresiones de tipo entero, pero no a dos expresiones de tipo booleano. Un principio del diseo de lenguajes de uso muy extendido es que toda expresin debe tener un tipo nico. Segn este principio, los tipos constituyen un mecanismo para clasificar expresiones. En ciencias de la computacin, un sistema de tipos define cmo un lenguaje de programacin clasifica los valores y las expresiones en tipos, cmo se pueden manipular estos tipos y cmo interactan. Un tipo indica un conjunto de valores que tienen el mismo significado genrico o propsito (aunque algunos tipos, como los tipos de datos abstractos y tipos de datos funcin, tal vez no representen valores en el programa que se est ejecutando). Los sistemas de tipificacin varan significativamente entre lenguajes, siendo quizs las ms importantes variaciones las que estn en sus implementaciones de la sintctica en tiempo de compilacin y la operativa en tiempo de ejecucin. Un compilador puede usar el tipo esttico de un valor para optimizar el almacenamiento que necesita y la eleccin de los algoritmos para las operaciones sobre ese valor. Por ejemplo, para tipo float el lenguaje C usa operaciones especficas de coma flotante sobre estos valores (suma de coma flotante, multiplicacin, etc.). El rango del tipo de dato limita y la forma de su evaluacin afecta en el "tipado" del lenguaje. Adems, un lenguaje de programacin puede asociar una operacin concreta con diferentes algoritmos para cada tipo de dato en el caso del polimorfismo. La teora de tipos de datos es el estudio de los sistemas de tipificacin, aunque los sistemas de tipos de datos concretos de los lenguajes de programacin se originaron a partir de los problemas tcnicos de las arquitecturas del ordenador, implementacin del compilador y diseo del lenguaje.
3.2
Todo lenguaje de programacin tiene tipos primitivos cuyos valores son atmicos y tipos compuestos cuyos valores estn compuestos a partir de otros valores ms simples. Tipos primitivos Un tipo primitivo es aquel cuyos valores son atmicos y por lo tanto no pueden ser descompuestos en valores ms simples. Lenguaje Java, C++ Haskell C++ Haskell Java, C++ Sintaxis Boolean Bool Int Int, Integer Float Conjunto de Valores { false, true} { false, true} { ... -2, -1, 0, 1, 2 ..} { ... -2, -1, 0, 1, 2 ...} { ..,-1.0,.. 0.0, .. ,..1.0, ...} Notacin Valor- Verdad Valor- Verdad Entero Entero Real
Pgina 16
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin Las opciones de tipos primitivos en un lenguaje de programacin nos dicen mucho acerca del rea de aplicacin predeterminada por el lenguaje. Un lenguaje predeterminado para el rea de comercio (por ejemplo Cobol) provee de tipos primitivos cuyos valores son cadenas de longitud fija y los nmeros de punto fijo. Un lenguaje predeterminado para la computacin numrica (por ejemplo Fortran) es probable que tenga tipos primitivos cuyos valores sean nmeros reales (con opcin de precisin) y tal vez nmeros complejos. Tipos primitivos similares frecuentemente ofrecen lo mismo pero con distintos nombres en los distintos lenguajes de programacin. Por lo tanto, se utilizara una notacin comn (lenguaje natural en espaol) para referirse a estos tipos, ver el cuadro. En algunos lenguajes el programador puede definir completamente un tipo primitivo nombrando sus valores. Tal tipo es llamado tipo enumerado, sus valores que se denominan y se listan de manera explcita. Ejemplo: Considerar la definicin de tipos enumerados en C: enum Mes {ene, feb, mar, abr, may, jun ,jul, ago, sep, oct, nov, dic} Un tipo primitivo discreto es un tipo cuyos valores tienen relaciones uno-a-uno con un rango de enteros. Esto es un concepto importante en Pascal y Ada, en los cuales los valores de cualquier tipo primitivo discreto pueden ser usados en una variedad de operaciones, tales como conteo, seleccin de casos e indexado de arreglos. Tipos compuestos Un tipo compuesto (o tipo estructurado de datos) es un tipo cuyos valores son compuestos o estructurados a partir de otros valores simples. Los lenguajes de programacin soportan una variedad amplia de estructuras de datos, por ejemplo: tuplas, registros, variantes, uniones, arreglos, conjuntos, cadenas, listas, rboles, archivos seriales, archivos directos, relaciones, etc. Caso particular: Cadenas Una cadena es una secuencia de caracteres. Las cadenas son soportadas por todos los lenguajes de programacin, sin embargo, no hay un consenso sobre cul sera la clasificacin de estas. Los puntos de discusin son los siguientes: 1. Deberan las cadenas ser valores primitivos o compuestos? 2. Qu operaciones deberan proveerse? Tpicamente las operaciones de cadena son prueba de igualdad, concatenacin, seleccin de caracteres o subcadenas y el ordenamiento lexicogrfico. La forma como se llevaran a cabo estas operaciones dependern si las cadenas con consideradas como: arreglos, listas o incluso clases. Una posibilidad es hacer que la cadena sea un valor primitivo como en ML o Snobol, con valores que son cadenas de cualquier longitud. Otra propuesta es definir a las cadenas como arreglos de caracteres, entonces todas las operaciones sobre los arreglos estn automticamente permitidas para las cadenas, con todas las consecuencias que esto conlleva, por ejemplo en Pascal. En Java las cadenas son clases, donde las operaciones permisibles sobre las cadenas son mtodos. En otros lenguajes las cadenas son secuencias de caracteres (listas) como en Prolog y Haskell.
3.3
VERIFICACIN DE TIPOS
El conocimiento de la clasificacin de los valores en tipos permite al programador utilizar a los datos efectivamente. Una disciplina en la asignacin de los tipos evita la ejecucin de operaciones sin sentido en los programas, por ejemplo: multiplicar un valor de verdad con un carcter.
Pgina 17
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin Para asegurarse que las operaciones no deseadas sean prevenidas, la implementacin del lenguaje debe hacer la verificacin de tipos sobre los operandos. Por ejemplo, antes que una multiplicacin sea realizada, ambos operandos deben ser verificados para asegurarse que son nmeros. En el caso de tipos compuestos, se deben considerar tanto la forma de la composicin y los tipos de los componentes individuales. Las reglas de un sistema de tipos especifican el uso apropiado de cada operador del lenguaje. La verificacin de tipos asegura que las operaciones de un programa se apliquen de manera apropiada. El propsito de la verificacin de tipos es prevenir errores. Durante la ejecucin de un programa, puede ocurrir un error si se aplica una operacin de manera incorrecta, por ejemplo si un entero se interpreta errneamente como cualquier otra cosa. De manera ms precisa, ocurre un error de tipo si una funcin f de tipo S -> T se aplica a alguna a que no sea de tipo S. Se dice que un programa que ejecuta sin errores de tipo tiene seguridad de tipos. En la implementacin de los lenguajes, existe un grado importante de libertad en la verificacin de tipos, esta verificacin puede ser realizada en tiempo de compilacin o en tiempo de ejecucin. Un compilador debe comprobar si el programa fuente sigue tanto las convenciones sintcticas como las semnticas del lenguaje fuente. Esta comprobacin, llamada comprobacin esttica (para distinguirla de la comprobacin dinmica que se realiza durante la ejecucin del programa objeto), garantiza la deteccin y comunicacin de algunas clases de errores de programacin. Los ejemplos de comprobacin esttica incluyen: Comprobaciones de tipos. Un compilador debe informar de un error si se aplica un operador a un operando incompatible; por ejemplo, si se suman una variable tipo matriz y una variable de funcin. Comprobaciones del flujo del control. Las proposiciones que hacen que el flujo del control abandone una construccin deben tener algn lugar a dnde transferir el flujo de control. Por ejemplo, una proposicin break en C o Java hace que el control abandone la proposicin que la engloba, while, for o switch ms cercana; si dicha proposicin englobadora no existe, ocurre un error. Comprobaciones de unicidad. Hay situaciones en que se debe definir un objeto una vez exactamente. Por ejemplo, en Pascal, un identificador debe declararse de forma nica, las etiquetas en una proposicin case deben ser diferentes y no se pueden repetir los elementos en un tipo escalar. Comprobaciones relacionadas con nombres. En ocasiones, el mismo nombre debe aparecer dos o ms veces. Por ejemplo, en Ada, un lazo o bloque puede tener un nombre que aparezca al principio y al final de la construccin. El compilador debe comprobar que se utilice el mismo nombre en ambos sitios. En este captulo, se trata principalmente la comprobacin de tipos. La mayora de las otras comprobaciones estticas son rutinarias y se pueden aplicar utilizando las tcnicas del los conceptos vistos en este captulo. Algunas de ellas pueden formar parte de otras actividades. Por ejemplo, conforme se introduce informacin acerca de un nombre en una tabla de smbolos, se puede comprobar que el nombre est declarado de una nica manera. Muchos compiladores de Pascal combinan la comprobacin esttica y la generacin de cdigo intermedio con el anlisis sintctico. En construcciones ms complejas, como las de Ada, puede ser conveniente tener una pasada de comprobacin de tipos independiente entre el anlisis sintctico y la generacin de cdigo intermedio, como se indica en la figura siguiente
Un comprobador de tipos se asegura de que el tipo de una construccin coincida con el previsto en su contexto. Por ejemplo, el operador aritmtico predefinido mod en Pascal exige operandos de tipo entero, de modo que un comprobador de tipos debe asegurarse de que los operandos de mod tengan tipo entero. De igual manera, el comprobador de tipos debe asegurarse de que la desreferenciacin se aplique slo a un apuntador, de que la indizacin se haga slo sobre una matriz, de que una funcin definida por el usuario se aplique al nmero y tipo correctos de argumentos, etctera. Un poco ms Unidad N 2: Elementos Constitutivos de lenguajes y Paradigmas Pgina 18
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin adelante veremos la especificacin de un comprobador de tipos simple. Luego vemos la representacin de los tipos y la cuestin de cundo concuerdan dos tipos. Puede necesitarse la informacin sobre los tipos reunida por un comprobador de tipos cuando se genera el cdigo. Por ejemplo, los operadores aritmticos como + normalmente se aplican tanto a enteros como a reales, tal vez a otros tipos, y se debe examinar el contexto de + para determinar el sentido que se pretende dar. Se dice que un smbolo que puede representar diferentes operaciones en diferentes contextos est "sobrecargado". La sobrecarga puede ir acompaada de coaccin de tipos, donde un compilador proporciona un operador para convertir un operando en el tipo esperado por el contexto. Lenguajes de tipificacin esttica En un lenguaje de tipificacin esttica, cada variable y parmetro tiene un tipo fijo que es elegido por el programador, as el tipo de cada expresin y cada operacin puede ser deducido con la verificacin de tipos en tiempo de compilacin. Los programas se verifican estticamente, hasta donde es posible, slo una vez durante la traduccin del texto fuente. Por ejemplo, un compilador de Fortran puede ver en el texto fuente que + se aplicar a un par de enteros cada vez que la expresin I+J se evale. Ejemplos de lenguajes que usan tipado esttico son C, C++, Java y Haskell. Comparado con el tipado dinmico, el esttico permite que los errores de programacin sean detectados antes, y que la ejecucin del programa sea ms eficiente. Lenguajes de tipificacin dinmica En un lenguaje de tipificacin dinmica, solo los valores tienen tipos fijos. Una variable o parmetro no tiene un tipo designado, pero puede tomar valores de diferentes tipos en tiempo de ejecucin. Esto implica que la verificacin de tipos de los operandos debe hacerse inmediatamente antes de realizar una operacin en tiempo de corrida. Lisp, Smalltalk, Clipper, todos los xBase son ejemplos de lenguajes dinmicamente tipados. Ms ejemplos de lenguajes que usan tipado dinmico son Perl, Python y Lisp. Tipificacin esttica frente a Tipificacin dinmica Debido a la verificacin implcita en tiempo de corrida, la tipificacin dinmica conlleva una ejecucin ms lenta de los programas. Adems, para hacer posible la verificacin de tipos es necesario que cada valor deba ser etiquetado con su tipo, lo que supone el uso de espacio de memoria adicional. El tiempo y el espacio adicional son evitados en los lenguajes de verificacin de tipos esttica, porque toda la verificacin de tipos se la hace en tiempo de compilacin. Una ventaja muy importante del tipificado esttico es la seguridad que garantiza el compilador al detectar los errores de tipos. Esto es importante porque muchos de los errores de tipos en la programacin son una proporcin importante de errores en la programacin. La ventaja de la verificacin de tipos dinmica es la flexibilidad, es decir, la re-utilizacin de cdigo, caracterstica muy importante en estos das. La verificacin esttica es tan efectiva y la dinmica tan cara que las implantaciones de lenguaje a menudo verifican slo aquellas propiedades que pueden verificarse estticamente en el texto fuente. Las propiedades que depende de valores calculados en tiempo de ejecucin, como la divisin entre cero o los ndices de arreglo que se encuentran dentro de los lmites, se verifican muy rara vez. Los trminos estricto y no estricto se refieren a la efectividad con la cual un sistema de tipos evita errores. Un sistema de tipos es estricto si acepta slo expresiones seguras. Algunos lenguajes estticamente tipados tienen una "puerta trasera" en el lenguaje que permite a los programadores escribir cdigo que no es chequeado estticamente. Por ejemplo, los lenguajes como Java y los parecidos al C tienen una "conversin de tipos de datos forzada (cast)"; estas operaciones pueden ser inseguras en tiempo de ejecucin, por que pueden causar comportamientos indeseados cuando el programa se ejecuta. La presencia de un tipado esttico en un lenguaje de programacin no implica necesariamente la ausencia de mecanismos de tipado dinmico. Por ejemplo, Java usa tipado esttico, pero ciertas
Pgina 19
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin operaciones requieren el soporte de test de tipos de datos en tiempo de ejecucin, que es una forma de tipado dinmico.
Chequeo de tipificacin esttico y dinmico en la prctica La eleccin entre sistemas de tipificacin dinmico y esttico requiere algunas contra prestaciones. El tipado esttico busca errores en los tipos de datos en tiempo de compilacin. Esto debera incrementar la fiabilidad de los programas procesados. Sin embargo, los programadores, normalmente, estn en desacuerdo en cmo los errores de tipos de datos ms comunes ocurren, y en qu proporcin de estos errores que se han escrito podran haberse cazado con un tipado esttico. El tipado esttico aboga por la creencia de que los programas son ms fiables cuando son chequeados sus tipos de datos, mientras que el tipado dinmico apunta al cdigo distribuido que se ha probado que es fiable y un conjunto pequeo de errores. El valor del tipado esttico, entonces, es que se incrementa a la par que se endurece el sistema de tipificacin. Los defensores de los lenguajes fuertemente tipados como ML y Haskell han sugerido que casi todos los errores pueden ser considerados errores de los tipos de datos, si los tipos de datos usados en un programa estn suficientemente bien declarados por el programador o inferidos por el compilador. El tipado esttico resulta, normalmente, en un cdigo compilado que se ejecuta ms rpidamente. Cuando el compilador conoce los tipos de datos exactos que estn en uso, puede producir cdigo mquina optimizado. Adems, los compiladores en los lenguajes de tipado esttico pueden encontrar atajos ms fcilmente. Algunos lenguajes de tipificacin dinmica como el lisp permiten declaraciones de tipos de datos opcionales para la optimizacin por esta misma razn. El tipado esttico generaliza este uso. En contraste, el tipado dinmico permite a los compiladores e intrpretes ejecutarse ms rpidamente, debido a que los cambios en el cdigo fuente en los lenguajes dinmicamente tipados puede resultar en un menor chequeo y menos cdigo que revisar. Esto tambin reduce el ciclo editarcompilar-comprobar-depurar.
3.4
SISTEMAS DE TIPOS
Los lenguajes de programacin clsicos como Pascal y C tienen sistema de tipos muy simples. Cada constante, variable, resultado de funcin, y parmetro formal debe ser declarado con un tipo especfico. Un tipo de sistema como este es llamado monomrfico donde la verificacin de tipos es esttica. Desafortunadamente, la experiencia nos muestra que un sistema de tipos monomrfico no es satisfactorio, especialmente para escribir cdigo re-usable. Muchos algoritmos son naturalmente genricos, como por ejemplo un algoritmo de ordenamiento de un grupo de elementos. Asignar tipos de datos (tipificar) da significado a colecciones de bits. Los tipos de datos normalmente tienen asociaciones tanto con valores en la memoria o con objetos como con variables. Como cualquier valor simplemente consiste en un conjunto de bits de un ordenador, el hardware no hace distincin entre direccin de memoria, cdigo de instruccin, caracteres, enteros y nmeros en coma flotante. Los tipos de datos informan a los programas y programadores cmo deben ser tratados esos bits. Las principales funciones que los sistemas de tipificacin ofrecen son: Seguridad - El uso de tipos de datos puede permitir a un compilador detectar incoherencias en el significado o cdigo probablemente invlido. Por ejemplo, podemos identificar una expresin 3 / "Hello, World" como invlida porque no se puede dividir (de forma normal) un entero por una cadena de caracteres. Un sistema de tipado fuerte ofrece ms seguridad, pero no garantiza, necesariamente una seguridad completa. Optimizacin - Un sistema de tipado esttico puede dar informacin muy til al compilador. Por ejemplo, si un tipo de dato dice que un valor debe alinearse en mltiplos de 4, el compilador puede usar de forma ms eficiente las instrucciones mquina. Unidad N 2: Elementos Constitutivos de lenguajes y Paradigmas Pgina 20
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin Documentacin - En sistemas de tipificacin ms expresivos, los tipos de datos pueden servir como una forma de documentacin, porque pueden ilustrar la intencin del programador. Por ejemplo, los tem de tiempos pueden ser un subtipo de un entero, pero si un programador declara una funcin como que devuelve tems de tiempo en lugar de un simple entero, esto documenta parte del significado de la funcin. Abstraccin (o modularidad) - Los tipos de datos permiten a los programadores pensar en los programas a un alto nivel, sin tener que preocuparse con el bajo nivel de la implementacin. Por ejemplo, los programadores pueden pensar en una cadena de caracteres como un valor en lugar de un simple array de bytes. O los tipos de datos pueden permitir a los programadores expresar la Interfaz entre dos subsistemas. Esto localiza las definiciones requeridas para la interoperabilidad de los subsistemas y previene de inconsistencias cuando estos subsistemas se comuniquen. Un programa normalmente asocia cada valor con un tipo de dato determinado (aunque un tipo de dato puede tener ms de un subtipo). Otras entidades, como los objetos, bibliotecas, canales de comunicacin, dependencias o, incluso, los propios tipos de datos, pueden ser asociados con un tipo de dato. Por ejemplo: Tipo de dato - un tipo de dato de un valor clase - un tipo de dato de un objeto
Un sistema de tipado, especificado en cada lenguaje de programacin, estipula las formas en que los programas pueden ser escritos y hace ilegal cualquier comportamiento fuera de estas reglas.
3.5
CONVERSIN DE TIPOS
Debido a la necesidad de convertir valores de un tipo a valores de otro tipo, algunos lenguajes asocian la conversin en su sistema de tipos de forma que las conversiones se las haga en forma automtica, en algunos casos el programador debe hacer explicitas estas conversiones. Coercin Es la conversin implcita o automtica de un tipo a otro. Por ejemplo: Sea la sqrt una funcin que calcula la raz cuadrada de un nmero real. La llamada sqrt(5) presenta como argumento el numero entero 5, este valor es automticamente convertido al valor real 5.0, sin que el programador se percate de ello para que pueda efectuarse la operacin. La mayora de los lenguajes de programacin maneja la expresin 2*3.142 como si fuera 2.0*3.142. La coercin es la conversin de tipo en otro, realizada automticamente por el lenguaje de programacin. En 2 * 3.142, se hace que el entero 2 sea real antes de que se lleve a cabo la multiplicacin. Ejemplo: Considere el System.out.println de Java class Imprime{ public static void main(Strings args[]) { int i=2; double x=8.1; String p="palabra"; System.out.println(i+x); System.out.println(p+i*x); } } Unidad N 2: Elementos Constitutivos de lenguajes y Paradigmas Pgina 21
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin
Conversin explicita En la conversin explicita el programador se encarga de hacer las conversiones directamente en cdigo (conocida como casting). La forma de escritura de esta conversin depender del lenguaje, ver el siguiente ejemplo en cdigo C y C++.
Ejemplo en C o Java: ... int x; ... x = (int) (1.5 + (double) (x/2)); ... En C++: ... int x; ... x = int(1.5 + double(x/2)); ...
3.6
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin
no se incluyen booleanos. En la evaluacin de condiciones, un valor diferente de cero se reconoce como true y un cero como false.
Pgina 23
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin El flujo de control hace referencia al orden en que las llamadas a funciones, instrucciones y declaraciones son ejecutadas o evaluadas
Secuenciacin declaraciones
1 2
Seleccin
Iteracin
V condiciones
Condicin
...
n
Acciones
Acciones
V
Acciones
Recursividad
Llamadas recursivas
Pgina 24
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin
Abstraccin Procedimental
El mensaje de Smalltalk do: unBloque : es una iteracin general que recorre cada elemento de la coleccin y ejecuta un bloque de cdigo. "Calcula el total de la suma de los nmeros en numeros |numeros suma| numeros := #(1 2 3 4 5). suma := 0. numeros do: [ :num | suma := suma + num]. ^suma
4.2
La estructura if, permite elegir entre dos opciones o alternativas posibles, en funcin del cumplimiento o no de una determinada condicin. Si la condicin es verdadera, se ejecuta las instrucciones 1 y si es falsa, se ejecuta las instrucciones 2. if (condicion) { //instrucciones 1 } else { //instrucciones 2 } La estructura switch, (decisin mltiple) evaluar una expresin que podr tomar n valores distintos: 1, 2, 3,..., n. Segn que elija uno de estos valores en la condicin, se realizar una de las n acciones, o lo que es igual, el flujo del algoritmo seguir sin determinado camino entre los n posibles. switch (expresin_entera) { case (valor1) : instrucciones_1; [break;] case (valor2) : instrucciones_2; [break;] ... case (valorN) : instrucciones_N; [break;] default: instrucciones_por_defecto; } La iteracin se resuelve con las siguientes estructuras:
Pgina 25
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin La estructura while: Permite repetir un ciclo de instrucciones mientras se cumple una determinada condicin. Cuando se ejecuta la instruccin mientras, lo primero que sucede es que se evala la condicin (una expresin booleana). Si se evala falsa, ninguna accin se toma y el programa prosigue en la instruccin siguiente al cuerpo del bucle. Si la expresin booleana es verdadera, entonces se ejecuta el cuerpo del bucle, despus de lo cual se evala de nuevo la expresin booleana. Este proceso se repite una y otra vez mientras la expresin (condicin) sea verdadera. while (condicion) { //instrucciones } La estructura do while: Permite ejecutar un conjunto de instrucciones y repetirlas mientras se cumple una determinada condicin. do { //instrucciones } while (condicion); La estructura for: Permite ejecutar las instrucciones del ciclo un nmero especificado de veces usando una o ms variables de control de ciclo. La estructura est formada por cuatro partes: 1. Inicializacin: Inicializa la o las variables de control. 2. Condicin: Condicin (expresin booleana) del ciclo, generalmente esta directamente relacionada con la o las variables de control. 3. Incremento: Incrementa la o las variable de control, los valores van evolucionando mientras el ciclo se repita. 4. Cuerpo: Sentencia simple o compuesta que se repite de acuerdo a si se cumple la condicin del ciclo o no. for (inicializacion; condicion; incremento) { //instrucciones } Control General del Flujo Cuando se necesita interrumpir el control del flujo se puede utilizar: break: Permite salir de la estructura alternativa mltiple o repetitiva. continue: Permite saltar al principio de una ejecucin repetitiva. return expr : retorna desde una funcin, una expresin o no.
Pgina 26
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin funcin es llamada dos veces con los mismos parmetros, obtendremos siempre el mismo resultado. A esto lo llamamos transparencia referencial y no solo permite al compilador razonar acerca de el comportamiento de un programa, sino que tambin nos permite deducir fcilmente (e incluso demostrar) que una funcin es correcta y as poder construir funciones ms complejas uniendo funciones simples. Las seleccin se resuelve con declaraciones guarded e ifthen..else.
guarded: | x >= y && x>=z =x | y >= x && y>=z =y | otherwise =z if..then..else: if x >= y && x>=z then x else if y >= x && y>=z then y else z Utiliza la recursividad, (una alternativa para las iteraciones).
El objetivo se obtiene mediante un mecanismo conocido como Backtracking (Vuelta atrs). Este mecanismo funciona recorriendo el archivo creado a partir de los hechos y reglas. El orden en que ellas Unidad N 2: Elementos Constitutivos de lenguajes y Paradigmas Pgina 27
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin se detallan tiene importancia. Adems, en la formulacin de metas existe una regla (!) que introduce algo de determinismo en su forma de proceder. Vemos todo esto en detalle en su respectiva unidad. En resumen: La seleccin se podra comparar con las reglas que son afirmaciones condicionales, por ejemplo: Alumno(Juan) es un hecho o afirmacin incondicional Regular(X) if Alumno(X) es una implicacin que and AproboPrimerParcial(X) ser cierta si se cumplen and AproboSegundoParcial(X) las proposiciones dependientes Utiliza el mecanismo de recursividad, por ejemplo, para recorrer las listas.
Ejemplo: Itera de 1 hasta 10, imprimiendo los sucesivos nmeros en la ventana Transcript. 1 to: 10 do: [ :x | Transcript show: x; cr].
5. HERENCIA
La herencia es un mecanismo que permite la definicin de una clase a partir de la definicin de otra ya existente. Es la caracterstica clave de los sistemas orientados a objeto para propiciar entre otros aspectos la reusabilidad.
Pgina 28
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin
5.1
En general el concepto de herencia, se refiere al mecanismo por el cual los objetos comparten comportamiento. En el mundo de las clases se denomina herencia, mientras que en el de los prototipos recibe el nombre de delegacin; en esta forma alterna de implementar conocimiento comn, la distincin entre clases e instancias no es necesaria: cualquier objeto pueden ser un prototipo. Es por esto que existen dos estrategias bsicas, para implemetar el modelo de herencia: ClasesHerencia y Prototipos-Delegacin:
Jerarqua de Clases
Persona
Diseo descendente (TopDown), por especializacin De General
Alumno
Alumno Universitario
A Particular
Pgina 29
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin
Alumno
Docente
Clase Base
Clase Derivada
Figura
Cirdulo
Rectangulo
Triangulo
Clases Derivadas
Ejemplo en Smalltalk
Object
Magnitude
Character
Number
Date
Time
Float
Fraction
Integer
LargeNegativeInteger
SmallInteger
LargePositiveInteger
Pgina 30
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin Las clases no suponen una necesidad prctica en el desarrollo orientado a objetos, los lenguajes basados en prototipos prescinden de ellas y sus funciones se llevan a cabo mediante mecanismos alternativos. La herencia se obtiene a travs de la clonacin de objetos ya existentes, que sirven de prototipos, extendiendo sus funcionalidades. Es un estilo de programacin orientada a objetos en el cual, las "clases" no estn presentes. Lenguajes que lo implementan: Self, JavaScript, entre otros.
5.2
MODELOS DE IMPLEMENTACIN
Pgina 31
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin definicin pero ms uniforme en su aplicacin y por ende es posible, establecer una jerarqua de herencia y de tipos correspondientes lo que facilita la construccin de herramientas que soporten este mecanismo. Por lo tanto se puede afirmar que concatenacin y delegacin pueden ser implementadas en ambos ambientes ya sean de clases o prototipos y el mecanismo de implementar la herencia estar en funcin del propsito y funcionalidad que se persiga en la construccin del sistema. Tener en cuenta que la herencia por concatenacin es ms eficiente porque hereda solo lo que es diferente, no duplica. Lenguajes: Self y Eiffel.
6. POLIMORFISMO
6.1 DEFINICIN DE POLIMORFISMO
La palabra polimorfismo proviene del griego y significa que posee varias formas diferentes. Este es uno de los conceptos esenciales de una programacin orientada a objetos. As como la herencia est relacionada con las clases y su jerarqua, el polimorfismo se relaciona con los mtodos. Esta propiedad, como su mismo nombre sugiere mltiples formas, se refiere a la posibilidad de acceder a un variado rango de funciones distintas a travs de la misma interfaz. O sea, que, en la prctica, un mismo identificador puede tener distintas formas (distintos cuerpos de funcin, distintos comportamientos) dependiendo, en general, del contexto en el que se halle inserto. Otra definicin: Comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al llamarlos por ese nombre se utilizar el comportamiento correspondiente al objeto que se est usando. O dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocacin de un comportamiento en una referencia producir el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en tiempo de ejecucin, esta ltima caracterstica se llama asignacin tarda o asignacin dinmica . Algunos lenguajes proporcionan medios ms estticos (en tiempo de compilacin) de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++.
6.2
TIPOS DE POLIMORFISMO
En general, hay tres tipos de polimorfismo: Polimorfismo de sobrecarga Polimorfismo paramtrico (tambin llamado polimorfismo de plantillas) Polimorfismo de inclusin (tambin llamado redefinicin o subtipado)
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin Por lo tanto, el polimorfismo de sobrecarga nos permite definir operadores cuyos comportamientos varan de acuerdo a los parmetros que se les aplican. As es posible, por ejemplo, agregar el operador + y hacer que se comporte de manera distinta cuando est haciendo referencia a una operacin entre dos nmeros enteros (suma) o bien cuando se encuentra entre dos cadenas de caracteres (concatenacin). Por ejemplo, en Java: El operador +, suma nmeros enteros int a=2, b=3; int c=a+b; //Resultado 5 El operador +, concatena cadenas String String nom=Juan, ape=Perez; String nomCompleto = nom+,+ape; //Resultado Juan,Perez
Por ejemplo, en Haskell: Las clases de tipos proporcionan un modo estructurado de controlar el polimorfismo de sobrecarga. Ejemplos: Los literales 1, 2, etc. son usados para representar tanto valores enteros de precisin arbitraria, como enteros de precisin limitada. Los operadores numricos, como +, suelen estar definidos para distintos tipos numricos. El operador de igualdad (== en Haskell) suele estar definido para bastantes tipos de datos (como los numricos y caracteres) aunque no para todos.
Pgina 34
Universidad Tecnolgica Nacional Facultad Regional Crdoba Dpto de Ingeniera en Sistemas de Informacin Ctedra de Paradigmas de Programacin La habilidad para redefinir un mtodo en clases que se hereda de una clase base se llama especializacin. Por lo tanto, se puede llamar un mtodo de objeto sin tener que conocer su tipo intrnseco: esto es polimorfismo de subtipado. Permite no tomar en cuenta detalles de las clases especializadas de una familia de objetos, enmascarndolos con una interfaz comn (siendo esta la clase bsica). Imagine un juego de ajedrez con los objetos rey, reina, alfil, caballo, torre y pen, cada uno heredando el objeto pieza. El mtodo movimiento podra, usando polimorfismo de subtipado, hacer el movimiento correspondiente de acuerdo a la clase objeto que se llama. Esto permite al programa realizar el movimiento.de_pieza sin tener que verse conectado con cada tipo de pieza en particular. En SmallTalk, el manejo de colecciones es polimrfica, posee una jerarqua y operaciones genricas asociadas, pueden almacenar objetos de cualquier clase y presentan un protocolo unificado, por lo que todas las diferentes formas de colecciones provistas por el entorno responden a un mismo conjunto de mensajes bsicos, lo que facilita su aprendizaje y el cambio de un tipo de coleccin a otra.
7. BIBLIOGRAFA
David A. Watt, William Findlay - 2004 - Programming Language Desing Concepts Robert Sebesta - 2011 - Concepts of Programming Languages Spigariol, Lucas 2008 Apunte de Paradigmas de Programacin UTN, FRBA J. Baltasar Garca Perez-Schofield - Curso de Doctorado: Tecnologas de Objetos - http://webs.uvigo.es/jbgarcia/ Apunte de la Ctedra P.P.R -UTN FRC Tymoschuk/Serra/Castillo Ed. Educa Lenguajes de Programacin - Conceptos y Constructores Ravi Sethy Ed. Addison Wesley Compiladores. Anlisis semntico y chequeo de tipos. Universidad Galileo
Pgina 35