You are on page 1of 90

Programacin Orientada a Objetos

PDF generado usando el kit de herramientas de fuente abierta mwlib. Ver http://code.pediapress.com/ para mayor informacin. PDF generated at: Thu, 29 Mar 2012 14:32:56 UTC

Contenidos
Artculos
Programacin orientada a objetos Paradigma de programacin Objeto (programacin) Herencia (informtica) Abstraccin (informtica) Polimorfismo (informtica) Encapsulamiento (informtica) Mtodo (informtica) Programacin estructurada Simula C++ C (lenguaje de programacin) Interfaz grfica de usuario Programacin dirigida por eventos Ada (lenguaje de programacin) Lisp Pascal (lenguaje de programacin) Sobrecarga Object Pascal 1 6 7 13 16 17 22 23 24 30 31 51 60 64 68 71 78 82 84

Referencias
Fuentes y contribuyentes del artculo Fuentes de imagen, Licencias y contribuyentes 85 87

Licencias de artculos
Licencia 88

Programacin orientada a objetos

Programacin orientada a objetos


La programacin orientada a objetos o POO (OOP segn sus siglas en ingls) es un paradigma de programacin que usa objetos y sus interacciones, para disear aplicaciones y programas informticos. Est basado en varias tcnicas, incluyendo herencia, abstraccin, polimorfismo y encapsulamiento. Su uso se populariz a principios de la dcada de los aos 1990. En la actualidad, existe variedad de lenguajes de programacin que soportan la orientacin a objetos.

Introduccin
Los objetos son entidades que tienen un determinado estado, comportamiento (mtodo) e identidad: El estado est compuesto de datos o informaciones , ser uno o varios atributos a los que se habrn asignado unos valores concretos (datos). El comportamiento est definido por los mtodos o mensajes a los que sabe responder dicho objeto, es decir, qu operaciones se pueden realizar con l. La identidad es una propiedad de un objeto que lo diferencia del resto, dicho con otras palabras, es su identificador (concepto anlogo al de identificador de una variable o una constante). Un objeto contiene toda la informacin que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase, al poder tener valores bien diferenciados en sus atributos. A su vez, los objetos disponen de mecanismos de interaccin llamados mtodos, que favorecen la comunicacin entre ellos. Esta comunicacin favorece a su vez el cambio de estado en los propios objetos. Esta caracterstica lleva a tratarlos como unidades indivisibles, en las que no se separa el estado y el comportamiento. Los mtodos (comportamiento) y atributos (estado) estn estrechamente relacionados por la propiedad de conjunto. Esta propiedad destaca que una clase requiere de mtodos para poder tratar los atributos con los que cuenta. El programador debe pensar indistintamente en ambos conceptos, sin separar ni darle mayor importancia a alguno de ellos. Hacerlo podra producir el hbito errneo de crear clases contenedoras de informacin por un lado y clases con mtodos que manejen a las primeras por el otro. De esta manera se estara realizando una programacin estructurada camuflada en un lenguaje de programacin orientado a objetos. La POO difiere de la programacin estructurada tradicional, en la que los datos y los procedimientos estn separados y sin relacin, ya que lo nico que se busca es el procesamiento de unos datos de entrada para obtener otros de salida. La programacin estructurada anima al programador a pensar sobre todo en trminos de procedimientos o funciones, y en segundo lugar en las estructuras de datos que esos procedimientos manejan. En la programacin estructurada solo se escriben funciones que procesan datos. Los programadores que emplean POO, en cambio, primero definen objetos para luego enviarles mensajes solicitndoles que realicen sus mtodos por s mismos.

Origen
Los conceptos de la programacin orientada a objetos tienen origen en Simula 67, un lenguaje diseado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard del Centro de Cmputo Noruego en Oslo. En este centro, se trabajaba en simulaciones de naves, que fueron confundidas por la explosin combinatoria de cmo las diversas cualidades de diferentes naves podan afectar unas a las otras. La idea surgi al agrupar los diversos tipos de naves en diversas clases de objetos, siendo responsable cada clase de objetos de definir sus propios datos y comportamientos. Fueron refinados ms tarde en Smalltalk, desarrollado en Simula en Xerox PARC (cuya primera versin fue escrita sobre Basic) pero diseado para ser un sistema completamente dinmico en el cual los objetos se podran crear y modificar "sobre la marcha" (en tiempo de ejecucin) en lugar de tener un sistema basado en programas estticos.

Programacin orientada a objetos La programacin orientada a objetos se fue convirtiendo en el estilo de programacin dominante a mediados de los aos ochenta, en gran parte debido a la influencia de C++, una extensin del lenguaje de programacin C. Su dominacin fue consolidada gracias al auge de las Interfaces grficas de usuario, para las cuales la programacin orientada a objetos est particularmente bien adaptada. En este caso, se habla tambin de programacin dirigida por eventos. Las caractersticas de orientacin a objetos fueron agregadas a muchos lenguajes existentes durante ese tiempo, incluyendo Ada, BASIC, Lisp, Pascal, entre otros. La adicin de estas caractersticas a los lenguajes que no fueron diseados inicialmente para ellas condujo a menudo a problemas de compatibilidad y en la capacidad de mantenimiento del cdigo. Los lenguajes orientados a objetos "puros", por su parte, carecan de las caractersticas de las cuales muchos programadores haban venido a depender. Para saltar este obstculo, se hicieron muchas tentativas para crear nuevos lenguajes basados en mtodos orientados a objetos, pero permitiendo algunas caractersticas imperativas de maneras "seguras". El Eiffel de Bertrand Meyer fue un temprano y moderadamente acertado lenguaje con esos objetivos pero ahora ha sido esencialmente reemplazado por Java, en gran parte debido a la aparicin de Internet, y a la implementacin de la mquina virtual de Java en la mayora de navegadores. PHP en su versin 5 se ha modificado, soporta una orientacin completa a objetos, cumpliendo todas las caractersticas propias de la orientacin a objetos.

Conceptos fundamentales
La programacin orientada a objetos es una forma de programar que trata de encontrar una solucin a estos problemas. Introduce nuevos conceptos, que superan y amplan conceptos antiguos ya conocidos. Entre ellos destacan los siguientes: Clase: definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciacin es la lectura de estas definiciones y la creacin de un objeto a partir de ellas. Herencia: (por ejemplo, herencia de la clase C a la clase D) Es la facilidad mediante la cual la clase D hereda en ella cada uno de los atributos y operaciones de C, como si esos atributos y operaciones hubiesen sido definidos por la misma D. Por lo tanto, puede usar los mismos mtodos y variables publicas declaradas en C. Los componentes registrados como "privados" (private) tambin se heredan, pero como no pertenecen a la clase, se mantienen escondidos al programador y slo pueden ser accedidos a travs de otros mtodos pblicos. Esto es as para mantener hegemnico el ideal de OOP. Objeto: entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad (mtodos) los mismos que consecuentemente reaccionan a eventos. Se corresponde con los objetos reales del mundo que nos rodea, o a objetos internos del sistema (del programa). Es una instancia a una clase. Mtodo: Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecucin se desencadena tras la recepcin de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un mtodo puede producir un cambio en las propiedades del objeto, o la generacin de un "evento" con un nuevo mensaje para otro objeto del sistema. Evento: Es un suceso en el sistema (tal como una interaccin del usuario con la mquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. Tambin se puede definir como evento, a la reaccin que puede desencadenar un objeto, es decir la accin que genera. Mensaje: una comunicacin dirigida a un objeto, que le ordena que ejecute uno de sus mtodos con ciertos parmetros asociados al evento que lo gener. Propiedad o atributo: contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto y esto se define como sus caractersticas predeterminadas, y cuyo valor puede ser alterado por la ejecucin de algn mtodo. Estado interno: es una variable que se declara privada, que puede ser nicamente accedida y alterada por un mtodo del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos).

Programacin orientada a objetos No es visible al programador que maneja una instancia de la clase. Componentes de un objeto: atributos, identidad, relaciones y mtodos. Identificacin de un objeto: un objeto se representa por medio de una tabla o entidad que est compuesta por sus atributos y funciones correspondientes. En comparacin con un lenguaje imperativo, una "variable", no es ms que un contenedor interno del atributo del objeto o de un estado interno, as como la "funcin" es un procedimiento interno del mtodo del objeto.

Caractersticas de la POO
Existe un acuerdo acerca de qu caractersticas contempla la "orientacin a objetos", las caractersticas siguientes son las ms importantes: Abstraccin: denota las caractersticas esenciales de un objeto, donde se capturan sus comportamientos. Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cmo se implementan estas caractersticas. Los procesos, las funciones o los mtodos pueden tambin ser abstrados y cuando lo estn, una variedad de tcnicas son requeridas para ampliar una abstraccin.El proceso de abstraccin permite seleccionar las caractersticas relevantes dentro de un conjunto e identificar comportamientos comunes para definir nuevos tipos de entidades en el mundo real. La abstraccin es clave en el proceso de anlisis y diseo orientado a objetos, ya que mediante ella podemos llegar a armar un conjunto de clases que permitan modelar la realidad o el problema que se quiere atacar. Encapsulamiento: Significa reunir a todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstraccin. Esto permite aumentar la cohesin de los componentes del sistema. Algunos autores confunden este concepto con el principio de ocultacin, principalmente porque se suelen emplear conjuntamente. Modularidad: Se denomina Modularidad a la propiedad que permite subdividir una aplicacin en partes ms pequeas (llamadas mdulos), cada una de las cuales debe ser tan independiente como sea posible de la aplicacin en s y de las restantes partes. Estos mdulos se pueden compilar por separado, pero tienen conexiones con otros mdulos. Al igual que la encapsulacin, los lenguajes soportan la Modularidad de diversas formas. Principio de ocultacin: Cada objeto est aislado del exterior, es un mdulo natural, y cada tipo de objeto expone una interfaz a otros objetos que especifica cmo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificacin por quien no tenga derecho a acceder a ellas, solamente los propios mtodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de maneras inesperadas, eliminando efectos secundarios e interacciones inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstraccin. La aplicacin entera se reduce a un agregado o rompecabezas de objetos. Polimorfismo: 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++. Herencia: las clases no estn aisladas, sino que se relacionan entre s, formando una jerarqua de clasificacin. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener

Programacin orientada a objetos que volver a implementarlo. Esto suele hacerse habitualmente agrupando los objetos en clases y estas en rboles o enrejados que reflejan un comportamiento comn. Cuando un objeto hereda de ms de una clase se dice que hay herencia mltiple. Recoleccin de basura: la recoleccin de basura o garbage collector es la tcnica por la cual el entorno de objetos se encarga de destruir automticamente, y por tanto desvincular la memoria asociada, los objetos que hayan quedado sin ninguna referencia a ellos. Esto significa que el programador no debe preocuparse por la asignacin o liberacin de memoria, ya que el entorno la asignar al crear un nuevo objeto y la liberar cuando nadie lo est usando. En la mayora de los lenguajes hbridos que se extendieron para soportar el Paradigma de Programacin Orientada a Objetos como C++ u Object Pascal, esta caracterstica no existe y la memoria debe desasignarse manualmente.

Resumen
La programacin orientada a objetos es un paradigma que utiliza objetos como elementos fundamentales en la construccin de la solucin. Surge en los aos 70. Un objeto es una abstraccin de algn hecho o ente del mundo real que tiene atributos que representan sus caractersticas o propiedades y mtodos que representan su comportamiento o acciones que realizan. Todas las propiedades y mtodos comunes a los objetos se encapsulan o se agrupan en clases. Una clase es una plantilla o un prototipo para crear objetos, por eso se dice que los objetos son instancias de clases.

Lenguajes orientados a objetos


Simula (1967) es aceptado como el primer lenguaje que posee las caractersticas principales de un lenguaje orientado a objetos. Fue creado para hacer programas de simulacin, en donde los "objetos" son la representacin de la informacin ms importante. Smalltalk (1972 a 1980) es posiblemente el ejemplo cannico, y con el que gran parte de la teora de la programacin orientada a objetos se ha desarrollado. Entre los lenguajes orientados a objetos se destacan los siguientes: ABAP -> SAP Lenguaje orientado a eventos ABL Lenguaje de programacin de OpenEdge de Progress Software ActionScript ActionScript 3 Ada C++ C# Clarion Clipper (lenguaje de programacin) (Versin 5.x con librera de objetos Class(y)) D Object Pascal (Embarcadero Delphi) Gambas Harbour Eiffel Fortran 90/95 Java JavaScript (la herencia se realiza por medio de la programacin basada en prototipos) Lexico (en castellano) Objective-C

Ocaml Oz R

Programacin orientada a objetos Perl (soporta herencia mltiple. La resolucin se realiza en preorden, pero puede modificarse al algoritmo linearization C3 por medio del mdulo Class::C3 [1] en CPAN) PHP (a partir de su versin 5) PowerBuilder Python Ruby Smalltalk (Entorno de objetos puro) Magik (SmallWorld) Vala VB.NET Visual FoxPro (en su versin 6) Visual Basic 6.0 Visual DataFlex Visual Objects XBase++ Lenguaje DRP Lenguaje de programacin Scala (lenguaje usado por Twitter) http://www.scala-lang.org/page.jsp Muchos de estos lenguajes de programacin no son puramente orientados a objetos, sino que son hbridos que combinan la POO con otros paradigmas. Al igual que C++ otros lenguajes, como OOCOBOL, OOLISP, OOPROLOG y Object REXX, han sido creados aadiendo extensiones orientadas a objetos a un lenguaje de programacin clsico. Un nuevo paso en la abstraccin de paradigmas de programacin es la Programacin Orientada a Aspectos (POA). Aunque es todava una metodologa en estado de maduracin, cada vez atrae a ms investigadores e incluso proyectos comerciales en todo el mundo.

Enlaces externos
Qu es la programacion orientada a objetos [2]

Referencias
[1] http:/ / search. cpan. org/ perldoc?Class::C3 [2] http:/ / www. desarrolloweb. com/ articulos/ 499. php

Paradigma de programacin

Paradigma de programacin
Un paradigma de programacin es una propuesta tecnolgica que es adoptada por una comunidad de programadores cuyo ncleo central es incuestionable en cuanto a que unvocamente trata de resolver uno o varios problemas claramente delimitados. La resolucin de estos problemas debe suponer consecuentemente un avance significativo en al menos un parmetro que afecte a la ingeniera de software. Tiene una estrecha relacin con la formalizacin de determinados lenguajes en su momento de definicin. Un paradigma de programacin est delimitado en el tiempo en cuanto a aceptacin y uso ya que nuevos paradigmas aportan nuevas o mejores soluciones que la sustituyen parcial o totalmente. Ejemplo : Probablemente el paradigma de programacin que actualmente es el ms usado a todos los niveles es la orientacin a objeto. El ncleo central de este paradigma es la unin de datos y procesamiento en una entidad llamada "objeto", relacionable a su vez con otras entidades "objeto". Tradicionalmente datos y procesamiento se han separado en reas diferente del diseo y la implementacin de software. Esto provoc que grandes desarrollos tuvieran problemas de fiabilidad, mantenimiento, adaptacin a los cambios y escalabilidad. Con la orientacin a objetos y caractersticas como el encapsulado, polimorfismo o la herencia se permiti un avance significativo en el desarrollo de software a cualquier escala de produccin. La orientacin a objeto parece estar ligado en sus orgenes con lenguajes como Lisp y Simula aunque el primero que acuo el ttulo de programacin orientada a objetos fue Smaltalk

Tipos de paradigmas de programacin ms comunes


Imperativo o por procedimientos: es considerado el ms comn y est representado, por ejemplo, por C, BASIC o Pascal Funcional: est representado por Scheme o Haskell. Este es un caso del paradigma declarativo. Lgico: est representado por Prolog. Este es otro caso del paradigma declarativo. Declarativo: por ejemplo la programacin funcional, la programacin lgica, o la combinacin lgico-funcional. Orientado a objetos: est representado por Smalltalk, un lenguaje completamente orientado a objetos. Si bien puede seleccionarse la forma pura de estos paradigmas al momento de programar, en la prctica es habitual que se mezclen, dando lugar a la programacin multiparadigma. Actualmente el paradigma de programacin ms usado es el de la programacin orientada a objetos.

Objeto (programacin)

Objeto (programacin)
En el paradigma de programacin orientada a objetos (POO, o bien OOP en ingls), un objeto se define como la unidad que en tiempo de ejecucin realiza las tareas de un programa. Tambin a un nivel ms bsico se define como la instancia de una clase. Estos objetos interactan unos con otros, en contraposicin a la visin tradicional en la cual un programa es una coleccin de subrutinas (funciones o procedimientos), o simplemente una lista de instrucciones para el computador. Cada objeto es capaz de recibir mensajes, procesar datos y enviar mensajes a otros objetos de manera similar a un servicio. En el mundo de la programacin orientada a objetos (POO), un objeto es el resultado de la instanciacin de una clase. Una clase es el anteproyecto que ofrece la funcionalidad en ella definida, pero sta queda implementada slo al crear una instancia de la clase, en la forma de un objeto. Por ejemplo: dado un plano para construir sillas (una clase de nombre clase_silla), entonces una silla concreta, en la que podemos sentarnos, construida a partir de este plano, sera un objeto de clase_silla. Es posible crear (construir) mltiples objetos (sillas) utilizando la definicin de la clase (plano) anterior. Los conceptos de clase y objetos son anlogos a los de tipo de datos y variable, es decir, definida una clase podemos crear objetos de esa clase, igual que disponiendo de un determinado tipo de dato (por ejemplo el tipo entero), podemos definir variables de dicho tipo: int a,b; ( 'int' es un tipo de dato y 'a' y 'b' son variables de tipo entero con las que podemos operar) Para utilizar la funcionalidad definida en una clase en particular (salvo en las clases abstractas), primeramente es necesario crear un objeto de esa clase. De la misma manera para una persona que desea sentarse, las especificaciones para construir una silla sern de poca utilidad; lo que se necesita es una silla real construida a partir de esas especificaciones. Siguiendo con la analoga anterior, tambin se puede decir que para hacer operaciones aritmticas, de nada sirve por s solo el tipo entero (int); para ello necesitamos variables (o constantes) con las que operar.

Definicin de Objeto
En filosofa un objeto es aquello que puede ser observado, estudiado y aprendido, en contraposicin a la representacin abstracta de ese objeto que se crea en la mente a travs del proceso de generalizacin. Un objeto en POO representa alguna entidad de la vida real, es decir, alguno de los objetos que pertenecen al negocio con que estamos trabajando o al problema con el que nos estamos enfrentando, y con los que podemos interactuar. A travs del estudio de ellos se adquiere el conocimiento necesario para, mediante la abstraccin y la generalizacin, agruparlos segn sus caractersticas en conjuntos, estos conjuntos determinan las clases de objetos con las que estamos trabajando. Primero existen los objetos, luego aparecen las clases en funcin de la solucin que estemos buscando. sta es la forma ms comn de adquirir conocimiento aunque no es la nica. En ocasiones cuando el observador es un experto del negocio (o del problema), el proceso puede ser a la inversa y comenzar el anlisis en una base terica abstracta, sustentada por el conocimiento previo que da lugar primeramente a clases de objetos que satisfagan las necesidades de la solucin. Estos conceptos son parte de la base terica de la idea de objeto y clase utilizados en la POO. Los objetos tienen caractersticas fundamentales que nos permiten conocerlos mediante la observacin, identificacin y el estudio posterior de su comportamiento; estas caractersticas son: Identidad Comportamiento Estado En las ramas de las ciencias de la computacin ms estrictamente matemticas, el trmino objeto es usado en sentido puramente matemtico para referirse a cualquier "cosa". Esta interpretacin resulta til para discutir sobre teoras

Objeto (programacin) abstractas, pero no es suficientemente concreta para servir como definicin de un tipo primitivo en discusiones de ramas ms especficas como en la programacin, que est ms cerca de clculos reales y el procesamiento de informacin.

Identidad
La identidad es la propiedad que permite a un objeto diferenciarse de otros. Generalmente esta propiedad es tal, que da nombre al objeto. Tomemos por ejemplo el "verde" como un objeto concreto de una clase color; la propiedad que da identidad nica a este objeto es precisamente su "color" verde. Tanto es as que para nosotros no tiene sentido usar otro nombre para el objeto que no sea el valor de la propiedad que lo identifica. En programacin la identidad de los objetos sirve para comparar si dos objetos son iguales o no. No es raro encontrar que en muchos lenguajes de programacin la identidad de un objeto est determinada por la direccin de memoria de la computadora en la que se encuentra el objeto, pero este comportamiento puede ser variado redefiniendo la identidad del objeto a otra propiedad.

Comportamiento
El comportamiento de un objeto est directamente relacionado con su funcionalidad y determina las operaciones que este puede realizar o a las que puede responder ante mensajes enviados por otros objetos. La funcionalidad de un objeto est determinada, primariamente, por su responsabilidad. Una de las ventajas fundamentales de la POO es la reusabilidad del cdigo; un objeto es ms fcil de reutilizarse en tanto su responsabilidad sea mejor definida y ms concreta. Una tarea fundamental a la hora de disear una aplicacin informtica es definir el comportamiento que tendrn los objetos de las clases involucradas en la aplicacin, asociando la funcionalidad requerida por la aplicacin a las clases adecuadas.

Estado
El estado de un objeto se refiere al conjunto de los valores de sus atributos en un instante de tiempo dado. El comportamiento de un objeto puede modificar el estado de este. Cuando una operacin de un objeto modifica su estado se dice que esta tiene "efecto colateral". Esto tiene especial importancia en aplicaciones que crean varios hilos de ejecucin. Si un objeto es compartido por varios hilos y en el transcurso de sus operaciones estas modifican el estado del objeto, es posible que se deriven errores del hecho de que alguno de los hilos asuma que el estado del objeto no cambiar (Vase Condicin de carrera).

Representacin en las computadoras


Los objetos aunque son entidades conceptuales, dado el diseo de las computadoras, se corresponde directamente con bloques de memoria de tamao y localizacin especficos. Esto ocurre porque los clculos y el procesamiento de la informacin en ltima instancia requieren de una representacin en la memoria de la computadora. En este sentido, los objetos son primitivas fundamentales necesarias para definir de forma precisa conceptos como referencias, variables y vinculacin de nombres. En ciencias de la computacin se utiliza cotidianamente la interpretacin ms concreta de objeto en lugar de las ms abstractas sin que esto sea considerado un error. Es preciso hacer notar que aunque un bloque de memoria puede aparecer contiguo en un nivel de abstraccin y no contiguo en otro, lo importante es que este aparece contiguo para el programa, quien lo trata como un objeto. Por este motivo, los detalles de implementacin privados de un modelo de objetos, no deben ser expuestos al cliente del objeto, y estos pueden ser cambiados sin que se requieran cambios al cdigo cliente.

Objeto (programacin) Los objetos en la computadora existen entonces, slo dentro de contextos capaces de reconocerlos; un espacio de memoria slo contiene un objeto si un programa lo trata como tal (por ejemplo, reservndolo para uso exclusivo de un procedimiento especfico y/o asocindole un tipo de dato). As, el tiempo de vida de un objeto es el tiempo durante el cual este es tratado como un objeto. Es por esto que los objetos son entidades conceptuales, a pesar de su presencia fsica en la memoria de la computadora. En otras palabras, los conceptos abstractos que no ocupen espacio de memoria en tiempo de ejecucin, no son, de acuerdo con esta definicin, objetos. Ejemplos de estos conceptos son: patrones de diseo exhibidos por un conjunto de clases y tipos de datos en lenguajes de programacin que utilizan tipos estticos. Se llama objeto fantasma a un objeto que no es referenciado en un programa, y que por tanto no sirve a ningn propsito. En un lenguaje que posea un recolector de basura, este marcar la memoria ocupada por el objeto como libre, aunque sta todava contendr los datos del objeto hasta el momento que sea reescrita.

Objetos en la programacin orientada a objetos


En programacin orientada a objetos (POO), una instancia de programa (por ejemplo un programa ejecutndose en una computadora) es tratado como un conjunto dinmico de objetos interactuando entre s. Los objetos en la POO extienden la nocin ms general descrita en secciones anteriores para modelar un tipo muy especfico que est definido fundamentalmente por: 1. atributos que representan los datos asociados al objeto, o lo que es lo mismo sus propiedades o caractersticas. Los atributos y sus valores en un momento dado, determinan el estado de un objeto. 2. mtodos que acceden a los atributos de una manera predefinida e implementan el comportamiento del objeto. Los atributos y mtodos de un objetos estn definidos por su clase, aunque (en un lenguaje dinmico como Python o Ruby) una instancia puede poseer atributos que no fueron definidos en su clase. Algo similar ocurre con los mtodos, una instancia puede contener mtodos que no estn definidos en su clase de la misma manera una clase puede declarar ciertos mtodos como "mtodos de clase", y estos (en dependencia del lenguaje) podrn estar o no presentes en la instancia. En el caso de la mayora de los objetos, los atributos solo pueden ser accedidos a travs de los mtodos, de esta manera es ms fcil garantizar que los datos permanecern siempre en un estado bien definido (Invariante de Clase). En un lenguaje en el que cada objeto es creado a partir de una clase, un objeto es llamado una instancia de esa clase. Cada objeto pertenece a un tipo y dos objetos que pertenezcan a la misma clase tendrn el mismo tipo de dato. Crear una instancia de una clase es entonces referido como instanciar la clase. En casi todos los lenguajes de programacin orientados a objeto, el operador "punto" (.) es usado para referirse o "llamar" a un mtodo particular de un objeto. Un ejemplo de lenguaje que no siempre usa este operador el C++ ya que para referirse a los mtodos de un objeto a travs de un puntero al objeto se utiliza el operador (->). Consideremos como ejemplo una clase aritmtica llamada Aritmtica. Esta clase contiene mtodos como "sumar", "restar", "multiplicar", "dividir", etc. que calculan el resultado de realizar estas operaciones sobre dos nmeros. Un objeto de esta clase puede ser utilizado para calcular el producto de dos nmeros, pero primeramente sera necesario definir dicha clase y crear un objeto. En las secciones a continuacin se muestra como hacer esto utilizando dos lenguajes de programacin: C++ y Python.

Objeto (programacin)

10

Declaracin de una clase


Esta clase podra ser definida de la siguiente manera en C++: class Aritmetica { public: inline int sumar (int a, int b) const { return a + b; } inline int restar (int a, int b) const { return a - b; } inline float multiplicar (int a, int b) const { return a * b; } inline float dividir (int a, int b) const { return a / b; } }; o como sigue en Python: class Aritmetica: def sumar(self, a, b): return a + b def restar(self, a, b): return a - b def multiplicar(self, a, b): return a * b def dividir(self, a, b): return a / b

Objeto (programacin)

11

Instanciacin de una clase en un objeto


Para crear un objeto de tipo 'Aritmetica' (instanciar a Aritmetica) en C++ se hara de la siguiente forma: Aritmetica calculador = Aritmetica(); #Otra manera usando punteros Aritmetica* calculador1 = new Aritmetica(); la misma operacin usando python sera as: calculador = Aritmetica()

Operando con un objeto


Una vez que tenemos un objeto de 'Aritmetica', podemos usarlo para realizar clculos sobre dos nmeros. En C++ contamos con dos objetos de ejemplo: "calculador" y "calculador1", en esta ltima variable en realidad hemos almacenado la direccin de memoria del objeto creado. En este lenguaje esto sienta diferencias a la hora de utilizar el objeto. Para calcular la suma entre 78 y 69 usando un objeto "calculador" necesitaramos un cdigo como el siguiente en C++: int resultado = 0; resultado = calculador.sumar(78, 69); #Otra manera usando punteros resultado = calculador1->sumar(78, 69); ahora usando Python para sumar dos nmeros con el objeto calculador: resultado = calculador.sumar(78, 69) Otro ejemplo del mundo real de un objeto podra ser "mi perro", el cual es una instancia de un tipo (una clase) llamada "perro", la que es una subclase de la clase "animal". En el caso de un objeto polimrfico, algunos detalles de su tipo pueden ser ignorados, por ejemplo el objeto "mi perro" puede ser usado en un mtodo que espera recibir un "animal". Tambin podra usarse un objeto "gato", puesto que esta tambin pertenece a la clase "animal". Pero mientras es accedido como un "animal", algunos atributos de un "perro" o un "gato" permanecern no disponibles, como la "cola", porque no todos los animales tienen colas. Atributos dinmicos en objetos Python y C++ son lenguajes con caractersticas muy diferentes. Python utiliza un sistema de tipos dinmico y C++ en cambio, uno esttico o estricto. El sistema de tipos usado en Python permite al programador agregar atributos a una instancia que no han sido definidos en la clase que le dio origen, cosa que no es posible hacer en un lenguaje como C++, por ejemplo: La clase siguiente en Python no define ningn atributo: class Prueba(object): pass pero es posible hacer lo siguiente: 1: 2: 3: 4: p = Prueba() p.unNumero = 3 print("Atributo unNumero de p = %s" % p.unNumero) Atributo unNumero de p = 3

Objeto (programacin) A la instancia de p creada en la lnea 1, le es asignado en la lnea 2 el valor "3", lo cual crea un atributo de nombre unNumero en p de tipo "int" para almacenar el nmero 3.

12

Relaciones entre objetos


Como ya se ha dicho antes, un sistema orientado a objetos est caracterizado por objetos que interactan entre si. Estas interacciones supone ciertos tipos de relaciones entre los objetos del sistema. La semntica que expresa un objeto en el sistema est determinado en primer lugar, por las relaciones que ste establece con otros objetos o conjunto de objetos. Tomemos como ejemplo un objeto fecha, del que sin establecer ningn tipo de relacin, podra decirse que significa un da del ao particular. Pero si relacionamos ese objeto fecha con un objeto Persona de manera que represente la fecha en que esa persona naci, en ese contexto dado, el mismo objeto fecha adoptara un significado diferente, el de un cumpleaos, aunque sigue siendo una fecha, ahora tiene otra idea asociada. Las relaciones entre objetos no solo estn definidas por los objetos que participan y la circunstancia que los relaciona, sino tambin por la cantidad de objetos (cardinalidad de la relacin) y la direccin de la misma. Una relacin puede tener cardinalidad: uno a uno, ejemplo: un auto tiene un motor uno a muchos, ejemplo: un auto tiene muchas ruedas muchos a muchos, ejemplo: un auto se puede servir en muchas gasolineras y una gasolinera puede servir a muchos autos. y direccionalidad: unidireccional, ejemplo: un auto tiene cuatro ruedas. bidireccional Las relaciones entre objetos ms generales son las siguientes:

Composicin
La composicin (tambin conocida como relacin asociativa) es un tipo de relacin que se establece entre dos objetos que tienen comunicacin persistente. Se utiliza para expresar que un par de objetos tienen una relacin de dependencia para llevar a cabo su funcin, de modo que uno de los objetos involucrados est compuesto por el otro. De manera prctica, es posible reconocer asociatividad entre dos objetos A y B si la proposicin "A tiene un B" (o viceversa) es verdadera. Por ejemplo: "una computador tiene un disco duro" es verdadero, por tanto un objeto computador tiene una relacin de composicin con al menos un objeto disco duro.

Uso
Un objeto usa (conoce) a otro cuando puede enviarle mensajes, por ejemplo, para requerir de este algn servicio. La composicin puede verse como un caso particular de esta relacin.

Delegacin
En ocasiones para lograr flexibilidad de diseo, un objeto es implementado de forma tal que este delegue parte de su funcionalidad en otro objeto. Esto es muy comn en aplicaciones que hacen uso de interfaces grficas de usuario, en las que los controles grficos generales delegan la accin que se ejecutar ante determinado estmulo en otro objeto.

Objeto (programacin)

13

Objetos especializados
Algunos trminos para tipos especializados de objetos son: Singleton: Un objeto del que solo puede existir una nica instancia de su clase durante el tiempo de vida del programa. Functor : un objeto que puede ser utilizado como una funcin. Objeto inmutable: un objeto creado con un estado fijo y que no puede variar en el tiempo de vida del mismo. Objeto de primera clase: un objeto que puede ser utilizado sin restricciones. Contenedor: un objeto que contiene a otros objetos. Fbrica de objetos: un objeto cuyo propsito es crear otros objetos. Metaobjeto: un objeto a partir del cual se pueden crear otros objetos (comparable con una clase, la que no necesariamente es un objeto) Prototipo: un metaobjeto especializado a partir del cual se pueden crear otros objetos copindolo. Objeto todopoderoso: un objeto que sabe mucho o hace mucho. Este es un ejemplo de antipatrn de diseo. Antiobjeto: una metfora computacional til para conceptualizar y solucionar problemas complejos, usualmente con aproximaciones paralelas.

Herencia (informtica)
En orientacin a objetos la herencia es, despus de la agregacin o composicin, el mecanismo ms utilizado para alcanzar algunos de los objetivos ms preciados en el desarrollo de software como lo son la reutilizacin y la extensibilidad. A travs de ella los diseadores pueden crear nuevas clases partiendo de una clase o de una jerarqua de clases preexistente (ya comprobadas y verificadas) evitando con ello el rediseo, la modificacin y verificacin de la parte ya implementada. La herencia facilita la creacin de objetos a partir de otros ya existentes e implica que una subclase obtiene todo el comportamiento (mtodos) y eventualmente los atributos (variables) de su superclase. Es la relacin entre una clase general y otra clase ms especifica. Por ejemplo: Si declaramos una clase prrafo derivada de una clase texto, todos los mtodos y variables asociadas con la clase texto, son automticamente heredados por la subclase prrafo. La herencia es uno de los mecanismos de los lenguajes de programacin orientada a objetos basados en clases, por medio del cual una clase se deriva de otra de manera que extiende su funcionalidad. La clase de la que se hereda se suele denominar clase base, clase padre, superclase, clase ancestro (el vocabulario que se utiliza suele depender en gran medida del lenguaje de programacin). En los lenguajes que cuentan con un sistema de tipos fuerte y estrictamente restrictivo con el tipo de datos de las variables, la herencia suele ser un requisito fundamental para poder emplear el Polimorfismo, al igual que un mecanismo que permita decidir en tiempo de ejecucin qu mtodo debe invocarse en respuesta a la recepcin de un mensaje, conocido como enlace tardo (late binding) o enlace dinmico (dynamic binding).

Ejemplo en Java
public class Mamifero{ private int patas; private String nombre; public void imprimirPatas(){ JOptionPane.showMessageDialog(null," Tiene " + patas + "patas\n","Mamifero", JOptionPane.INFORMATION_MESSAGE); }

Herencia (informtica) public Mamifero(String nombre, int patas){ this.nombre = nombre; this.patas = patas; } } public class Perro extends Mamifero { public Perro(String nombre){ super(nombre, 4); } } public class Gato extends Mamifero { public Gato(String nombre){ super(nombre, 4); } } public class CrearPerro { public static void main(String [] args) { Perro perrito = new Perro("Pantaleon"); perrito.imprimirPatas(); /*Est en la clase mamfero*/ } } Se declaran las clases mamferos, gato y perro, haciendo que gato y perro sean unos mamferos (derivados de esta clase), y se ve como a travs de ellos se nombra al animal pero as tambin se accede a patas dndole el valor por defecto para esa especie. Es importante destacar tres cosas. La primera, es que la herencia no es un mecanismo esencial en el paradigma de programacin orientada a objetos; en la mayora de los lenguajes orientados a objetos basados en prototipos las clases no existen, en consecuencia tampoco existe la herencia y el polimorfismo se logra por otros medios. La segunda, es que el medio preferido para lograr los objetivos de extensibilidad y reutilizacin es la agregacin o composicin. La tercera, es que en lenguajes con un sistema de tipos dbiles, el polimorfismo se puede lograr sin utilizar la herencia. Por otra parte y aunque la herencia no es un concepto indispensable en el paradigma de programacin orientada a objetos, es mucho ms que un mecanismo de los lenguajes basados en clases, porque implica una forma de razonar sobre cmo disear ciertas partes de un programa. Es decir, no slo es un mecanismo que permite implementar un diseo, sino que establece un marco conceptual que permite razonar sobre cmo crear ese diseo.

14

Clase Abstracta
La herencia permite que existan clases que nunca sern instanciadas directamente. En el ejemplo anterior, una clase "perro" heredara los atributos y mtodos de la clase "mamfero", as como tambin "gato", "delfn" o cualquier otra subclase; pero, en ejecucin, no habr ningn objeto "mamfero" que no pertenezca a alguna de las subclases. En ese caso, a una clase as se la conocera como Clase Abstracta. La ausencia de instancias especficas es su nica particularidad, para todo lo dems es como cualquier otra clase.

Herencia (informtica)

15

Herencia y ocultacin de informacin


En ciertos lenguajes, el diseador puede definir qu variables de instancia y mtodos de los objetos de una clase son visibles. En C++ y java esto se consigue con las especificaciones private, protected y public. Slo las variables y mtodos definidos como pblicos en un objeto sern visibles por todos los objetos. En otros lenguajes como Smalltalk, todas las variables de instancia son privadas y todos los mtodos son pblicos. Dependiendo del lenguaje que se utilice, el diseador tambin puede controlar qu miembros de las superclases son visibles en las subclases. En el caso de java y C++ los especificadores de acceso (private, protected, public) de los miembros de la superclase afectan tambin a la herencia: Private: ningn miembro privado de la superclase es visible en la subclase. Protected: los miembros protegidos de la superclase son visibles en la subclase, pero no visibles para el exterior. Public: los miembros pblicos de la superclase siguen siendo pblicos en la subclase.

Redefinicin de mtodos
En la clase derivada se puede redefinir algn mtodo existente en la clase base, con el objeto de proveer una implementacin diferente. Para redefinir un mtodo en la subclase, basta con declararlo nuevamente con la misma signatura (nombre y parmetros). Si se invoca un cierto mtodo de un objeto que no est definido en su propia clase, se dispara la bsqueda hacia arriba en la jerarqua a la que dicha clase pertenece. Sin embargo, si existieran dos mtodos con la misma signatura, uno en la clase y otro en una superclase, se ejecutara el de la clase, no el de la superclase. Cuando se redefine un mtodo en una clase es posible acceder explcitamente al mtodo original de su superclase, mediante una sintaxis especfica que depende del lenguaje de programacin empleado (en muchos lenguajes se trata de la palabra clave super).

Ventajas
Ayuda a los programadores a ahorrar cdigo y tiempo, ya que la clase padre ha sido implementada y verificada con anterioridad, restando solo referenciar desde la clase derivada a la clase base (que suele ser extends, inherits, subclass u otras palabras clave similares, dependiendo del lenguaje). Los objetos pueden ser construidos a partir de otros similares. Para ello es necesario que exista una clase base (que incluso puede formar parte de una jerarqua de clases ms amplia). La clase derivada hereda el comportamiento y los atributos de la clase base, y es comn que se le aada su propio comportamiento o que modifique lo heredado. Toda clase pueden servir como clase base para crear otras.

Estereotipos de herencia
Herencia simple: Una clase slo puede heredar de una clase base y de ninguna otra. Herencia mltiple: Una clase puede heredar las caractersticas de varias clases base, es decir, puede tener varios padres. En este aspecto hay discrepancias entre los diseadores de lenguajes. Algunos de ellos han preferido no admitir la herencia mltiple debido a que los potenciales conflictos entre mtodos y variables con igual nombre, y eventualmente con comportamientos diferentes crea un desajuste cognitivo que va en contra de los principio de la programacin orientada a objetos. Por ello, la mayora de los lenguajes orientados a objetos admite herencia simple. En contraste, algunos pocos lenguajes admiten herencia mltiple, entre ellos: C++, Python, PHP, Eiffel, mientras que Smalltalk, Java, Ada y C# slo permiten herencia simple.

Abstraccin (informtica)

16

Abstraccin (informtica)
La abstraccin consiste en aislar un elemento de su contexto o del resto de los elementos que lo acompaan. En programacin, el trmino se refiere al nfasis en el "qu hace?" ms que en el "cmo lo hace?" (caracterstica de caja negra). El comn denominador en la evolucin de los lenguajes de programacin, desde los clsicos o imperativos hasta los orientados a objetos, ha sido el nivel de abstraccin del que cada uno de ellos hace uso. Los lenguajes de programacin son las herramientas mediante las cuales los diseadores de lenguajes pueden implementar los modelos abstractos. La abstraccin ofrecida por los lenguajes de programacin se puede dividir en dos categoras: abstraccin de datos (pertenecientes a los datos) y abstraccin de control (perteneciente a las estructuras de control). Los diferentes paradigmas de programacin han aumentado su nivel de abstraccin, comenzando desde los lenguajes de mquina, lo ms prximo al ordenador y ms lejano a la comprensin humana; pasando por los lenguajes de comandos, los imperativos, la orientacin a objetos (OO), la Programacin Orientada a Aspectos (POA); u otros paradigmas como la programacin declarativa, etc. La abstraccin encarada desde el punto de vista de la programacin orientada a objetos expresa las caractersticas esenciales de un objeto, las cuales distinguen al objeto de los dems. Adems de distinguir entre los objetos provee lmites conceptuales. Entonces se puede decir que la encapsulacin separa las caractersticas esenciales de las no esenciales dentro de un objeto. Si un objeto tiene ms caractersticas de las necesarias los mismos resultarn difciles de usar, modificar, construir y comprender. La misma genera una ilusin de simplicidad dado a que minimiza la cantidad de caractersticas que definen a un objeto. Durante aos, los programadores se han dedicado a construir aplicaciones muy parecidas que resolvan una y otra vez los mismos problemas. Para conseguir que sus esfuerzos pudiesen ser utilizados por otras personas se cre la POO que consiste en una serie de normas para garantizar la interoperabilidad entre usuarios de manera que el cdigo se pueda reutilizar.

Uso
A grandes rasgos, la abstraccin, permite que dispongamos de las caractersticas de un objeto que necesitemos. Si necesitamos el objeto Persona, podramos poner nombre, edad, direccin, estado civil, etc. Si lo necesitamos en un sistema administrativo, pero, si lo requerimos para el rea de biologa, dentro de sus atributos quiz tengamos, ADN, RND, Gen x1, Gen x2, etc. Y los atributos antes mencionados no sean requeridos. En general, podemos decir que Persona cuenta con todos los atributos mencionados aqu, pero, por el proceso de abstraccin excluimos todos aquellos, que no tiene cabida en nuestro sistema. Se define como un metodo por el cual rescata los datos relevantes e ignora los datos irrelevantes.

Ejemplo
Pensar en trminos de objetos es muy parecido a cmo lo haramos en la vida real. Una analoga sera modelizar un coche en un esquema de POO. Diramos que el coche es el elemento principal que tiene una serie de caractersticas, como podran ser el color, el modelo o la marca. Adems tiene una serie de funcionalidades asociadas, como pueden ser ponerse en marcha, parar o aparcar. En un esquema POO el coche sera el objeto, las propiedades seran las caractersticas como el color o el modelo y los mtodos seran las funcionalidades asociadas como ponerse en marcha o parar. Por poner otro ejemplo vamos a ver cmo modelizaramos en un esquema POO una fraccin, es decir, esa estructura matemtica que tiene un numerador y un denominador que divide al numerador, por ejemplo 3/2. La fraccin ser el

Abstraccin (informtica) objeto y tendr dos propiedades, el numerador y el denominador. Luego podra tener varios mtodos como simplificarse, sumarse con otra fraccin o nmero, restarse con otra fraccin, etc. Estos objetos son utilizables en los programas, por ejemplo en un programa de matemticas se puede hacer uso de objetos fraccin y en un programa que gestione un taller de coches, objetos coche. Los programas orientados a objetos utilizan muchos objetos para realizar las acciones que se desean realizar y ellos mismos tambin son objetos. Es decir, el taller de coches ser un objeto que utilizar objetos coche, herramienta, mecnico, recambios, etc.

17

Polimorfismo (informtica)
En programacin orientada a objetos el polimorfismo se refiere a la posibilidad de enviar un mensaje a un grupo de objetos cuya naturaleza puede ser heterognea. El nico requisito que deben cumplir los objetos que se utilizan de manera polimrfica es saber responder al mensaje que se les enva. La apariencia del cdigo puede ser muy diferente dependiendo del lenguaje que se utilice, ms all de las obvias diferencias sintcticas. Por ejemplo, en un lenguaje de programacin que cuenta con un sistema de tipos dinmico (en los que las variables pueden contener datos de cualquier tipo u objetos de cualquier clase) como Smalltalk no se requiere que los objetos que se utilizan de modo polimrfico sean parte de una jerarqua de clases. En lenguajes basados en clases y con un sistema de tipos de datos fuerte (independientemente si la verificacin se realiza en tiempo de compilacin o de ejecucin), es posible que el nico modo de poder utilizar objetos de manera polimrfica sea que compartan una raz comn, es decir, una jerarqua de clases, ya que esto proporciona la compatibilidad de tipos de datos necesaria para que sea posible utilizar una misma variable de referencia (que podr apuntar a objetos de diversas subclases de dicha jerarqua) para enviar el mismo mensaje (o un grupo de mensajes) al grupo de objetos que se tratan de manera polimrfica. En Java, es frecuente y profusamente aconsejada la utilizacin de interfaces (que es un mecanismo del lenguaje que se emplea por medio de la palabra clave Interface) para proveer la necesaria concordancia de tipos para hacer posible el polimorfismo, tambin como un contrato que debe cumplir cualquier clase que implemente una cierta interfaz y como una forma de documentacin para los desarrolladores. A veces, en la literatura que refiere especficamente a Java se hace mencin a "herencia y polimorfismo de interfaces", lo que no concuerda con los conceptos de la programacin orientada a objetos porque una clase que implementa una interfaz slo obtiene su tipo de datos y la obligacin de implementar sus mtodos, no obtiene comportamiento ni de atributos. Esto muchas veces resulta paradjico porque en Java frecuentemente se utiliza la mal llamada "herencia de interfaces" para dotar a una clase con un tipo adicional (o varios) para que su uso en combinacin con la agregacin (colaboracin o composicin) permita evitar la necesidad de la herencia mltiple y favorezca una utilizacin ms amplia del polimorfismo. No obstante, el uso de una jerarqua de clases como paso previo, es muy habitual incluso en aquellos lenguajes en los que es posible prescindir de tal jerarqua, ya que, desde una perspectiva conceptual, se puede decir que al pertenecer los "objetos polimrficos" a subclases de una misma jerarqua, se asegura la equivalencia semntica de los mensajes que se invocarn de modo polimrfico. Por esto, en programacin orientada a objetos a veces se denomina al polimorfismo como "polimorfismo de subclase (o de subtipo)". En resumen, en la programacin orientada a objetos, la esencia del polimorfismo no atae a la clase o prototipo de la que provienen los objetos. An as, en los lenguajes basados en clases, es habitual (y en algunos tal vez sea el nico modo) que dichos objetos pertenezcan a subclases pertenecientes a una misma jerarqua. Entonces, el polimorfismo debe verse como una forma flexible de usar un grupo de objetos (como si fueran slo uno). Podra decirse que el polimorfismo en esencia refiere al comportamiento de los objetos, no a su pertenencia a una jerarqua de clases (o a sus tipos de datos).

Polimorfismo (informtica) Lo anterior se hace an ms evidente en lenguajes de programacin orientada a objetos basados en prototipos, como Self, en los que las clases no existen. Adems, es importante remarcar que si un cierto grupo de objetos pueden utilizarse de manera polimrfica es porque, en ltima instancia, todos ellos saben responder a un cierto mensaje (o a varios), pero dado que esos mismos objetos generalmente contendrn otros mtodos (que otros objetos en dicho grupo no contienen), difcilmente se pueda decir lisa y llanamente que los objetos son polimrficos; lo correcto es decir que esos objetos se pueden utilizar de modo polimrfico para un cierto conjunto de mensajes. Un ejemplo. Podemos crear dos clases distintas: Pez y Ave que heredan de la superclase Animal. La clase Animal tiene el mtodo abstracto mover que se implementa de forma distinta en cada una de las subclases (peces y aves se mueven de forma distinta). Entonces, un tercer objeto puede enviar el mensaje mover a un grupo de objetos Pez y Ave por medio de una variable de referencia de clase Animal, haciendo as un uso polimrfico de dichos objetos respecto del mensaje mover. El concepto de polimorfismo, desde una perspectiva ms general, se puede aplicar tanto a funciones como a tipos de datos. As nacen los conceptos de funciones polimrficas y tipos polimrficos. Las primeras son aquellas funciones que pueden evaluarse o ser aplicadas a diferentes tipos de datos de forma indistinta; los tipos polimrficos, por su parte, son aquellos tipos de datos que contienen al menos un elemento cuyo tipo no est especificado.

18

Clasificacin
Se puede clasificar el polimorfismo en dos grandes clases: Polimorfismo dinmico (o polimorfismo paramtrico) es aqul en el que el cdigo no incluye ningn tipo de especificacin sobre el tipo de datos sobre el que se trabaja. As, puede ser utilizado a todo tipo de datos compatible. Polimorfismo esttico (o polimorfismo ad hoc) es aqul en el que los tipos a los que se aplica el polimorfismo deben ser explicitados y declarados uno por uno antes de poder ser utilizados. El polimorfismo dinmico unido a la herencia es lo que en ocasiones se conoce como programacin genrica. Tambin se clasifica en herencia por redefinicin de mtodos abstractos y por mtodo sobrecargado. El segundo hace referencia al mismo mtodo con diferentes parmetros. Otra clasificacin agrupa los polimorfismo en dos tipos: Ad-Hoc que incluye a su vez sobrecarga de operadores y coercin, Universal (inclusin o controlado por la herencia, paramtrico o genericidad).

Ejemplo de polimorfismo
En el siguiente ejemplo hacemos uso del lenguaje C++ para ilustrar el polimorfismo. Se observa a la vez el uso de las funciones virtuales puras, como se les conoce en C++, estas funciones constituyen una interfaz ms consistente cuando se trabaja con una jerarqua de clases, puesto que hacen posible el enlace durante la ejecucin. Sin embargo como se ver, para que el polimorfismo funcione no es una condicin obligatoria que todas las funciones en la clase base sean declaradas como virtuales.

Polimorfismo (informtica)

19

Diagrama de clases UML, que describe grficamente la relacin entre la clase base Figura y sus posibles clases derivadas, y la entidad que utiliza esta estructura: la Aplicacin, tambin identificado como objeto Cliente. #include<iostream> using namespace std;

class Figura { private: float base; float altura; public: void captura(); virtual unsigned float perimetro()=0; virtual unsigned float area()=0; };

class Rectangulo: public Figura { public: void imprime(); unsigned float perimetro(){return 2*(base+altura);} unsigned float area(){return base*altura;} };

class Triangulo: public Figura { public: void muestra(); unsigned float perimetro(){return 2*altura+base} unsigned float area(){return (base*altura)/2;} };

void Figura::captura() { cout << "CALCULO DEL AREA Y PERIMETRO DE UN TRIANGULO ISSCELES Y UN RECTANGULO:" << endl;

Polimorfismo (informtica)
cout << "escribe la altura: "; cin >> altura;

20

cout << "escribe la base: "; cin >> base;

cout << "EL PERIMETRO ES: " << perimetro(); cout << "EL AREA ES: " << area(); }

Polimorfismo desde una interfaz


Aunque el polimorfismo es el mismo se aplique donde se aplique, el modo en que se aplica desde una interfaz puede resultar un poco ms oscuro y difcil de entender. Se expone un sencillo ejemplo (en VB-NET) comentado para entender como funciona aplicado desde una interfaz, primero se escribe el cdigo y luego se comenta el funcionamiento. Nota: para no enturbiar el cdigo en exceso, todo lo que no se declara privado se sobreentiende pblico. ' Declaramos una interfaz llamada IOperar y declaramos una funcin llamada Operar ' que implementarn las clases deseadas: Interface IOperar Function Operar(valor1 as integer, valor2 as integer) as long End Interface

' Declaramos una clase que trabaja ms alejada del usuario y que contendra funciones comunes ' para las siguiente clase, si no fueran idnticas iran en la interfaz, ' pero al caso de mostrar el polimorfismo se suponen idnticas: Class Operacion Function Calcular(clasellamante as Object) as Long ' aqu ira el cdigo comn a todas las operaciones.... que llaman a esa funcin ' por ejemplo recoger los 2 valores de la operacin, chequear que estn en el rango deseado, etc. ' se supone que la funcin inputValor recoge un valor de algn sitio valor1 as integer = inputValor() valor2 as integer = inputValor() op as New IOperar = clasellamante Return op.Operar(valor1,valor2) 'AQU es donde se utiliza el polimorfismo. End Function End Class

Polimorfismo (informtica) ' Declaramos 2 clases: Sumar y Restar que implementan la interfaz y que llaman a la clase Operacion: Class Sumar Implements IOperar Private Function Operar(valor1 as Integer, valor2 as Integer) as Long Implements IOperar.Operar Return valor1 + valor2 End Function Function Calcular() as Long op as New operacion Return op.Calcular(Me) ' se est llamando a la funcin 'Calcular' de la clase 'Operacin' End Function End Class ' segunda clase.... Class Restar Implements IOperar Private Function Operar(valor1 as Integer, valor2 as Integer) as Long Implements IOperar.Operar Return valor1 - valor2 End Function Function Calcular() as Long op as New operacion Return op.Calcular(Me) ' se est llamando a la funcin 'Calcular' de la clase 'Operacin' End Function End Class Analicemos ahora el cdigo para entender el polimorfismo expuesto en la interfaz: La interfaz expone un mtodo que puede ser implementado por las diferentes clases, normalmente relacionadas entre si. Las clases Sumar y Restar implementan la interfaz pero el mtodo de la interfaz lo declaramos privado para evitar ser accedido libremente y adems tienen un mtodo llamado Calcular que llama a la clase Operacion donde tenemos otro mtodo con el mismo nombre. Es esta clase ltima la que realiza el polimorfismo y debe fijarse como es a travs de una instancia de la interfaz que llama al mtodo operar. La interfaz sabe a qu mtodo de qu clase llamar desde el momento que asignamos un valor a la variable OP en el mtodo Calcular de la clase Operacion, que a su vez recibi la referencia del mtodo Calcular desde la clase que la llama, sea sta cual sea, se identifica a s misma, mediante la referencia Me This segn el lenguaje empleado. Debe notarse que la instancia de la interfaz accede a sus mtodos aunque en sus clases se hayan declarado privadas.

21

Polimorfismo (informtica)

22

Diferencias entre polimorfismo y sobrecarga


El polimorfismo como se muestra en el ejemplo anterior, suele ser bastante ventajoso aplicado desde las interfaces, ya que permite crear nuevos tipos sin necesidad de tocar las clases ya existentes (imaginemos que deseamos aadir una clase Multiplicar), basta con recompilar todo el cdigo que incluye los nuevos tipos aadidos. Si se hubiera recurrido a la sobrecarga durante el diseo exigira retocar la clase anteriormente creada al aadir la nueva operacin Multiplicar, lo que adems podra suponer revisar todo el cdigo donde se instancia a la clase. La sobrecarga se da siempre dentro de una sola clase, mientras que el polimorfismo se da entre clases distintas. Un mtodo est sobrecargado si dentro de una clase existen dos o ms declaraciones de dicho mtodo con el mismo nombre pero con parmetros distintos, por lo que no hay que confundirlo con polimorfismo. En definitiva: La sobrecarga se resuelve en tiempo de compilacin utilizando los nombres de los mtodos y los tipos de sus parmetros; el polimorfismo se resuelve en tiempo de ejecucin del programa, esto es, mientras se ejecuta, en funcin de la clase a la que pertenece el objeto.

Encapsulamiento (informtica)
En Programacin modular, y ms especficamente en programacin orientada a objetos, se denomina encapsulamiento al ocultamiento del estado, es decir, de los datos miembro, de un objeto de manera que slo se puede cambiar mediante las operaciones definidas para ese objeto. Cada objeto est aislado del exterior, es un mdulo natural, y la aplicacin entera se reduce a un agregado o rompecabezas de objetos. El aislamiento protege a los datos asociados a un objeto contra su modificacin por quien no tenga derecho a acceder a ellos, eliminando efectos secundarios e interacciones. De esta forma el usuario de la clase puede obviar la implementacin de los mtodos y propiedades para concentrarse slo en cmo usarlos. Por otro lado se evita que el usuario pueda cambiar su estado de maneras imprevistas e incontroladas.

Encapsulamiento
Como se puede observar de los diagramas, las variables del objeto se localizan en el centro o ncleo del objeto. Los mtodos rodean y esconden el ncleo del objeto de otros objetos en el programa. 'Al empaquetamiento de las variables de un objeto con la proteccin de sus mtodos se le llama encapsulamiento. Tpicamente, el encapsulamiento es utilizado para esconder detalles de la puesta en prctica no importantes de otros objetos. Entonces, los detalles de la puesta en prctica pueden cambiar en cualquier tiempo sin afectar otras partes del programa. El encapsulamiento de variables y mtodos en un componente de software ordenado es, todava, una simple idea poderosa que provee dos principales beneficios a los desarrolladores de software: El encapsulamiento consiste en unir en la Clase las caractersticas y comportamientos, esto es, las variables y mtodos. Es tener todo esto en una sola entidad. En los lenguajes estructurados esto era imposible. Es evidente que el encapsulamiento se logra gracias a la abstraccin y el ocultamiento que veremos a continuacin. La utilidad del encapsulamiento va por la facilidad para manejar la complejidad, ya que tendremos a las Clases como cajas negras donde slo se conoce el comportamiento pero no los detalles internos, y esto es conveniente porque lo que nos interesar ser conocer qu hace la Clase pero no ser necesario saber cmo lo hace. La encapsulacin da lugar a que las clases se dividan en dos partes: 1. Interfaz: Captura la visin externa de una clase, abarcando la abstraccin del comportamiento comn a los ejemplos de esa clase.

Encapsulamiento (informtica) 2. Implementacin: Comprende la representacin de la abstraccin, as como los mecanismos que conducen al comportamiento deseado.

23

Formas de encapsular
1. Estndar (Predeterminado) 2. Abierto : Hace que el miembro de la clase pueda ser accedido desde el exterior de la Clase y cualquier parte del programa. 3. Protegido : Solo es accesible desde la Clase y las clases que heredan (a cualquier nivel). 4. Semi cerrado : Solo es accesible desde la clase heredada 5. Cerrado : Solo es accesible desde la Clase. En el encapsulamiento hay analizadores que pueden ser semnticos y sintcticos.

Mtodo (informtica)
En la programacin orientada a objetos, un mtodo es una subrutina asociada exclusivamente a una clase (llamados mtodos de clase o mtodos estticos) o a un objeto (llamados mtodos de instancia). Anlogamente a los procedimientos en los lenguajes imperativos, un mtodo consiste generalmente de una serie de sentencias para llevar a cabo una accin, un juego de parmetros de entrada que regularn dicha accin y o, posiblemente, un valor de salida (o valor de retorno) de algn tipo. Algunos lenguajes de programacin asumen que un mtodo debe de mantener el invariante del objeto al que est asociado asumiendo tambin que ste es vlido cuando el mtodo es invocado. En lenguajes compilados dinmicamente, los mtodos pueden ser objetos de primera clase, y en este caso se puede compilar un mtodo sin asociarse a ninguna clase en particular, y luego asociar el vnculo o contrato entre el objeto y el mtodo en tiempo de ejecucin. En cambio en lenguajes no compilados dinmicamente o tipados estticamente, se acude a precondiciones para regular los parmetros del mtodo y postcondiciones para regular su salida (en caso de tenerla). Si alguna de las precondiciones o postcondiciones es falsa el mtodo genera una excepcin. Si el estado del objeto no satisface la invariante de su clase al comenzar o finalizar un mtodo, se considera que el programa tiene un error de programacin. La diferencia entre un procedimiento (generalmente llamado funcin si devuelve un valor) y un mtodo es que ste ltimo, al estar asociado con un objeto o clase en particular, puede acceder y modificar los datos privados del objeto correspondiente de forma tal que sea consistente con el comportamiento deseado para el mismo. As, es recomendable entender a un mtodo no como una secuencia de instrucciones sino como la forma en que el objeto es til (el mtodo para hacer su trabajo). Por lo tanto, podemos considerar al mtodo como el pedido a un objeto para que realice una tarea determinada o como la va para enviar un mensaje al objeto y que ste reaccione acorde a dicho mensaje.

Tipos de mtodos
Como ya se mencion, los mtodos de instancia estn relacionados con un objeto en particular, mientras que los mtodos estticos o de clase (tambin denominados mtodos compartidos) estn asociados a una clase en particular. En una implementacin tpica, a los mtodos de instancia se les pasa una referencia oculta al objeto al que pertenecen, comnmente denominada this o self (referencias a s mismo por sus significados en ingls), para que puedan acceder a los datos asociados con el mismo. Un ejemplo tpico de un mtodo de clase sera uno que mantuviera la cuenta de la cantidad de objetos creados dentro de esa clase.

Mtodo (informtica) Los llamados mtodos obtener y mtodos establecer (en ingls get y set) proveen un mecanismo para leer y modificar (respectivamente) los datos privados que se encuentran almacenados en un objeto o clase. Algunos lenguajes de programacin requieren la definicin de constructores, siendo estos mtodos de instancia especiales llamados automticamente cuando se crea una instancia de alguna clase. En Java y C++ se distinguen por tener el mismo nombre de la clases a la que estn asociados. Lenguajes como Smalltalk no requieren constructores ni destructores. Los mtodos de acceso son un tipo de mtodo normalmente pequeo y simple que se limita a proveer informacin acerca del estado de un objeto. Aunque introduce una nueva dependencia, la utilizacin de mtodos es preferida a acceder directamente a la informacin para proveer de una nueva capa de abstraccin (programacin orientada a objetos). Por ejemplo, si una clase que modela una cuenta bancaria provee de un mtodo de acceso "obtenerBalance()" en versiones posteriores de la clase se podra cambiar el cdigo de dicho mtodo substancialmente sin que el cdigo dependiente de la clase tuviese que ser modificado (un cambio sera necesario siempre que el tipo de dato devuelto por el mtodo cambie). Los mtodos de acceso que pueden cambiar el estado de un objeto son llamados, frecuentemente, mtodos de actualizacin mtodos de mutacin; a su vez, los objetos que proveen de dichos mtodos son denominados objetos mutables.

24

Programacin estructurada
La programacin estructurada es una tcnica para escribir programas (programacin de computadora) de manera clara. Para ello se utilizan nicamente tres estructuras: secuencia, seleccin e iteracin; siendo innecesario el uso de la instruccin o instrucciones de transferencia incondicional (GOTO, EXIT FUNCTION, EXIT SUB o mltiples RETURN). Hoy en da las aplicaciones informticas son mucho ms ambiciosas que las necesidades de programacin existentes en los aos 1960, principalmente debido a las aplicaciones grficas, por lo que las tcnicas de programacin estructurada no son suficientes. Ello ha llevado al desarrollo de nuevas tcnicas, tales como la programacin orientada a objetos y el desarrollo de entornos de programacin que facilitan la programacin de grandes aplicaciones.

Orgenes de la programacin estructurada


A finales de los aos 1970 surgi una nueva forma de programar que no solamente daba lugar a programas fiables y eficientes, sino que adems estaban escritos de manera que facilitaba su comprensin posterior. El teorema del programa estructurado, propuesto por Bhm-Jacopini, demuestra que todo programa puede escribirse utilizando nicamente las tres instrucciones de control siguientes: Secuencia Instruccin condicional. Iteracin (bucle de instrucciones) con condicin al principio. Solamente con estas tres estructuras se pueden escribir todos los programas y aplicaciones posibles. Si bien los lenguajes de programacin tienen un mayor repertorio de estructuras de control, stas pueden ser construidas mediante las tres bsicas citadas.

Programacin estructurada

25

Estructura secuencial
Una estructura de programa es secuencial si las instrucciones se ejecutan una tras otra, a modo de secuencia lineal, es decir que una instruccin no se ejecuta hasta que finaliza la anterior, ni se bifurca el flujo del programa. Ejemplo: INPUT x INPUT y auxiliar= x x= y y= auxiliar PRINT x PRINT y Esta secuencia de instrucciones permuta los valores de x e y, con ayuda de una variable auxiliar, intermedia. 1 Se guarda una copia del valor de x en auxiliar. 2 Se guarda el valor de y en x, perdiendo su valor anterior, pero se mantiene una copia del contenido en auxiliar. 3 Se copia a y el valor de auxiliar, que es el valor inicial de x. El resultado es el intercambio de los valores entre x e y, en tres operaciones secuenciales.

Estructura selectiva o de seleccin


La estructura selectiva permite que la ejecucin del programa se bifurque a una instruccin (o conjunto) u otra/s, segn un criterio o condicin lgica establecida, slo uno de los caminos en la bifurcacin ser el tomado para ejecutarse. Ejemplo: IF a > b THEN PRINT a ; " es mayor que " ; b ELSE PRINT a ; " no es mayor que " ; b END IF La instruccin selectiva anterior puede presentar uno de dos mensajes: a es mayor que b o a no es mayor que b, segn el resultado de la comparacin entre a y b; si el resultado de a > b es verdadero, se presenta el primer mensaje, si es falso se exterioriza el segundo. Las palabras clave IF, THEN, ELSE, y END IF; constituyen la propia estructura de la instruccin condicional (palabra reservadas), proporcionada por el lenguaje, el usuario no debe utilizar sus nombres salvo para este fin. El caso ejemplo se ha codificado en BASIC. IF seala el comienzo de la instruccin condicional, y se espera que despus siga la condicin lgica de control de la instruccin. THEN seala el fin de la condicin, y despus estar la instruccin a ejecutar si la condicin es verdadera. ELSE es opcional, le sigue la instruccin que se ejecutar si la condicin es falsa. END IF indica el final de la estructura, luego de sta el programa seguir su curso. Ampliando un poco el ejemplo anterior, con estructuras anidadas: IF a > b PRINT ELSEIF a PRINT ELSE THEN a ; " es mayor que " ; b < b THEN a ; " es menor que " ; b

Programacin estructurada PRINT a ; " es igual que " ; b END IF Este ejemplo permite considerar situaciones en las que se tiene ms de dos alternativas. En este caso se ha considerado tres, pero hay situaciones en las que deben considerarse ms casos y para ellos se puede repetir las veces que sea necesario la opcional ELSEIF.

26

Estructura iterativa
Un bucle iterativo o iteracin de una secuencia de instrucciones, hace que se repita su ejecucin mientras se cumpla una condicin, el nmero de iteraciones normalmente est determinado por el cambio en la condicin dentro del mismo bucle, aunque puede ser forzado o explcito por otra condicin. Ejemplo: a= 0 b= 7 DO WHILE b > a PRINT a a= a + 1 LOOP Esta instruccin tiene tres palabras reservadas WHILE, DO y LOOP. DO WHILE: seala el comienzo del bucle ("haga mientras") y despus de estas palabras se espera la condicin lgica de repeticin, si la condicin es verdadera pasa el control al cuerpo del bucle, en caso contrario el flujo salta directamente al final de la estructura, saliendo de la misma. LOOP: seala el final del cuerpo de la estructura de bucle. El bucle mientras, se repite mientras la condicin sea verdadera, esta condicin se comprueba o chequea antes de ingresar al cuerpo del bucle, por lo que el mismo puede que no se ejecute nunca (cuando la condicin es falsa desde un principio) o bien que se repita tantas veces como resulte y mientras la condicin sea cierta. En el ejemplo se tienen definidas dos variables a y b, que al iniciarse el bucle contienen los valores a=0 y b=7. La condicin del bucle es b > a. Si a=0 y b=7. la condicin es verdadera, en el cuerpo del bucle se escribe el valor de a en pantalla y luego se incrementa esa variable en una unidad. Entonces pasa a ser a=1 y b=7. ... (se repite la secuencia) ... Cuando a=6 y b=7. la condicin sigue siendo verdadera, se escribe el valor de a en pantalla y se incrementa en una unidad. Cuando se llega a que a=7 y b=7. Entonces la condicin ya resulta falsa y la instruccin WHILE finaliza, saliendo por LOOP. La salida por pantalla de este ejemplo es 0 1 2 3 4 5 6, y se iter 7 veces. El lenguaje utilizado en el ejemplo (BASIC), adems de tener otras del tipo iterativas, permite utilizar la misma estructura indicada, pero de la siguiente forma: a= 0 b= 7 WHILE b > a PRINT a a= a + 1

Programacin estructurada WEND Que es absolutamente anloga, en ste formato la palabra reservada WEND marca el fin del bucle y no se utiliza ni DO ni LOOP.

27

Anidamiento
El cuerpo de cualquier estructura puede ser instrucciones simples u otras estructuras, que a su vez pueden contener a otras. Ejemplo: CLS INPUT "Valor entero para a:"; a INPUT "Valor entero para b:"; b IF a > b THEN REM hacer intercambio de variables auxiliar = a a = b b = auxiliar REM imprimir diferencia en escala de uno en uno DO WHILE auxiliar > a auxiliar = auxiliar - 1 PRINT auxiliar LOOP ELSE REM no hacer nada END IF PRINT PRINT a; b En el ejemplo la sentencia o instruccin CLS slo tiene el efecto de "limpiar" la pantalla al inicio de la ejecucin del programa. Las instrucciones INPUT permiten que el operador ingrese, desde teclado y con un mensaje previo acorde, los valores deseados para las variables a y b. La instruccin no ejecutable REM permite la insercin de comentarios en cualquier parte del programa, donde el programador lo considere necesario; constituye una buena prctica de programacin comentariar adecuadamente todos los programas, de este modo se clarifica notablemente su lectura, durante su desarrollo y posterior para modificacin o mantenimiento. En la anterior estructura IF bien se puede omitir la porcin ELSE, ya que no hay cuerpo all, de modo que lo siguiente es completamente equivalente: CLS INPUT "Valor entero para a:"; a INPUT "Valor entero para b:"; b IF a > b THEN REM hacer intercambio de variables auxiliar = a a = b b = auxiliar REM imprimir diferencia en escala de uno en uno DO WHILE auxiliar > a auxiliar = auxiliar - 1

Programacin estructurada PRINT auxiliar LOOP END IF PRINT PRINT a; b

28

Ventajas de la programacin estructurada


1. Los programas son ms fciles de entender, pueden ser ledos de forma secuencial, no hay necesidad de hacer engorrosos seguimientos en saltos de lnea (GOTO) dentro de los bloques de cdigo para intentar entender la lgica. 2. La estructura de los programas es clara, puesto que las instrucciones estn ms ligadas o relacionadas entre s. 3. Reduccin del esfuerzo en las pruebas y depuracin. El seguimiento de los fallos o errores del programa ("debugging") se facilita debido a su estructura ms sencilla y comprensible, por lo que los errores se pueden detectar y corregir ms fcilmente. 4. Reduccin de los costos de mantenimiento. Anlogamente a la depuracin, durante la fase de mantenimiento, modificar o extender los programas resulta ms fcil. 5. Programas son ms sencillos y ms rpidos de confeccionar (y se facilita su optimizacin). 6. Los bloques de cdigo son casi auto-explicativos, lo que reduce y facilita la documentacin. 7. Las instrucciones de salto, GOTO, quedan reservadas para construir las instrucciones bsicas, si fuera realmente imprescindible. Aunque no se usan de forma directa, por estar prohibida su utilizacin, estn incluidas implcitamente en las instrucciones de seleccin e iteracin. 8. Un programa escrito de acuerdo a los principios de programacin estructurada no solamente tendr una mejor estructura sino tambin una excelente presentacin. 9. Se incrementa el rendimiento de los programadores, comparada con la forma tradicional que utiliza GOTO. La programacin estructurada ofrece estos beneficios, pero no se la debe considerar como una panacea ya que el desarrollo de programas es, esencialmente, una tarea de dedicacin, esfuerzo y creatividad; programar es casi un arte.

Inconvenientes de la programacin estructurada


El principal inconveniente de este mtodo de programacin es que se obtiene un nico bloque de programa, que cuando se hace demasiado grande puede resultar problemtico el manejo de su cdigo fuente; esto se resuelve empleando conjuntamente la programacin modular, es decir, si es necesario, se definen mdulos independientes, programados y compilados por separado (en realidad esto no es necesario, pero s es recomendable para su mejor mantenimiento y depuracin). En realidad, cuando se programa hoy en da (inicios del siglo XXI) se utilizan normalmente, tanto las tcnicas de programacin estructurada como las de programacin modular, de forma conjunta y por lo tanto es muy comn que cuando se hace referencia a la programacin estructurada muchos entiendan que ella incluye tambin las tcnicas modulares, estrictamente no es as. Un mtodo un poco ms sofisticado es la programacin por capas, en la que los mdulos tienen una estructura jerrquica en la que se pueden definir funciones dentro de funciones o de procedimientos. Si bien las metodologas en cuestin ya son de antigua data ("en plazos informticos"), aun en la actualidad la conjuncin "Programacin estructurada" y "programacin modular" es una de la ms utilizadas, juntamente con un ms moderno paradigma, en pleno auge, completamente distinto, llamado programacin orientada a objetos.

Programacin estructurada

29

Bibliografa
1. Garca-Bermejo Giner, Jos Rafael (2 de 2008) (en espaol). Programacin estructurada en C (1 edicin). Pearson Prentice Hall. ISBN 978-84-8322-423-6. 2. Valls Ferrn, Jos Mara; Camacho Fernndez, David (9 de 2004) (en espaol). Programacin estructurada y algoritmos en Pascal (1 edicin). Pearson Alhambra. ISBN 978-84-205-4246-1. 3. (en espaol) Programacin estructurada II (1 ed. 4 imp. edicin). Enseanza Tcnica y Sistemas, S.A.. 6 de 2000. ISBN 978-84-85838-90-5. 4. (en espaol) Pseudocdigos y programacin estructurada (1 edicin). Centro Tcnico Europeo de Enseanzas Profesionales. 2 de 1997. ISBN 978-84-8199-065-2. 5. Snchez Andrs, Mara ngeles (5 de 1996) (en espaol). Programacin estructurada y fundamentos de programacin (1 edicin). McGraw-Hill / Interamericana de Espaa, S.A.. ISBN 978-84-481-0557-0.

Enlaces externos
INTRO.pdf: Programacin Estructurada [1] Tutoriales: Programacin Estructurada [2] Lenguajes de programacion.com: Programacin Estructurada [3] Monografias.com: Programacin Estructurada [4]

Referencias
[1] [2] [3] [4] http:/ / delfosis. uam. mx/ ~sgb/ docs/ INTRO. pdf http:/ / sistemas. itlp. edu. mx/ tutoriales/ pascal/ u1_1_4. html http:/ / www. lenguajes-de-programacion. com/ programacion-estructurada. shtml http:/ / www. monografias. com/ trabajos/ progestructu/ progestructu. shtml

Simula

30

Simula
Simula es un lenguaje de programacin orientada a objetos (OOP). Fue el primero de los lenguajes orientado a objetos. Varios aos despus de su desarrollo, casi todos los lenguajes modernos comenzaron a utilizar sus principios de orientacin a objetos. As fue como se popularizaron trminos como clases, objetos, instancias, herencia, polimorfismo, etc. Simula 67 fue lanzado oficialmente por sus autores Ole Johan Dahl y Kristen Nygaard en mayo de 1967, en la Conferencia de Trabajo en Lenguajes de Simulacin IFIO TC 2, en Lysebu cerca de Oslo Hoy en da, los creadores de Simula han desarrollado un nuevo lenguaje de programacin, llamado Beta, que generaliza todas las construcciones del lenguaje en una nica idea denominada patrn.

Hola Mundo!
ste es el famoso programa "Hola Mundo" en Simula 67: ! esto es un comentario ; Begin comment aqu comienza el programa ; OutText("Hola Mundo!"); OutImage; End of program;

Clases y objetos
Simula es un lenguaje orientado a objetos. Esto significa que el ejemplo de 'Hola Mundo' tambin se puede escribir instanciando una clase que se encarga de escribir el saludo. ! todo programa empieza con un begin y termina con un end ; Begin Class Saludos; Begin OutText("Hola Mundo!"); OutImage; End of class saludos; REF(Saludos) objeto; objeto :- New Saludos; End of module program; Este programa tambin muestra "Hola Mundo!". El mensaje est codificado en el bloque de cdigo de la clase Saludos. Este bloque de cdigo se ejecuta solamente cuando existe una instancia o variable de tipo Saludos; lo que ocurre efectivamente al crear una instancia por medio de la instruccin New. En Simula, los objetos siempre son manejados por medio de referencias. Existe un recolector de basura que se encarga de eliminar de la memoria los objetos que se han quedado sin referencias a ellos. Una de estas referencias la vemos con variable objeto. Utilizamos el operador :- para asignar referencias. A diferencia de muchos lenguajes modernos, Simula entiende de dos tipos de objetos.

Simula Activos son aquellos objetos que an no han completado su bloque asociado begin/end. Inactivos por otra parte, han completado su bloque de instrucciones. Tanto de unos como de otros, es posible ejecutar los procedimientos miembro y consultar los atributos en cualquier momento. Dado que Simula 67 es un lenguaje ya un poco aejo, los conceptos que maneja son un poco distintos a los actualmente utilizados por la comunidad de programacin orientada a objetos. Las instancias a las que estamos habituados corresponden a los objetos inactivos. En tanto que el bloque de instrucciones constituye una serie de constructores. En cuanto a los objetos activos, estos existen debido a una funcionalidad de pseudo-paralelismo encontrada en Simula y ausente en casi todos los lenguajes modernos. Esta funcionalidad recibe el nombre de co-rutina y es controlada directamente por el lenguaje por medio de un grupo de palabras clave. Un grupo de objetos activos pueden coexistir en un mismo programa Simula, y transferir el control de unos a otros en cualquier momento. Esta funcionalidad es la base de las caractersticas de simulacin que dan nombre al lenguaje.

31

Enlaces externos
Simula. Explicacin, paso por paso, de las caractersticas de este lenguaje. [1]

Referencias
[1] http:/ / staff. um. edu. mt/ jskl1/ talk. html

C++
C++

Desarrollador(es) Bjarne Stroustrup, Bell Labs Informacin general Extensiones comunes Paradigma Apareci en Diseado por ltima versin estable ltima versin en pruebas Tipo de dato Implementaciones .h .hh .hpp .hxx .h++ .cc .cpp .cxx .c++ multiparadigma: orientado a objetos, imperativo, programacin genrica. 1983 Bjarne Stroustrup ISO/IEC 14882:2011 (2011) C++11

fuerte, esttico, inseguro, nominativo C++ Builder, clang, Comeau C/C++, GCC, Intel C++ Compiler, Microsoft Visual C++, Sun Studio, Code::Blocks, Zinjai ISO/IEC C++ 1998, ISO/IEC C++ 2003, ISO/IEC C++ 2011 C, Simula, Ada 83, ALGOL 68, CLU, ML [1]

Dialectos Influido por

C++

32
Perl, LPC, Lua, Pike, Ada 95, Java, PHP, D, C99, C#, Falcon Multiplataforma

Ha influido a Sistema operativo

C++ es un lenguaje de programacin diseado a mediados de los aos 1980 por Bjarne Stroustrup. La intencin de su creacin fue el extender al exitoso lenguaje de programacin C con mecanismos que permitan la manipulacin de objetos. En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, el C++ es un lenguaje hbrido. Posteriormente se aadieron facilidades de programacin genrica, que se sum a los otros dos paradigmas que ya estaban admitidos (programacin estructurada y la programacin orientada a objetos). Por esto se suele decir que el C++ es un lenguaje de programacin multiparadigma. Actualmente existe un estndar, denominado ISO C++, al que se han adherido la mayora de los fabricantes de compiladores ms modernos. Existen tambin algunos intrpretes, tales como ROOT. Una particularidad del C++ es la posibilidad de redefinir los operadores, y de poder crear nuevos tipos que se comporten como tipos fundamentales. El nombre C++ fue propuesto por Rick Mascitti en el ao 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio cientfico. Antes se haba usado el nombre "C con clases". En C++, la expresin "C++" significa "incremento de C" y se refiere a que C++ es una extensin de C.

Un ejemplo de programa en C++, el clsico Hola mundo


A continuacin se cita un programa de ejemplo Hola mundo escrito en C++: /* Esta cabecera permite usar los objetos que encapsulan los descriptores stdout y stdin: cout(<<) y cin(>>)*/ #include <iostream> using namespace std; int main() { cout << "Hola mundo" << endl; return 0; } Al usar la directiva #include estamos dicindole al compilador que busque e interprete todos los elementos definidos en el archivo que acompaa la directiva (en este caso, iostream). Para evitar sobrescribir los elementos ya definidos al ponerles igual nombre, se crearon los espacios de nombres o namespace del singular en ingls. En este caso hay un espacio de nombres llamado std, que es donde se incluyen las definiciones de todas las funciones y clases que conforman la biblioteca estndar de C++. Al incluir la sentencia using namespace std le estamos diciendo al compilador que usaremos el espacio de nombres std por lo que no tendremos que incluirlo cuando usemos elementos de este espacio de nombres, como pueden ser los objetos cout y cin, que representan el flujo de salida estndar (tpicamente la pantalla o una ventana de texto) y el flujo de entrada estndar (tpicamente el teclado). La definicin de funciones es igual que en C, salvo por la caracterstica de que si main no va a recoger argumentos, no tenemos por qu ponrselos, a diferencia de C, donde haba que ponerlos explcitamente, aunque no se fueran a usar. Queda solo comentar que el smbolo << se conoce como operador de insercin, y grosso modo est enviando a cout lo que queremos mostrar por pantalla para que lo pinte, en este caso la cadena "Hola mundo". El mismo operador << se puede usar varias veces en la misma sentencia, de forma que gracias a esta caracterstica podremos concatenar el objeto endl al final, cuyo resultado ser imprimir un retorno de lnea.

C++ Por ltimo tomaremos una secuencia de caracteres del teclado hasta el retorno de lnea (presionando ENTER), llamando al mtodo get del objeto cin.

33

Tipos de datos
C++ tiene los siguientes tipos fundamentales: Caracteres: char (tambin es un entero), wchar_t Enteros: short, int, long, long long Nmeros en coma flotante: float, double, long double Booleanos: bool Vaco: void

El modificador unsigned se puede aplicar a enteros para obtener nmeros sin signo (por omisin los enteros contienen signo), con lo que se consigue un rango mayor de nmeros naturales.

Tamaos asociados Tamaos de tipos primitivos bajo i386 (GCC)


Tipo char short int float Nmero de Bits 8 16 32 32

double 64

Segn la mquina y el compilador que se utilice los tipos primitivos pueden ocupar un determinado tamao en memoria. La siguiente lista ilustra el nmero de bits que ocupan los distintos tipos primitivos en la arquitectura x86. Otras arquitecturas pueden requerir distintos tamaos de tipos de datos primitivos. C++ no dice nada acerca de cul es el nmero de bits en un byte, ni del tamao de estos tipos; ms bien, ofrece solamente las siguientes "garantas de tipos": Un tipo char tiene el tamao mnimo en bytes asignable por la mquina, y todos los bits de este espacio deben ser "accesibles". El tamao reconocido de char es de 1. Es decir, sizeof(char) siempre devuelve 1. Un tipo short tiene al menos el mismo tamao que un tipo char. Un tipo long tiene al menos el doble tamao en bytes que un tipo short. Un tipo int tiene un tamao entre el de short y el de long, ambos inclusive, preferentemente el tamao de un apuntador de memoria de la mquina. Un tipo unsigned tiene el mismo tamao que su versin signed.

Wchar_t
Para la versin del estndar que se public en 1998, se decidi aadir el tipo de dato wchar_t, que permite el uso de caracteres UNICODE, a diferencia del tradicional char, que contempla simplemente al cdigo de caracteres ASCII extendido. A su vez, se ha definido para la mayora de las funciones y clases, tanto de C como de C++, una versin para trabajar con wchar_t, donde usualmente se prefija el carcter w al nombre de la funcin (en ocasiones el carcter es un infijo). Por ejemplo: strcpy - wstrcpy

C++ std::string - std::wstring std::cout - std::wcout Cabe resaltar que en C se define wchar_t como: typedef unsigned short wchar_t; Mientras que en C++ es en s mismo un tipo de dato.

34

La palabra reservada "void"


La palabra reservada void define en C++ el concepto de no existencia o no atribucin de un tipo en una variable o declaracin. Como tal, puede ser usada para destacar que una funcin no recibe parmetros, como en: int funcion (void); Aunque la tendencia actual es la de no colocar la palabra "void". Adems se utiliza para determinar que una funcin no retorna un valor, como en: void funcion (int parametro); Cabe destacar que void no es un tipo. Una funcin como la declarada anteriormente no puede retornar un valor por medio de return: la palabra clave va sola. No es posible una declaracin del tipo: void t; //Est mal En este sentido, void se comporta de forma ligeramente diferente a como lo hace en C, especialmente en cuanto a su significado en declaraciones y prototipos de funciones. Sin embargo, la forma especial void * indica que el tipo de datos es un puntero. Por ejemplo: void *memoria; Indica que memoria es un puntero a alguna parte, donde se guarda informacin de algn tipo. El programador es responsable de definir estos "algn", eliminando toda ambigedad. Una ventaja de la declaracin "void *" es que puede representar a la vez varios tipos de datos, dependiendo de la operacin de cast escogida. La memoria que hemos apuntado en alguna parte, en el ejemplo anterior, bien podra almacenar un entero, un flotante, una cadena de texto o un programa, o combinaciones de stos. Es responsabilidad del programador recordar qu tipo de datos hay y garantizar el acceso adecuado.

Principios
Todo programa en C++ debe tener la funcin main() (a no ser que se especifique en tiempo de compilacin otro punto de entrada, que en realidad es la funcin que tiene el main()) int main() {} La funcin main debe tener uno de los siguientes prototipos: int main() int main(int argc, char** argv) int main(int argc, char** argv, char** env) La primera es la forma por omisin de un programa que no recibe parmetros ni argumentos. La segunda forma tiene dos parmetros: argc, un nmero que describe el nmero de argumentos del programa (incluyendo el nombre del programa mismo), y argv, un puntero a un array de punteros, de argc elementos, donde el elemento argv[i] representa el i-simo argumento entregado al programa. En el tercer caso se aade la posibilidad de poder acceder a

C++ las variables de entorno de ejecucin de la misma forma que se accede a los argumentos del programa, pero reflejados sobre la variable env. El tipo de retorno de main es int. Al finalizar la funcin main, debe incluirse el valor de retorno (por ejemplo, return 0;, aunque el estndar prev solamente dos posibles valores de retorno: EXIT_SUCCESS y EXIT_ERROR, definidas en el archivo cstddef), o salir por medio de la funcin exit. Alternativamente puede dejarse en blanco, en cuyo caso el compilador es responsable de agregar la salida adecuada.

35

El concepto de clase
Vase tambin: Clase (informtica)

Los objetos en C++ son abstrados mediante una clase. Segn el paradigma de la programacin orientada a objetos un objeto consta de: 1. Identidad, que lo diferenca de otros objetos (Nombre que llevara la clase a la que pertenece dicho objeto). 2. Mtodos o funciones miembro 3. Atributos o variables miembro Un ejemplo de clase que podemos tomar es la clase perro. Cada perro comparte unas caractersticas (atributos). Su nmero de patas, el color de su pelaje o su tamao son algunos de sus atributos. Las funciones que lo hagan ladrar, cambiar su comportamiento... esas son las funciones de la clase. Este es otro ejemplo de una clase: class Punto { //por omisin los miembros son 'private' para que slo se puedan modificar desde la propia clase. private: // Variable miembro privada int id; protected: // Variables miembro protegidas int x; int y; public: // Constructor Punto(); // Destructor ~Punto(); // Funciones miembro o mtodos int ObtenerX(); int ObtenerY(); };

C++

36

Constructores
Vase tambin: Constructor (informtica)

Son unos mtodos especiales que se ejecutan automticamente al crear un objeto de la clase. En su declaracin no se especifica el tipo de dato que devuelven, y poseen el mismo nombre que la clase a la que pertenecen. Al igual que otros mtodos, puede haber varios constructores sobrecargados, aunque no pueden existir constructores virtuales. Como caracterstica especial a la hora de implementar un constructor, justo despus de la declaracin de los parmetros, se encuentra lo que se llama "lista de inicializadores". Su objetivo es llamar a los constructores de los atributos que conforman el objeto a construir. Cabe destacar que no es necesario declarar un constructor al igual que un destructor, pues el compilador lo puede hacer, aunque no es la mejor forma de programar. Tomando el ejemplo de la Clase Punto, si deseamos que cada vez que se cree un objeto de esta clase las coordenadas del punto sean igual a cero podemos agregar un constructor como se muestra a continuacin:
class Punto { public:

float x; float y;

// Coordenadas del punto

// Constructor Punto() : x(0), y(0){ // Inicializamos las variables "x" e "y" } };

// Main para demostrar el funcionamiento de la clase

# include <iostream> // Esto nos permite utilizar "cout"

using namespace std;

int main () { Punto MiPunto; llamado MiPunto // creamos un elemento de la clase Punto

cout << "Coordenada X: " << MiPunto.x << endl; cout << "Coordenada Y: " << MiPunto.y << endl;

// mostramos el valor acumulado en la variable x // mostramos el valor acumulado en la variable y

getchar(); // le indicamos al programa que espere al buffer de entrada (detenerse) return 0; }

Si compilamos y ejecutamos el anterior programa, obtenemos una salida que debe ser similar a la siguiente: Coordenada X: 0 Coordenada Y: 0 Existen varios tipos de constructores en C++: 1. Constructor predeterminado. Es el constructor que no recibe ningn parmetro en la funcin. Si no se definiera ningn constructor, el sistema proporcionara uno predeterminado. Es necesario para la construccin de

C++ estructuras y contenedores de la STL. 2. Constructor de copia. Es un constructor que recibe un objeto de la misma clase, y realiza una copia de los atributos del mismo. Al igual que el predeterminado, si no se define, el sistema proporciona uno. 3. Constructor de conversin. Este constructor, recibe como nico parmetro, un objeto o variable de otro tipo distinto al suyo propio. Es decir, convierte un objeto de un tipo determinado a otro objeto del tipo que estamos generando. Constructores + Memoria heap Un objeto creado de la forma que se vio hasta ahora, es un objeto que vive dentro del scope(las llaves { }) en el que fue creado. Para que un objeto pueda seguir viviendo cuando se saque de el scope en el que se cre, se lo debe crear en memoria heap. Para esto, se utiliza el operador new, el cual asigna memoria para almacenar al objeto creado, y adems llama a su constructor(por lo que se le pueden enviar parmetros). El operador new se utiliza de la siguiente manera: int main() { Punto *unPunto = new Punto(); //esto llama al contructor que se describe ms arriba delete unPunto; //no hay que olvidarse de liberar la memoria ocupada por el objeto(ver la seccin destructores, ms abajo) return 0; } Adems, con el operador new[] se pueden crear arreglo de tamao dinmico: Punto *asignar(int cuantos) { return new Punto[cuantos]; //asigna un arreglo de 'cuantos' puntos(se llama el constructor que se muestra ms arriba), y se retorna. }

37

Destructores
Vase tambin: Destructor (informtica)

Los destructores son funciones miembro especiales llamadas automticamente en la ejecucin del programa, y por tanto no tienen por qu ser llamadas explcitamente por el programador. Sus principales cometidos son: Liberar los recursos computacionales que el objeto de dicha clase haya adquirido en tiempo de ejecucin al expirar ste. Quitar los vnculos que pudiesen tener otros recursos u objetos con ste. Los destructores son invocados automticamente al alcanzar el flujo del programa el fin del mbito en el que est declarado el objeto. El nico caso en el que se debe invocar explcitamente al destructor de un objeto, es cuando ste fue creado mediante el operador new, es decir, que ste vive en memoria heap, y no en la pila de ejecucin del programa. La invocacin del destructor de un objeto que vive en heap se realiza a travs del operador delete o delete[] para arreglos. Ejemplo: int main() { int *unEntero = new int(12); heap con el valor 12 int *arregloDeEnteros = new int[25]; enteros(no estan inicializados) delete unEntero; ocupaba unEntero delete[] arregloDeEnteros;

//asignamos un entero en memoria //asignamos memoria para 25 //liberamos la memoria que //liberamos la memoria ocupada

C++ por arregloDeEnteros return 0; } Si no se utilizara el operador delete y delete[] en ese caso, la memoria ocupada por unEntero y arregloDeEnteros respectivamente, quedara ocupada sin sentido. Cuando una porcin de memoria queda ocupada por una variable que ya no se utiliza, y no hay forma de acceder a ella, se denomina un 'memory leak'. En aplicaciones grandes, si ocurren muchos memory leaks, el programa puede terminar ocupando bastante ms memoria RAM de la que debera, lo que no es para nada conveniente. Es por esto, que el manejo de memoria heap debe usarse conscientemente. Existen dos tipos de destructores pueden ser pblicos o privados, segn si se declaran: Si es pblico se llama desde cualquier parte del programa para destruir el objeto. Si es privado no se permite la destruccin del objeto por el usuario. El uso de destructores es clave en el concepto de Adquirir Recursos es Inicializar.

38

Funciones miembro
Funcin miembro es aquella que est declarada en mbito de clase. Son similares a las funciones habituales, con la salvedad de que el compilador realizara el proceso de Decoracin de nombre (Name Mangling en ingls): Cambiara el nombre de la funcin aadiendo un identificador de la clase en la que est declarada, pudiendo incluir caracteres especiales o identificadores numricos. Adems, las funciones miembro reciben implcitamente un parmetro adicional: El puntero this, que referencia al objeto que ejecuta la funcin. Las funciones miembro se invocan accediendo primero al objeto al cual refieren, con la sintaxis: myobject.mymemberfunction(), esto es un claro ejemplo de una funcin miembro.

Plantillas
Las plantillas son el mecanismo de C++ para implantar el paradigma de la programacin genrica. Permiten que una clase o funcin trabaje con tipos de datos abstractos, especificndose ms adelante cuales son los que se quieren usar. Por ejemplo, es posible construir un vector genrico que pueda contener cualquier tipo de estructura de datos. De esta forma se pueden declarar objetos de la clase de este vector que contengan enteros, flotantes, polgonos, figuras, fichas de personal, etc. La declaracin de una plantilla se realiza anteponiendo la declaracin template <typename A,....> a la declaracin de la estructura (clase, estructura o funcin) deseado. Por ejemplo: template <typename T> T max(const T &x, const T &y) { return (x > y) ? x : y; //si x > y, retorna x, sino retorna y } La funcin max() es un ejemplo de programacin genrica, y dados dos parmetros de un tipo T (que puede ser int, long, float, double, etc.) devolver el mayor de ellos (usando el operador >). Al ejecutar la funcin con parmetros de un cierto tipo, el compilador intentar "calzar" la plantilla a ese tipo de datos, o bien generar un mensaje de error si fracasa en ese proceso.

C++ Especializacin El siguiente ejemplo: template <typename A> int myfunction(A a); crea una plantilla bajo la cual pueden ser definidas en el cdigo de cabecera cualesquiera funciones especializadas para un tipo de datos como int myfunction(int), int myfunction(std::string), int myfunction(bool), etctera: int myfunction (int a) { return a + 5; }; int myfunction (std::string a) { return -a.size(); }; int myfunction (bool a) { return (a & rand()); }; Cada una de estas funciones tiene su propia definicin (cuerpo). Cada cuerpo diferente, no equivalente ("no convertible") corresponde a una especializacin. Si una de estas funciones no fuera definida, el compilador tratar de aplicar las conversiones de tipos de datos que le fuesen permitidas para "calzar" una de las plantillas, o generar un mensaje de error si fracasa en ese proceso. Todas las definiciones habilitadas de una plantilla deben estar disponibles al momento de la compilacin, por lo cual no es posible actualmente "compilar" una plantilla como archivo de objeto, sino simplemente compilar especializaciones de la plantilla. Por lo tanto, las plantillas se distribuyen junto con el cdigo fuente de la aplicacin. En otras palabras, no es posible compilar la plantilla std::vector< > a cdigo objeto, pero s es posible, por ejemplo, compilar un tipo de datos std::vector<std::string>.

39

Clases abstractas
En C++ es posible definir clases abstractas. Una clase abstracta, o clase base abstracta (ABC), es una que est diseada slo como clase padre de las cuales se deben derivar clases hijas. Una clase abstracta se usa para representar aquellas entidades o mtodos que despus se implementarn en las clases derivadas, pero la clase abstracta en s no contiene ninguna implementacin -- solamente representa los mtodos que se deben implementar. Por ello, no es posible instanciar una clase abstracta, pero s una clase concreta que implemente los mtodos definidos en ella. Las clases abstractas son tiles para definir interfaces, es decir, un conjunto de mtodos que definen el comportamiento de un mdulo determinado. Estas definiciones pueden utilizarse sin tener en cuenta la implementacin que se har de ellos. En C++ los mtodos de las clases abstractas se definen como funciones virtuales puras. class Abstracta { public: virtual int metodo() = 0; };

C++ class ConcretaA : public Abstracta { public: int metodo() { //haz algo return foo () + 2; } }; class ConcretaB : public Abstracta { public: int metodo() { //otra implementacin return baz () - 5; } }; En el ejemplo, la clase ConcretaA es una implementacin de la clase Abstracta, y la clase ConcretaB es otra implementacin. Debe notarse que el = 0 es la notacin que emplea C++ para definir funciones virtuales puras.

40

Espacios de nombres
Una adicin a las caractersticas de C son los espacios de nombre (namespace en ingls), los cuales pueden describirse como reas virtuales bajo las cuales ciertos nombres de variable o tipos tienen validez. Esto permite evitar las ocurrencias de conflictos entre nombres de funciones, variables o clases. El ejemplo ms conocido en C++ es el espacio de nombres std::, el cual almacena todas las definiciones nuevas en C++ que difieren de C (algunas estructuras y funciones), as como las funcionalidades propias de C++ (streams) y los componentes de la biblioteca STL. Por ejemplo: # include <iostream> // Las funciones en esta cabecera existen dentro del espacio de nombres std:: namespace mi_paquete{ int mi_valor; }; int main() { int mi_valor = 3; mi_paquete::mi_valor = 4; std::cout << mi_valor << '\n'; // imprime '3' std::cout << mi_paquete::mi_valor << '\n'; // imprime '4'

C++

41

return 0; } Como puede verse, las invocaciones directas a mi_valor darn acceso solamente a la variable descrita localmente; para acceder a la variable del espacio de nombres mi_paquete es necesario acceder especficamente el espacio de nombres. Un atajo recomendado para programas sencillos es la directiva using namespace, que permite acceder a los nombres de variables del paquete deseado en forma directa, siempre y cuando no se produzca alguna ambigedad o conflicto de nombres.

Herencia
Existen varios tipos de herencia entre clases en el lenguaje de programacin C++. Estos son: Herencia simple La herencia en C++ es un mecanismo de abstraccin creado para poder facilitar y mejorar el diseo de las clases de un programa. Con ella se pueden crear nuevas clases a partir de clases ya hechas, siempre y cuando tengan un tipo de relacin especial. En la herencia, las clases derivadas "heredan" los datos y las funciones miembro de las clases base, pudiendo las clases derivadas redefinir estos comportamientos (polimorfismo) y aadir comportamientos nuevos propios de las clases derivadas. Para no romper el principio de encapsulamiento (ocultar datos cuyo conocimiento no es necesario para el uso de las clases), se proporciona un nuevo modo de visibilidad de los datos/funciones: "protected". Cualquier cosa que tenga visibilidad protected se comportar como pblica en la clase Base y en las que componen la jerarqua de herencia, y como privada en las clases que NO sean de la jerarqua de la herencia. Antes de utilizar la herencia, nos tenemos que hacer una pregunta, y si tiene sentido, podemos intentar usar esta jerarqua: Si la frase <claseB> ES-UN <claseA> tiene sentido, entonces estamos ante un posible caso de herencia donde clase A ser la clase base y clase B la derivada. Ejemplo: clases Barco, Acorazado, Carguero, etc. un Acorazado ES-UN Barco, un Carguero ES-UN Barco, un Trasatlntico ES-UN Barco, etc. En este ejemplo tendramos las cosas generales de un Barco (en C++) class Barco { protected: char* nombre; float peso; public: //Constructores y dems funciones bsicas de barco }; y ahora las caractersticas de las clases derivadas, podran (a la vez que heredan las de barco) aadir cosas propias del subtipo de barco que vamos a crear, por ejemplo: class Carguero: public Barco { // Esta es la manera de especificar que hereda de Barco private: float carga; //El resto de cosas };

C++ class Acorazado: public Barco { private: int numeroArmas; int Soldados; // El resto de cosas }; Por ltimo, hay que mencionar que existen 3 clases de herencia que se diferencian en el modo de manejar la visibilidad de los componentes de la clase resultante: Herencia publica (class Derivada: public Base ): Con este tipo de herencia se respetan los comportamientos originales de las visibilidades de la clase Base en la clase Derivada. Herencia privada (clase Derivada: private Base): Con este tipo de herencia todo componente de la clase Base, ser privado en la clase Derivada (las propiedades heredadas sern privadas aunque estas sean pblicas en la clase Base) Herencia protegida (clase Derivada: protected Base): Con este tipo de herencia, todo componente publico y protegido de la clase Base, ser protegido en la clase Derivada, y los componentes privados, siguen siendo privados. Herencia mltiple La herencia mltiple es el mecanismo que permite al programador hacer clases derivadas a partir, no de una sola clase base, sino de varias. Para entender esto mejor, pongamos un ejemplo: Cuando ves a quien te atiende en una tienda, como persona que es, podrs suponer que puede hablar, comer, andar, pero, por otro lado, como empleado que es, tambin podrs suponer que tiene un jefe, que puede cobrarte dinero por la compra, que puede devolverte el cambio, etc. Si esto lo trasladamos a la programacin sera herencia mltiple (clase empleado_tienda): class Persona { ... Hablar(); Caminar(); ... }; class Empleado { Persona jefe; int sueldo; Cobrar(); ... }; class empleado_tienda: public Persona, Empleado { ... AlmacenarStock(); ComprobarExistencias(); ... }; Por tanto, es posible utilizar ms de una clase para que otra herede sus caractersticas.

42

C++

43

Sobrecarga de operadores
La sobrecarga de operadores es una forma de hacer polimorfismo. Es posible definir el comportamiento de un operador del lenguaje para que trabaje con tipos de datos definidos por el usuario. No todos los operadores de C++ son factibles de sobrecargar, y, entre aquellos que pueden ser sobrecargados, se deben cumplir condiciones especiales. En particular, los operadores sizeof y :: no son sobrecargables. No es posible en C++ crear un operador nuevo. Los comportamientos de los operadores sobrecargados se implementan de la misma manera que una funcin, salvo que esta tendr un nombre especial: Tipo de dato de devolucin operator<token del operador>(parmetros) Los siguientes operadores pueden ser sobrecargados: Operadores Unarios Operador * (de indireccin) Operador -> (de indireccin) Operador & (de direccin) Operador + Operador -

Operador ++ Operador - Operadores Binarios Operador == Operador + Operador Operador * Operador / Operador % Operador << Operador >> Operador & Operador ^ Operador | Operador [] Operador () Operadores de Asignacin Operador = Operador += Operador -= Operador *= Operador /= Operador %= Operador <<= Operador >>= Operador &= Operador ^=

Operador |=

C++ Dado que estos operadores son definidos para un tipo de datos definido por el usuario, ste es libre de asignarles cualquiera semntica que desee. Sin embargo, se considera de primera importancia que las semnticas sean tan parecidas al comportamiento natural de los operadores como para que el uso de los operadores sobrecargados sea intuitivo. Por ejemplo, el uso del operador unario - debiera cambiar el "signo" de un "valor". Los operadores sobrecargados no dejan de ser funciones, por lo que pueden devolver un valor, si este valor es del tipo de datos con el que trabaja el operador, permite el encadenamiento de sentencias. Por ejemplo, si tenemos 3 variables A,B y C de un tipo T y sobrecargamos el operador = para que trabaje con el tipo de datos T, hay dos opciones: si el operador no devuelve nada una sentencia como "A=B=C;" (sin las comillas) dara error, pero si se devuelve un tipo de datos T al implementar el operador, permitira concatenar cuantos elementos se quisieran, permitiendo algo como "A=B=C=D=...;"

44

Biblioteca estndar de plantillas (STL, Standard Template Library)


Los lenguajes de programacin suelen tener una serie de bibliotecas de funciones integradas para la manipulacin de datos a nivel ms bsico. En C++, adems de poder usar las bibliotecas de C, se puede usar la nativa STL (Standard Template Library), propia del lenguaje. Proporciona una serie plantillas (templates) que permiten efectuar operaciones sobre el almacenado de datos, procesado de entrada/salida.

Biblioteca de entrada y salida


Las clases basic_ostream y basic_stream, y los objetos cout y cin, proporcionan la entrada y salida estndar de datos (teclado/pantalla). Tambin est disponible cerr, similar a cout, usado para la salida estndar de errores. Estas clases tienen sobrecargados los operadores << y >>, respectivamente, con el objeto de ser tiles en la insercin/extraccin de datos a dichos flujos. Son operadores inteligentes, ya que son capaces de adaptarse al tipo de datos que reciben, aunque tendremos que definir el comportamiento de dicha entrada/salida para clases/tipos de datos definidos por el usuario. Por ejemplo: ostream& operator<<(ostream& fs,const Punto& punto) { return fs << punto.x << "," << punto.y; } De esta forma, para mostrar un punto, solo habra que realizar la siguiente expresin: //... Punto p(4,5); //... cout << "Las coordenadas son: " << p << endl; //... Es posible formatear la entrada/salida, indicando el nmero de dgitos decimales a mostrar, si los textos se pasarn a minsculas o maysculas, si los nmeros recibidos estn en formato octal o hexadecimal, etc.

C++

45

Fstreams
Tipo de flujo para el manejo de ficheros. La definicin previa de ostreams/istreams es aplicable a este apartado. Existen tres clases (ficheros de lectura, de escritura o de lectura/escritura): ifstream,ofstream y fstream. Como abrir un fichero: (nombre_variable_fichero).open("nombre_fichero.dat/txt",ios::in); para abrirlo en modo lectura. (nombrevariablefichero).open("nombre_fichero.dat/txt",ios::out); para abrirlo en modo escritura. Ejemplo: f.open("datos.txt",ios::in); Como cerrar el fichero: nombre_variable_fichero.close(); Ejemplo: f.close(); Leer un fichero: 1-Si es fichero de texto plano: #include <fstream> #include <string> #include <iostream> using namespace std; int main() { ifstream entrada; entrada.open("textoPlano.txt"); string unString; while(entrada >> unString) cout << "Lei: " << unString << endl; return 0; }

2-Si es un fichero binario(.dat); nombre_variable_fichero.read((char*)&nombre_variable,sizeof(tipo_variable)); Ejemplo: f.read((char*)&e,sizeof(int)); Escribir un fichero:


1-Si es fichero de texto(.txt): nombrevariable<<"texto"; donde "texto" puede ser tambin una variable de cualquier tipo primitivo, o un string.

Ejemplo: f<<HOLA;

2-Si es un fichero binario(.dat); nombre_variable_fichero.write((char*)&nombre_variable,sizeof(tipo_variable)); Ejemplo: f.write((char*)&e,sizeof(int)); Pueden abrirse pasando al constructor los parmetros relativos a la ubicacin del fichero y el modo de apertura:

C++

46

Sstreams
Se destacan dos clases, ostringstream e istringstream. Todo lo anteriormente dicho es aplicable a estas clases. Tratan a una cadena como si de un flujo de datos se tratase. ostringstream permite elaborar una cadena de texto insertando datos cual flujo, e istringstream puede extraer la informacin contenida en una cadena (pasada como parmetro en su constructor) con el operador >>. Ejemplos: ostringstream s; s << nombre << "," << edad << "," << estatura << "," << punto(5,6) << endl; cout << s.str(); istringstream s(cadena); s >> nombre >> edad >> estatura >> p;

Contenedores
Son clases plantillas especiales utilizadas para almacenar tipos de datos genricos, sean cuales sean. Todos los contenedores son homogneos, es decir, una vez que se declaran para contener un tipo de dato determinado, en ese contenedor, solo se podrn meter elementos de ese tipo. Segn la naturaleza del almacenado, disponemos de varios tipos: Vectores: Se definen por vector<tipo_de_dato> nombre_del_vector; Son arreglos que se redimensionan automaticamente al agregar nuevos elementos, por lo que se le pueden agregar "tericamente", infinitos elementos. Los vectores nos permiten acceder a cualquier elemento que contenga, mediante el operador[]. Debe tenerse en cuenta que si se intenta acceder a una posicin que excede los lmites del vector, este no har ningn chequeo, por lo que se debe ser cuidadoso al utilizar este operador. Para asegurar un acceso seguro al vector, se puede utilizar el mtodo at(int), que lanza una excepcin de tipo std::out_of_range en caso de que esto ocurra. Para agregar elementos al final del vector, se utiliza el mtodo push_back(const T&). Por otro lado, para eliminar un elemento del final del vector, se debe usar el mtodo pop_back().
#include <vector> #include <iostream> using namespace std; //libreria que contiene a la clase vector

int main() { vector<int> intVector; //crea un vector de enteros(sin elementos)

intVector.push_back(25); //agrega el entero 25 al vector cout << "El primer elemento es: " << intVector.front() << " y mi vector tiene " << intVector.size() << " elementos." << endl; //imprime el primer elemento(retornado por el metodo front()

intVector.push_back(32); //agrego el entero 32 al vector cout << "El primer elemento es: " << intVector[0] << endl; //imprime 25 intVector.pop_back(); 32) cout << "Ahora tengo: " << intVector.size() << " elementos." << endl; //imprimir 1 //elimina el ultimo elemento del vector(osea

return 0; }

C++ Colas dobles: son parecidas a los vectores, pero tienen mejor eficiencia para agregar o eliminar elementos en las "puntas". deque<tipo_de_dato> nombre_de_la_cola; Adems de los mtodos push_back(const T&) y pop_back(), se agregan los mtodos push_front(const T&) y pop_front(), que realizan lo mismo que los ya explicados, pero en el comienzo de la cola. #include <deque> using namespace std; int main() { deque<int> intDeque; intDeque.push_front(25); intDeque.push_back(12); while(intDeque.size()) intDeque.pop_back(); //borra todos los elementos return 0; } Listas: Son eficientes a la hora de agregar elementos. La diferencia con las colas dobles, es que son mas eficientes para eliminar elementos que no estn en alguna de las "puntas" list<tipo_de_dato> nombre_de_la_lista; Adaptadores de secuencia. Contenedores asociativos: map y multimap, que permiten asociar una "clave" con un "valor". map no permite valores repetidos, mientras que multimap si. map<tipo_de_llave, tipo_de_dato> nombre_del_map; multimap<tipo_de_llave, tipo_de_dato> nombre_del_multimap; #include <map> //libreria que contiene a map y multimap #include <string> //libreria de strings #include <iostream> //libreria de entrada/salida using namespace std; int main() { map<int, string> intAString; intAString[1] = "uno"; intAString[10] = "diez"; cout << "En intAString[1]: " << intAString[1] << endl; cout << "En intAString[10]: " << intAString[10] << endl; return 0; } Contenedores asociativos: set y multiset, que ofrecen solamente la condicin de "pertenencia", sin la necesidad de garantizar un ordenamiento particular de los elementos que contienen. //libreria de deques

47

C++

48

Iteradores
Pueden considerarse como una generalizacin de la clase de "puntero". Un iterador es un tipo de dato que permite el recorrido y la bsqueda de elementos en los contenedores. Como las estructuras de datos (contenedores) son clases genricas, y los operadores (algoritmos) que deben operar sobre ellas son tambin genricos (funciones genricas), Stepanov y sus colaboradores tuvieron que desarrollar el concepto de iterador como elemento o nexo de conexin entre ambos. El nuevo concepto resulta ser una especie de punteros que sealan a los diversos miembros del contenedor (punteros genricos que como tales no existen en el lenguaje).

Algoritmos
Combinando la utilizacin de templates y un estilo especfico para denotar tipos y variables, la STL ofrece una serie de funciones que representan operaciones comunes, y cuyo objetivo es "parametrizar" las operaciones en que estas funciones se ven involucradas de modo que su lectura, comprensin y mantenimiento, sean ms fciles de realizar. Un ejemplo es la funcin copy, la cual simplemente copia variables desde un lugar a otro. Ms estrictamente, copia los contenidos cuyas ubicaciones estn delimitadas por dos iteradores, al espacio indicado por un tercer iterador. La sintaxis es: copy (inicio_origen, fin_origen, inicio_destino); De este modo, todos los datos que estn entre inicio_origen y fin_origen, excluyendo el dato ubicado en este ltimo, son copiados a un lugar descrito o apuntado por inicio_destino. Un algoritmo muy importante que viene implementado en la librera STL, es el sort. El algoritmo sort, ordena cualquier tipo de contenedor, siempre y cuando se le pasen como argumentos, desde donde y hasta donde se quiere ordenarlo. #include <vector> #include <deque> #include <algorithm> int main() { vector<int> intVector; intVector.push_back(60); intVector.push_back(12); intVector.push_back(54); //para este momento, el vector tiene 60,12,54 sort(intVector.begin(), intVector.end()); //listo, arreglo ordenado, ahora tiene 12,54,60 /*Notar que si en vez de un vector, fuese una deque, se ordenaria de la misma manera. */ } Entre las funciones ms conocidas estn swap (variable1, variable2), que simplemente intercambia los valores de variable1 y variable2; max (variable1, variable2) y su smil min (variable1, variable2), que retornan el mximo o mnimo entre dos valores; find (inicio, fin, valor) que busca valor en el espacio de variables entre inicio y fin; etctera. Los algoritmos son muy variados, algunos incluso tienen versiones especficas para operar con ciertos iteradores o contenedores, y proveen un nivel de abstraccin extra que permite obtener un cdigo ms "limpio", que "describe" lo que se est haciendo, en vez de hacerlo paso a paso explcitamente.

C++

49

C++11
El 12 de agosto del 2011, Herb Sutter, presidente del comit de estndares de C++, inform la aprobacin unnime del nuevo estndar.[2] La publicacin del mismo se espera para algn momento del 2011. Entre las caractersticas del nuevo estndar se pueden destacar: Funciones lambda; Referencias rvalue; La palabra reservada auto; Inicializacin uniforme; Plantillas con nmero variable de argumentos.

Adems se ha actualizado la biblioteca estndar del lenguaje.

Diferencias de tipos respecto a C


En C++, cualquier tipo de datos que sea declarado completo (fully qualified, en ingls) se convierte en un tipo de datos nico. Las condiciones para que un tipo de datos T sea declarado completo son a grandes rasgos las siguientes: Es posible al momento de compilacin conocer el espacio asociado al tipo de datos (es decir, el compilador debe conocer el resultado de sizeof(T)). T Tiene al menos un constructor, y un destructor, bien declarados. Si T es un tipo compuesto, o es una clase derivada, o es la especificacin de una plantilla, o cualquier combinacin de las anteriores, entonces las dos condiciones establecidas previamente deben aplicar para cada tipo de dato constituyente. En general, esto significa que cualquier tipo de datos definido haciendo uso de las cabeceras completas, es un tipo de datos completo. En particular, y, a diferencia de lo que ocurra en C, los tipos definidos por medio de struct o enum son tipos completos. Como tales, ahora son sujetos a sobrecarga, conversiones implcitas, etctera. Los tipos enumerados, entonces, ya no son simplemente alias para tipos enteros, sino que son tipos de datos nicos en C++. El tipo de datos bool, igualmente, pasa a ser un tipo de datos nico, mientras que en C funcionaba en algunos casos como un alias para alguna clase de dato de tipo entero.

Compiladores
Uno de los compiladores libres de C++ es el de GNU, el compilador G++ (parte del proyecto GCC, que engloba varios compiladores para distintos lenguajes). Otros compiladores comunes son Intel C++ Compiler, el compilador de Xcode, el compilador de Borland C++, el compilador de CodeWarrior C++, el compilador g++ de Cygwin, el compilador g++ de MinGW, el compilador de Visual C++, Carbide.c++, entre otros.

Entornos de desarrollo
Vase tambin: Entorno de desarrollo integrado

C++

50

Bajo Microsoft Windows


Code::Blocks Dev-C++

Bajo DOS
Turbo C, reemplazado por C++Builder

Bajo GNU/Linux
Code::Blocks NetBeans Eclipse

Referencias
[1] Stroustrup, Bjarne (1997). 1. The C++ Programming Language (Third edicin). ISBN 0201889544. OCLC 59193992 (http:/ / worldcat. org/ oclc/ 59193992). [2] http:/ / herbsutter. com/ 2011/ 08/ 12/ we-have-an-international-standard-c0x-is-unanimously-approved/

Bibliografa
Bjarne Stroustrup, El lenguaje de programacin C++, Addison Wesley, Madrid, 1998, ISBN 84-7829-019-2 Bjarne Stroustrup, The C++ Programming Language, Addison-Wesley Pub Co; Tercera edicin (15 de febrero de 2000); ISBN 0-201-70073-5 Bjarne Stroustrup, The Design and Evolution of C++, Addison-Wesley Pub Cp; Primera edicin (29 de marzo de 1994); ISBN 0-201-54330-3 Margaret A. Ellis y Bjarne Stroustrup, The Annotated C++ Reference Manual, Addison-Wesley Pub Co; (1 de enero de 1990); ISBN 0-201-51459-1

Enlaces externos
plantillas en c++ (http://virtuosonicplusplus.blogspot.com/2011/04/plantillas-en-c-templates.html) tutorial para principiantes sobre plantillas cplusplus resources (http://www.cplusplus.com/) (en ingls) C/C++ Reference (http://cppreference.com) C/C++ Programming (http://cprogramming.com) Inline::CPP (http://search.cpan.org/perldoc?Inline::CPP) Mdulo Perl en CPAN para programar en C++ dentro de programas Perl (en ingls) Curso de C++ (http://c.conclase.net/curso/index.php) Completo curso de C++ gratuito, en castellano, que adems de referencia, tambin incluye explicaciones sencillas para aprender el lenguaje de programacin Pensar en C++ (http://arco.esi.uclm.es/~david.villa/pensarC++.html) Traduccin al castellano del libro de Bruce Eckel: "Thinking in C++" C++ paso a paso (http://gplsi.dlsi.ua.es/libros/cpp1/) Libro que explica paso a paso los conceptos de programacin orientada a objetos del lenguaje C++

C (lenguaje de programacin)

51

C (lenguaje de programacin)
C Desarrollador(es) Dennis Ritchie y Bell Labs Informacin general Paradigma Apareci en Diseado por Imperativo (Procedural), Estructurado 1972 Dennis M. Ritchie

ltima versin estable C99 (Marzo de 2000) Tipo de dato Implementaciones Dialectos Influido por Ha influido a Sistema operativo Dbil, Esttico Mltiples Cyclone, Unified Parallel C, Split-C, Cilk, C* B (BCPL,CPL), ALGOL 68, [1] Ensamblador, PL/I, Fortran

Vala, C#, Objective-C, C++, AWK, bc, Java, php, NXC, D Multiplataforma

C es un lenguaje de programacin creado en 1972 por Dennis M. Ritchie en los Laboratorios Bell como evolucin del anterior lenguaje B, a su vez basado en BCPL. Al igual que B, es un lenguaje orientado a la implementacin de Sistemas Operativos, concretamente Unix. C es apreciado por la eficiencia del cdigo que produce y es el lenguaje de programacin ms popular para crear software de sistemas, aunque tambin se utiliza para crear aplicaciones. Se trata de un lenguaje dbilmente tipificado de medio nivel pero con muchas caractersticas de bajo nivel. Dispone de las estructuras tpicas de los lenguajes de alto nivel pero, a su vez, dispone de construcciones del lenguaje que permiten un control a muy bajo nivel. Los compiladores suelen ofrecer extensiones al lenguaje que posibilitan mezclar cdigo en ensamblador con cdigo C o acceder directamente a memoria o dispositivos perifricos. La primera estandarizacin del lenguaje C fue en ANSI, con el estndar X3.159-1989. El lenguaje que define este estndar fue conocido vulgarmente como ANSI C. Posteriormente, en 1990, fue ratificado como estndar ISO (ISO/IEC 9899:1990). La adopcin de este estndar es muy amplia por lo que, si los programas creados lo siguen, el cdigo es porttil entre plataformas y/o arquitecturas.

Filosofa
Uno de los objetivos de diseo del lenguaje C es que slo sean necesarias unas pocas instrucciones en lenguaje mquina para traducir cada elemento del lenguaje, sin que haga falta un soporte intenso en tiempo de ejecucin. Es muy posible escribir C a bajo nivel de abstraccin; de hecho, C se us como intermediario entre diferentes lenguajes. En parte a causa de ser de relativamente bajo nivel y de tener un modesto conjunto de caractersticas, se pueden desarrollar compiladores de C fcilmente. En consecuencia, el lenguaje C est disponible en un amplio abanico de plataformas (seguramente ms que cualquier otro lenguaje). Adems, a pesar de su naturaleza de bajo nivel, el lenguaje se desarroll para incentivar la programacin independiente de la mquina. Un programa escrito cumpliendo los estndares e intentando que sea porttil puede compilarse en muchos computadores. C se desarroll originalmente (conjuntamente con el sistema operativo Unix, con el que ha estado asociado mucho tiempo) por programadores para programadores. Sin embargo, ha alcanzado una popularidad enorme, y se ha usado

C (lenguaje de programacin) en contextos muy alejados de la programacin de software de sistema, para la que se dise originalmente.

52

Caractersticas
Propiedades
Un ncleo del lenguaje simple, con funcionalidades aadidas importantes, como funciones matemticas y de manejo de archivos, proporcionadas por bibliotecas. Es un lenguaje muy flexible que permite programar con mltiples estilos. Uno de los ms empleados es el estructurado "no llevado al extremo" (permitiendo ciertas licencias de ruptura). Un sistema de tipos que impide operaciones sin sentido. Usa un lenguaje de preprocesado, el preprocesador de C, para tareas como definir macros e incluir mltiples archivos de cdigo fuente. Acceso a memoria de bajo nivel mediante el uso de punteros. Interrupciones al procesador con uniones. Un conjunto reducido de palabras clave. Por defecto, el paso de parmetros a una funcin se realiza por valor. El paso por referencia se consigue pasando explcitamente a las funciones las direcciones de memoria de dichos parmetros. Punteros a funciones y variables estticas, que permiten una forma rudimentaria de encapsulado y polimorfismo. Tipos de datos agregados (struct) que permiten que datos relacionados (como un empleado, que tiene un id, un nombre y un salario) se combinen y se manipulen como un todo (en una nica variable "empleado").

Carencias
Recoleccin de basura nativa, sin embargo se encuentran a tal efecto bibliotecas como la "libgc" desarrollada por Sun Microsystems, o el Recolector de basura de Boehm. Soporte para programacin orientada a objetos, aunque la implementacin original de C++ fue un preprocesador que traduca cdigo fuente de C++ a C. Funciones anidadas, aunque GCC tiene esta caracterstica como extensin. Soporte nativo para programacin multihilo. Aunque la lista de las caractersticas tiles de las que carece C es larga, este factor ha sido importante para su aceptacin, porque escribir rpidamente nuevos compiladores para nuevas plataformas, mantiene lo que realmente hace el programa bajo el control directo del programador, y permite implementar la solucin ms natural para cada plataforma. sta es la causa de que a menudo C sea ms eficiente que otros lenguajes. Tpicamente, slo la programacin cuidadosa en lenguaje ensamblador produce un cdigo ms rpido, pues da control total sobre la mquina, aunque los avances en los compiladores de C y la complejidad creciente de los microprocesadores modernos han reducido gradualmente esta diferencia. En algunos casos, una caracterstica inexistente puede aproximarse. Por ejemplo, la implementacin original de C++ consista en un preprocesador que traduca cdigo fuente C++ a C. La mayora de las funciones orientadas a objetos incluyen un puntero especial, que normalmente recibe el nombre "this", que se refiere al objeto al que pertenece la funcin. Mediante el paso de este puntero como un argumento de funcin, esta funcionalidad puede desempearse en C. Por ejemplo, en C++ se puede escribir: stack.push(val);

Mientras que en C, se podra escribir: push(stack, val);

C (lenguaje de programacin) Donde el argumento stack es un puntero a una struct equivalente al puntero this de C++, que es un puntero a un objeto.

53

Historia
Desarrollo inicial
El desarrollo inicial de C se llev a cabo en los Laboratorios Bell de AT&T entre 1969 y 1973; segn Ritchie, el periodo ms creativo tuvo lugar en 1972. Se le dio el nombre "C" porque muchas de sus caractersticas fueron tomadas de un lenguaje anterior llamado "B". Hay muchas leyendas acerca del origen de C y el sistema operativo con el que est ntimamente relacionado, Unix. Algunas de ellas son: El desarrollo de C fue el resultado del deseo de los programadores de jugar con Space Travel [2]. Haban estado jugando en el mainframe de su compaa, pero debido a su poca capacidad de proceso y al tener que soportar 100 usuarios, Thompson y Ritchie no tenan suficiente control sobre la nave para evitar colisiones con los asteroides. Por ese motivo decidieron portar el juego a un PDP-7 de la oficina que no se utilizaba; pero esa mquina no tena sistema operativo, as que decidieron escribir uno. Finalmente decidieron portar el sistema operativo del PDP-11 que haba en su oficina, pero era muy costoso, pues todo el cdigo estaba escrito en lenguaje ensamblador. Entonces decidieron usar un lenguaje de alto nivel y porttil para que el sistema operativo se pudiera portar fcilmente de un ordenador a otro. Consideraron usar B, pero careca de las funcionalidades necesarias para aprovechar algunas caractersticas avanzadas del PDP-11. Entonces empezaron a crear un nuevo lenguaje, C. La justificacin para obtener el ordenador original que se us para desarrollar Unix fue crear un sistema que automatizase el archivo de patentes. La versin original de Unix se desarroll en lenguaje ensamblador. Ms tarde, el lenguaje C se desarroll para poder reescribir el sistema operativo. En 1973, el lenguaje C se haba vuelto tan potente que la mayor parte del kernel Unix, originalmente escrito en el lenguaje ensamblador PDP-11/20, fue reescrita en C. ste fue uno de los primeros ncleos de sistema operativo implementados en un lenguaje distinto al ensamblador. (Algunos casos anteriores son el sistema Multics, escrito en PL/I, y Master Control Program para el B5000 de Burroughs, escrito en ALGOL en 1961).

El C de Kernighan y Ritchie
En 1978, Ritchie y Brian Kernighan publicaron la primera edicin de El lenguaje de programacin C, tambin conocido como La biblia de C. Este libro fue durante aos la especificacin informal del lenguaje. El lenguaje descrito en este libro recibe habitualmente el nombre de "el C de Kernighan y Ritchie" o simplemente "K&R C" (La segunda edicin del libro cubre el estndar ANSI C, descrito ms abajo.) Kernighan y Ritchie introdujeron las siguientes caractersticas al lenguaje: El tipo de datos struct. El tipo de datos long int. El tipo de datos unsigned int. Los operadores =+ y =- fueron sustituidos por += y -= para eliminar la ambigedad sintctica de expresiones como i=-10, que se podra interpretar bien como i=-10 o bien como i=-10.

El C de Kernighan y Ritchie es el subconjunto ms bsico del lenguaje que un compilador debe de soportar. Durante muchos aos, incluso tras la introduccin del ANSI C, fue considerado "el mnimo comn denominador" en el que los programadores deban programar cuando deseaban que sus programas fueran transportables, pues no todos los compiladores soportaban completamente ANSI, y el cdigo razonablemente bien escrito en K&R C es tambin cdigo ANSI C vlido.

C (lenguaje de programacin) En las primeras versiones del lenguaje, la definicin de funciones se haca mediante un 'prototipo de funcin' (function prototype), el cual indicaba al compilador el tipo de retorno de la funcin. Aunque este mtodo tiene una gran desventaja respecto al nuevo, debido a que no comprueba el nmero ni el tipo en la lista de argumentos; en otras palabras, es mucho ms fcil cometer errores al hacer un llamado a una funcin con argumentos incorrectos. Ejemplo del "viejo estilo": int power(); /* Podria haberse omitido (*) */ power() int a, b; { int n; for (n = 1; b > 0; --b) n *= a; return n; } Ejemplo de la nueva definicin: int power(int a, int b) { int n; for (n = 1; b > 0; --b) n *= a; return n; } (*) Por defecto, el tipo de retorno en C es int, por lo que la declaracin entera int power(); podra haberse omitido. En los aos siguientes a la publicacin del C de Kernighan y Ritchie, se aadieron al lenguaje muchas caractersticas no oficiales, que estaba soportadas por los compiladores de AT&T, entre otros. Algunas de estas caractersticas eran: Funciones void y el tipo de datos void *. Funciones que retornaban tipos de datos struct o union (en lugar de punteros). Asignacin de tipos de datos struct. Calificador const, que hace que un objeto sea de slo lectura. Una biblioteca estndar, que incorporaba la mayora de las funcionalidades implementadas por varios desarrolladores de compiladores. Enumeraciones.

54

ANSI C e ISO C
A finales de la dcada de 1970, C empez a sustituir a BASIC como lenguaje de programacin de microcomputadores predominante. Durante la dcada de 1980 se empez a usar en los IBM PC, lo que increment su popularidad significativamente. Al mismo tiempo, Bjarne Stroustrup empez a trabajar con algunos compaeros de Bell Labs para aadir funcionalidades de programacin orientada a objetos a C. El lenguaje que crearon, llamado C++, es hoy en da el lenguaje de programacin de aplicaciones ms comn en el sistema operativo Microsoft Windows; mientras que C sigue siendo ms popular en el entorno Unix. Otro lenguaje que se desarroll en esa poca, Objective C, tambin aadi caractersticas de programacin orientada a objetos a C. Aunque hoy en da no es tan popular como C++, se usa para desarrollar aplicaciones Cocoa para Mac OS X.

C (lenguaje de programacin) En 1983, el Instituto Nacional Estadounidense de Estndares organiz un comit, X3j11, para establecer una especificacin estndar de C. Tras un proceso largo y arduo, se complet el estndar en 1989 y se ratific como el "Lenguaje de Programacin C" ANSI X3.159-1989. Esta versin del lenguaje se conoce a menudo como ANSI C, o a veces como C89 (para distinguirla de C99). En 1990, el estndar ANSI (con algunas modificaciones menores) fue adoptado por la Organizacin Internacional para la Estandarizacin (ISO) en el estndar ISO/IEC 9899:1990. Esta versin se conoce a veces como C90. No obstante, "C89" y "C90" se refieren en esencia al mismo lenguaje. Uno de los objetivos del proceso de estandarizacin del ANSI C fue producir una extensin al C de Kernighan y Ritchie, incorporando muchas funcionalidades no oficiales. Sin embargo, el comit de estandarizacin incluy tambin muchas funcionalidades nuevas, como prototipos de funcin, y un preprocesador mejorado. Tambin se cambi la sintaxis de la declaracin de parmetros para hacerla semejante a la empleada habitualmente en C++: main(argc, argv) int argc; char **argv; { ... } pas a ser int main(int argc, char *argv[]) { ... } ANSI C est soportado hoy en da por casi la totalidad de los compiladores. La mayora del cdigo C que se escribe actualmente est basado en ANSI C. Cualquier programa escrito slo en C estndar sin cdigo que dependa de un hardware determinado funciona correctamente en cualquier plataforma que disponga de una implementacin de C compatible. Sin embargo, muchos programas han sido escritos de forma que slo pueden compilarse en una cierta plataforma, o con un compilador concreto, esto puede ser debido a diversos motivos: La utilizacin de bibliotecas no estndar, como interfaces grficas de usuario. El uso de compiladores que no cumplen las especificaciones del estndar. El uso de tipos de datos suponiendo que tendrn el mismo tamao u orden de los bits en todas las plataformas. La macro __STDC__ puede usarse para dividir el cdigo en secciones ANSI y K&R para el compilador. # if __STDC__ extern int getopt(int,char * const *,const char *); # else extern int getopt(); # endif Algunos programadores recomiendan usar "#if __STDC__", como en el ejemplo, en lugar de "#ifdef __STDC__" porque algunos compiladores le asignan el valor cero a __STDC__ para indicar que no son compatibles con ANSI.

55

C (lenguaje de programacin)

56

C99
Tras el proceso de estandarizacin de ANSI, la especificacin del lenguaje C permaneci relativamente estable durante algn tiempo, mientras que C++ sigui evolucionando. Sin embargo, el estndar continu bajo revisin a finales de la dcada de 1990, lo que llev a la publicacin del estndar ISO 9899:1999 en 1999. Este estndar se denomina habitualmente "C99". Se adopt como estndar ANSI en marzo de 2000. Las nuevas caractersticas de C99 incluyen: Funciones inline. Las variables pueden declararse en cualquier sitio (como en C++), en lugar de poder declararse slo tras otra declaracin o al comienzo de una declaracin compuesta. Muchos tipos de datos, incluyendo long long int (para reducir el engorro de la transicin de 32 bits a 64 bits), un tipo de datos booleano, y un tipo complex que representa nmeros complejos. Arrays de longitud variable. Soporte para comentarios de una lnea que empiecen con //, como en BCPL o en C++, caracterstica para la que muchos compiladores haban dado soporte por su cuenta. muchas funciones nuevas, como snprintf() muchos headers nuevos, como stdint.h. Una consideracin importante es que hasta la publicacin de este estndar, C haba sido mayormente un subconjunto estricto del C++. Era muy sencillo "actualizar" un programa de C hacia C++ y mantener ese cdigo compilable en ambos lenguajes. Sin embargo, el nuevo estndar agrega algunas caractersticas que C++ no admite, como por ejemplo los inicializadores estticos de estructuras. Tambin define al tipo "bool" de una manera que no es exactamente la del C++. El compilador GCC, entre muchos otros, soportan hoy en da la mayora de las nuevas caractersticas de C99. Sin embargo, este nuevo estndar ha tenido poca acogida entre algunos desarrolladores de compiladores, como Microsoft y Borland, que se han centrado en C++. Brandon Bray, de Microsoft, dijo a este respecto: "En general, hemos visto poca demanda de muchas caractersticas de C99. Algunas caractersticas tienen ms demanda que otras, y consideraremos incluirlas en versiones futuras siempre que sean compatibles con C++."[3]

C11
Se ha publicado una nueva revisin del estndar en noviembre 2011

Ventajas
Lenguaje muy eficiente puesto que es posible utilizar sus caractersticas de bajo nivel para realizar implementaciones ptimas. A pesar de su bajo nivel es el lenguaje ms portado en existencia, habiendo compiladores para casi todos los sistemas conocidos. Proporciona facilidades para realizar programas modulares y/o utilizar cdigo o bibliotecas existentes.

Inconvenientes
El mayor problema que presenta el lenguaje C frente a los lenguajes de tipo de dato dinmico es la gran diferencia en velocidad de desarrollo: es ms lento programar en C, sobre todo para el principiante. La razn estriba en que el compilador de C se limita a traducir cdigo sin apenas aadir nada. La gestin de la memoria es un ejemplo clsico: en C el programador ha de reservar y liberar la memoria explcitamente. En otros lenguajes (como BASIC, Matlab o C#) la memoria es gestionada de forma transparente para el programador. Esto alivia la carga de trabajo humano y en muchas ocasiones previene errores, aunque tambin supone mayor carga de trabajo para el procesador.

C (lenguaje de programacin) El mantenimiento en algunos casos puede ser ms difcil y costoso que con ciertos lenguajes de ms alto nivel. El cdigo en C se presta a sentencias cortas y enrevesadas de difcil interpretacin. Aunque el lenguaje admite cdigo escrito de forma fcilmente legible, si no se siguen normas en el equipo de programacin algunos programadores pueden acabar escribiendo cdigo difcil de leer. Esto complica la revisin y el mantenimiento. Aunque en realidad esto est ms relacionado con el equipo de desarrollo que con el lenguaje en s. Cabe destacar el contexto y poca en la que fue desarrollado C. En aquellos tiempos existan muy pocos programadores, los cuales, a su vez, eran prcticamente todos expertos en el rea. De esta manera, se asuma que los programadores eran conscientes de sus trabajos y capaces manejar perfectamente el lenguaje. Por esta razn es muy importante que los recin iniciados adopten buenas prcticas a la hora de escribir en C y manejar la memoria, como por ejemplo un uso intensivo de indentacin y conocer a fondo todo lo que implica el manejo de punteros y direcciones de memoria.

57

Variantes
Desde el inicio del lenguaje han surgido varias ramas de evolucin que han generado varios lenguajes: Objective-C es un primer intento de proporcionar soporte para la programacin orientada a objetos en C, de escasa difusin, pero actualmente usado en Mac OS X , iOS y GNUstep. C++ (pronunciado C Plus Plus) diseado por Bjarne Stroustrup fue el segundo intento de proporcionar orientacin a objetos a C y es la variante ms difundida y aceptada. Esta versin combina la flexibilidad y el acceso de bajo nivel de C con las caractersticas de la programacin orientada a objetos como abstraccin, encapsulacin y ocultacin. Tambin se han creado numerosos lenguajes inspirados en la sintaxis de C, pero que no son compatibles con l: Java, que une una sintaxis inspirada en la del C++ con una orientacin a objetos ms similar a la de Smalltalk y Objective C. JavaScript, un lenguaje de scripting creado en Netscape e inspirado en la sintaxis de Java diseado para dar a las pginas web mayor interactividad. A la versin estandarizada se la conoce como ECMAScript. C# (pronunciado C Sharp) es un lenguaje desarrollado por Microsoft derivado de C/C++ y Java.

Proceso de compilacin
La compilacin de un programa C se realiza en varias fases que normalmente son automatizadas y ocultadas por los entornos de desarrollo: 1. Preprocesado consistente en modificar el cdigo fuente en C segn una serie de instrucciones (denominadas directivas de preprocesado) simplificando de esta forma el trabajo del compilador. Por ejemplo, una de las acciones ms importantes es la modificacin de las inclusiones (#include) por las declaraciones reales existentes en el archivo indicado. 2. Compilacin que genera el cdigo objeto a partir del cdigo ya preprocesado. 3. Enlazado que une los cdigos objeto de los distintos mdulos y bibliotecas externas (como las bibliotecas del sistema) para generar el programa ejecutable final.

Ejemplo de cdigo
El siguiente programa imprime en pantalla la frase "Hola Mundo" (C99). // necesario para utilizar printf() # include <stdio.h> int main(void) {

C (lenguaje de programacin) printf("Hola Mundo\n"); return 0; } El siguiente escribe "Hola Mundo" en C89 /* comentarios con '//' no permitidos en C89, s en C99 */ # include <stdio.h> /* necesario para utilizar printf */ main() /* tipo 'int' de retorno implcito */ { printf ("Hola Mundo\n") ; return 0; }

58

Herramientas de programacin
Al programar en C, es habitual usar algunas herramientas de programacin de uso muy extendido, sobre todo en entorno de tipo unix: make: Herramienta para automatizar el proceso de compilacin, enlazado, etc. lint: Herramienta utilizada para detectar cdigo sospechoso, confuso o incompatible entre distintas arquitecturas valgrind: Herramienta utilizada para detectar posibles fugas de memoria. gdb : Debugger de GNU utilizado para seguir la ejecucin del programa. dbx : Debugger que suele venir instalado con todos los UNIX. ddd : Interfaz grfico para el depurador gdb o dbx.

Aplicabilidad
Hecho principalmente para la fluidez de programacin en sistemas UNIX. Se usa tambin para el desarrollo de otros sistemas operativos como Windows o GNU/Linux. Igualmente para aplicaciones de escritorio como GIMP, cuyo principal lenguaje de programacin es C. De la misma forma, es muy usado en aplicaciones cientficas (para experimentos informticos, fsicos, qumicos, matemticos, entre otros, parte de ellos conocidos como modelos y simuladores), industriales (industria robtica, ciberntica, sistemas de informacin y base de datos para la industria petrolera y petroqumica. Predominan tambin todo lo que se refiere a simulacin de mquinas de manufactura), simulaciones de vuelo (es la ms delicada, ya que se tienen que usar demasiados recursos tanto de hardware como de software para desarrollar aplicaciones que permitan simular el vuelo real de una aeronave. Se aplica por tanto, en diversas reas desconocidas por gran parte de los usuarios noveles. Los ordenadores de finales de los 90 son varios rdenes de magnitud ms potentes que las mquinas en que C se desarroll originalmente. Programas escritos en lenguajes de tipo dinmico y fcil codificacin (Ruby, Python, Perl...) que antao hubieran resultado demasiado lentos, son lo bastante rpidos como para desplazar en uso a C. Aun as, se puede seguir encontrando cdigo C en grandes desarrollos de animaciones, modelados y escenas en 3D en pelculas y otras aplicaciones multimedia. Actualmente, los grandes proyectos de software se dividen en partes, dentro de un equipo de desarrollo. Aquellas partes que son ms "burocrticas" o "de gestin" con los recursos del sistema, se suelen realizar en lenguajes de tipo dinmico o de guin (script), mientras que aquellas partes "crticas", por su necesidad de rapidez de ejecucin, se realizan en un lenguaje de tipo compilado, como C o C++. Si, despus de hacer la divisin, las partes crticas no superan un cierto porcentaje del total (aproximadamente el 10%) entonces todo el desarrollo se realiza con lenguajes

C (lenguaje de programacin) dinmicos. Si la parte crtica no llega a cumplir las expectativas del proyecto, se comparan las alternativas de una inversin en nuevo hardware frente a invertir en el coste de un programador para que reescriba dicha parte crtica.

59

Aplicaciones embebidas
C es el lenguaje comn para programar sistemas embebidos.[citarequerida] El cdigo ligero que un compilador C genera, combinado con la capacidad de acceso a capas del software cercanas al hardware son la causa de su popularidad en estas aplicaciones. Una caracterstica donde C demuestra comodidad de uso particularmente valiosa en sistemas embebidos es la manipulacin de bits. Los sistemas contienen registros mapeados en memoria (en ingls, MMR) a travs de los cuales los perifricos se configuran. Estos registros mezclan varias configuraciones en la misma direccin de memoria, aunque en bits distintos. Con C es posible modificar fcilmente uno de estos bits sin alterar el resto. Por ejemplo: int *mmr; /* puntero al registro que queremos modificar */ mmr = 0x40008ABC; /* direccin de memoria del registro */ * mmr |= 1<<7; /* pone a 1 el bit 8 sin modificar los dems */ * mmr &= ~(1<<12) /* pone a 0 el bit 13 sin modificar los dems */ Este tipo de manipulacin es muy tediosa o sencillamente imposible en otros lenguajes de alto nivel, dado que se utilizan operaciones comunes del lenguaje ensamblador como las operaciones a nivel bit OR, AND, SHL y CPL pero que estn disponibles en el lenguaje C. Otras caractersticas de C consideradas desventajas en la programacin para PC -como la ausencia de control de memoria automtico- se convierten en ventajas cuando los sistemas embebidos necesitan cdigo pequeo y optimizado. Ese es el caso de los sistemas basados en microcontroladores de poca potencia como el intel 8051 o muchos sistemas ARM.

Bibliotecas C
Una biblioteca de C es una coleccin de funciones utilizadas en el lenguaje de programacin C. Las bibliotecas ms comunes son la biblioteca estndar de C y la biblioteca del estndar ANSI C, la cual provee las especificaciones de los estndares que son ampliamente compartidas entre bibliotecas. La biblioteca ANSI C estndar, incluye funciones para la entrada y salida de archivos, alojamiento de memoria y operaciones con datos comunes: funciones matemticas, funciones de manejo de cadenas de texto y funciones de hora y fecha. Otras bibliotecas C son aquellas utilizadas para desarrollar sistemas Unix, las cuales proveen interfaces hacia el ncleo. Estas funciones son detalladas en varios estndares tales como POSIX y el Single UNIX Specification. Ya que muchos programas han sido escritos en el lenguaje C existe una gran variedad de bibliotecas disponibles. Muchas bibliotecas son escritas en C debido a que C genera cdigo objeto rpido; los programadores luego generan interfaces a la biblioteca para que las rutinas puedan ser utilizadas desde lenguajes de mayor nivel, tales como Java, Perl y Python.

C (lenguaje de programacin)

60

Referencias
[1] Dennis M. Ritchie (Enero de 1993). The Development of the C Language (http:/ / cm. bell-labs. com/ cm/ cs/ who/ dmr/ chist. html) (en ingls). Consultado el 01-01-2008.The scheme of type composition adopted by C owes considerable debt to Algol 68, although it did not, perhaps, emerge in a form that Algol's adherents would approve of.. [2] http:/ / cm. bell-labs. com/ cm/ cs/ who/ dmr/ spacetravel. html [3] Content not found (http:/ / msdn. microsoft. com/ chats/ transcripts/ vstudio/ vstudio_022703. aspx).

Enlaces externos
Wikiversidad alberga proyectos de aprendizaje sobre C (lenguaje de programacin).Wikiversidad Wikilibros Wikilibros alberga un libro o manual sobre Programacin en C. Estndar Internacional ISO/IEC 9899:TC3 (http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256. pdf) Estndar ANSI C99 C evolution (http://www.faqs.org/docs/artu/c_evolution.html) Comunidad de C (http://www.elrincondelc.com/) Introduccin al lenguaje C (http://sopa.dis.ulpgc.es/so/cpp/intro_c/) Curso de lenguaje C de Carlos Pes (http://www.carlospes.com/curso_de_lenguaje_c/) [news:es.comp.lenguajes.c Grupo de noticias sobre el lenguaje C] [news:comp.lang.c Grupo de noticias sobre el lenguaje C] Curso de lenguaje C (CCS) para microcontroladores (http://www.ucontrol.com.ar/wiki/index.php?title=CCS) Curso de lenguaje C (C18, C30) para microcontroladores PIC (http://www.micros-designs.com.ar)

Interfaz grfica de usuario


La interfaz grfica de usuario, conocida tambin como GUI (del ingls graphical user interface) es un programa informtico que acta de interfaz de usuario, utilizando un conjunto de imgenes y objetos grficos para representar la informacin y acciones disponibles en la interfaz. Su principal uso, consiste en proporcionar un entorno visual sencillo para permitir la comunicacin con el sistema operativo de una mquina o computador. Habitualmente las acciones se realizan mediante manipulacin directa, para facilitar la interaccin del usuario con la computadora. Surge como evolucin de las interfaces de lnea de comandos que se usaban Cursor del ratn realizando una seleccin para operar los primeros sistemas operativos y es pieza fundamental en mltiple en el escritorio KDE. un entorno grfico. Como ejemplos de interfaz grfica de usuario, cabe citar los entornos de escritorio Windows, el X-Window de GNU/Linux o el de Mac OS X, Aqua. En el contexto del proceso de interaccin persona-ordenador, la interfaz grfica de usuario es el artefacto tecnolgico de un sistema interactivo que posibilita, a travs del uso y la representacin del lenguaje visual, una interaccin amigable con un sistema informtico.

Interfaz grfica de usuario

61

Introduccin
La historia reciente de la informtica est indisolublemente unida a las interfaces grficas, puesto que los sistemas grficos han ocasionado grandes consecuencias en la industria del software y del hardware. Las interfaces grficas surgen de la necesidad de hacer los ordenadores ms accesibles para el uso de los usuarios comunes. La mayora de El manejo de las GUI requiere de un dispositivo ordenadores domsticos, requeran conocimientos de BASIC (el 95% sealador (por ejemplo, un ratn). de ellos incorporaban un intrprete BASIC como entorno operador) u ofrecan una interfaz de lnea de rdenes (como los sistemas operativos CP/M o los diferentes OS del Apple II), lo que requera conocimientos tcnicos si se deseaba hacer algo ms que usarlo como consola de videojuegos. Esta limitacin fue salvada gracias al desarrollo de los entornos grficos, que permitieron que las personas pudieran acceder a un ordenador sin tener que pasar por el tortuoso proceso de tener que aprender a manejar un entorno bajo lnea de rdenes.

Precursores
Los investigadores del Stanford Research Institute liderados por Douglas Engelbart, desarrollaron una interfaz de hipervnculos en modo texto gobernado por un ratn, que tambin inventaron. Este concepto fue ampliado y trasladado al entorno grfico por los investigadores del Xerox PARC en EE.UU.. El entorno se denomin PARC User Interface y en l se definieron los conceptos de ventanas, checkbox, botones de radio, mens y puntero del ratn. Fue implementado comercialmente en el Xerox Star 8010

Xerox Alto
El Xerox Alto, desarrollado en el Xerox PARC en 1973, fue el primer ordenador personal, as como el primero que utiliz la metfora de escritorio y una interfaz grfica de usuario.

Xerox Star 8010


La estacin de trabajo Xerox Star, conocida oficialmente como el "8010 Star Information System" (Sistema de Informacin Estrella 8010) fue introducida por Xerox Corporation en 1981. Fue el primer sistema comercial en incorporar varias tecnologas que han llegado a ser hoy en da corrientes en computadores personales, incluyendo la pantalla con bitmaps en lugar de solo texto, una interfaz grfica de usuario basada en ventanas, iconos, carpetas, ratn, red Ethernet, servidores de archivos, servidores de impresoras y e-mail.

Apple Lisa, Macintosh, Apple II GS


Tras una visita al Xerox PARC en 1979, el equipo de Apple encabezado por Jef Raskin se concentra en disear un entorno grfico para su nueva generacin de 16 bits, que se ver plasmado en el Apple Lisa en 1983. Ese sistema grfico es portado al sucesor del Apple II, el Apple II GS. Un segundo equipo trabaja en el Apple Macintosh que ver la luz en 1984 con una versin mejorada del entorno grfico del Lisa (pretendimos hacer un ordenador tan simple de manejar como una tostadora). Desde ese momento el Mac reinar como paradigma de usabilidad de un entorno grfico; pese a que por debajo el sistema operativo sufra cambios radicales, los usuarios no avanzados no son conscientes de ello y no sufren los problemas de otras plataformas.

Interfaz grfica de usuario

62

Workbench
Workbench es el nombre dado por Commodore a la interfaz grfica del AmigaOS, el sistema operativo del Commodore Amiga lanzado en 1985. A diferencia de los sitemas ms populares (GEM, Mac OS, MS Windows...) es un verdadero entorno multitarea slo rivalizado por la interfaz X Window System de los diferentes sabores de Unix. La frase ms repetida por un "amiguero" es: "para masacrar marcianos, formatear un diskette y enviar o recibir un Fax todo a la vez y sin colgarse, necesitas un 386 con disco duro, 16 MB de RAM y OS/2; un Amiga 500 con disquete y slo su memoria base (512 KB de RAM y 512 KB de ROM) es capaz de todo eso". Aunque muy popular por los espectaculares (para entonces) grficos de la mquina y su gran plantel de videojuegos, ser la negligencia de sus sucesivos propietarios la principal causa de que acabe restringido a slo la plataforma Amiga.

GEOS
Para el Commodore 64 y su sucesor el Commodore 128 se desarroll el entorno grfico GEOS en 1986. Este entorno se port al IBM PC, fue utilizado en varias PDA y Nokia lo us como base de su actual sistema operativo.

GEM
GEM (Graphical Environment Manager) es un GUI diseado por Digital Research en 1988 para ejecutarse sobre varios sistemas operativos de lnea de comandos del IBM PC y compatibles: funciona tanto sobre IBM DOS /MS-DOS como sobre CP/M 86. Su mxima popularidad en el PC llega de la mano del Amstrad PC1512 y del Amstrad PC1640, los clnicos que rompieron en Europa la barrera del precio popularizando el PC, hasta ese momento relegado mayoritariamente a oficinas. Aunque se incorpora en su primera generacin de porttiles y en el Sinclair PC200, ser sustituido en la siguiente generacin de PCs Amstrad por Microsoft Windows 2.xx. En el PC vivir una segunda juventud al venir de serie con DR-DOS como TaskMax. Pero ser en los Atari ST y sucesores donde se convertir en el entorno grfico oficial de la plataforma, alcanzando gran popularidad, tanto por ser en principio una alternativa barata al MAC en autoedicin, como por hacerse con el nicho de mercado de la msica profesional.

Apple y Microsoft
A principios de los aos ochenta (en 1982) Apple, que haba comenzado como una micro-empresa formada por dos empleados (Steve Jobs y Steve Wozniak) haba crecido hasta convertirse en una empresa de 300 millones de dlares. En el ao 1983 Apple ya se haba convertido en una empresa de 1000 millones de dlares, el mismo valor que IBM. En 1987 IBM se vio obligada a entrar en el mercado de los ordenadores personales con entorno grfico con su modelo PS/2, alindose con Bill Gates (Microsoft), que haba desarrollado el OS/2. La interfaz grfica de este sistema operativo era muy similar a la de Apple. Pero el OS/2 no se convirti en el nuevo estndar del sector, debido fundamentalmente al conflicto de intereses entre IBM y Microsoft. En el ao 1985, Microsoft saca al mercado Windows 1.0, entorno grfico para ordenadores PC IBM compatibles, con un parecido asombroso al Mac OS. La respuesta de Apple a la introduccin del sistema operativo Windows fue la interposicin de una demanda de varios miles de millones de dlares contra Microsoft, por violacin de copyright. La aparicin de ordenadores IBM clnicos hizo que el sistema Windows se popularizara, lo que rest mercado a Apple. sta se recuper a finales de 1990 lanzando nuevos productos. Una seal inequvoca del xito de Apple fue la aparicin de productos similares: una pequea compaa llamada Nutek Computers Inc. anunci que estaba desarrollando un ordenador compatible con el Macintosh.

Interfaz grfica de usuario En 1991, John Sculley, director de Apple, revel que la compaa estaba considerando competir contra Microsoft en el campo del software vendiendo su sistema operativo a terceros. Apple revel que estaba manteniendo conversaciones con su antiguo rival, IBM, destinadas a compartir tecnologas. Decidieron crear una joint venture para desarrollar un sistema operativo avanzado que ambas utilizaran en sus nuevas mquinas y licenciaran a terceros. Este plan presentaba un desafo directo a Microsoft. Microsoft consigue convertir a Windows en el sistema operativo ms utilizado en el mundo, dejando a Apple en un segundo lugar.

63

Tipos de interfaces grficas de usuario


GUI's y Zooming user interface
Los tipos de GUIs que se encuentran en juegos de computadora, y los GUIs avanzados basados en realidad virtual, se usan con frecuencia en tareas de investigacin. Muchos grupos de investigacin en Norteamrica y Europa estn trabajando actualmente en la interfaz de enfoque del usuario o ZUI (Zooming User Interface), que es un adelanto lgico de las GUI, mezclando 3D con 2D. Podra expresarse como "2 dimensiones y media en objetos vectoriales de una dimensin".

Interfaz de usuario de pantalla tctil


Algunos GUIs son diseados para cumplir con los rigurosos requisitos de los mercados verticales. stos se conocen como "GUIs de uso especfico." Un ejemplo de un GUI de uso especfico es la ahora familiar touchscreen o pantalla tctil (pantalla que al ser tocada efecta los comandos del ratn en el software). Se encuentra actualmente implementado en muchos restaurantes y en muchas tiendas de autoservicio de todo el mundo. Fue iniciado por Gene Mosher en la computadora del ST de Atari en 1986, el uso que l especfic en las GUIs de pantalla tctil ha encabezado una revolucin mundial en el uso de las computadoras a travs de las industrias alimenticias y de bebidas, y en ventas al por menor. Otros ejemplos de GUIs de uso especfico, relacionados con la pantalla tctil son los cajeros automticos, los kioscos de informacin y las pantallas de monitoreo y control en los usos industriales, que emplean un sistema operativo de tiempo real (RTOS). Los telfonos mviles y los sistemas o consolas de juego tambin emplean las pantallas tctiles. Adems la domtica no es posible sin una buena interfaz de usuario, o GUI.

Interfaz Natural de Usuario


Las NUI naturales son aquellas en las que se interacta con un sistema, aplicacin, etc., sin utilizar dispositivos de entrada como ratn, teclado, lpiz ptico, etc. En lugar de stos se utilizan las manos o las yemas de los dedos. http:/ /expressionlab.net/tag/interfaz-natural-de-usuario/

Bibliografa
Royo, Javier. Diseo Digital. Ediciones Paids Ibrica, 2004. Shneiderman, Ben. Designing The user interface, Strategies for effective Human-computer interaction. Addison-wesley,1998

Interfaz grfica de usuario

64

Enlaces externos
Wikimedia Commons alberga contenido multimedia sobre Interfaz grfica de usuario. Commons Interfaces Graficas de Usuario [1] Ejemplo de una Interfaz Grafica para un Escritorio Ejecutivo. Ars Technica: A History of the GUI por Jeremy Reimer [2] (en ingls). Interfaces Grficas de Usuario (Historia) [3] (en espaol). imgenes de casi todos los entornos grficos de sistemas operativos [4]

Referencias
[1] [2] [3] [4] http:/ / puertoparalelo-rawde. blogspot. com/ 2009/ 05/ el-mejor-sistema-de-dialogo-touchscreen. html http:/ / arstechnica. com/ articles/ paedia/ gui. ars/ 1 http:/ / sabia. tic. udc. es/ gc/ Contenidos%20adicionales/ trabajos/ Interfaces/ enlightment/ index. html http:/ / www. guidebookgallery. org/ guis

Programacin dirigida por eventos


La programacin dirigida por eventos es un paradigma de programacin en el que tanto la estructura como la ejecucin de los programas van determinados por los sucesos que ocurran en el sistema, definidos por el usuario o que ellos mismos provoquen. Para entender la programacin dirigida por eventos, podemos oponerla a lo que no es: mientras en la programacin secuencial (o estructurada) es el programador el que define cul va a ser el flujo del programa, en la programacin dirigida por eventos ser el propio usuario o lo que sea que est accionando el programa el que dirija el flujo del programa. Aunque en la programacin secuencial puede haber intervencin de un agente externo al programa, estas intervenciones ocurrirn cuando el programador lo haya determinado, y no en cualquier momento como puede ser en el caso de la programacin dirigida por eventos. El creador de un programa dirigido por eventos debe definir los eventos que manejarn su programa y las acciones que se realizarn al producirse cada uno de ellos, lo que se conoce como el administrador de evento. Los eventos soportados estarn determinados por el lenguaje de programacin utilizado, por el sistema operativo e incluso por eventos creados por el mismo programador. En la programacin dirigida por eventos, al comenzar la ejecucin del programa se llevarn a cabo las inicializaciones y dems cdigo inicial y a continuacin el programa quedar bloqueado hasta que se produzca algn evento. Cuando alguno de los eventos esperados por el programa tenga lugar, el programa pasar a ejecutar el cdigo del correspondiente administrador de evento. Por ejemplo, si el evento consiste en que el usuario ha hecho click en el botn de play de un reproductor de pelculas, se ejecutar el cdigo del administrador de evento, que ser el que haga que la pelcula se muestre por pantalla. Un ejemplo claro lo tenemos en los sistemas de programacin Lexico y Visual Basic, en los que a cada elemento del programa (objetos, controles, etctera) se le asignan una serie de eventos que generar dicho elemento, como la pulsacin de un botn del ratn sobre l o el redibujado del control. La programacin dirigida por eventos es la base de lo que llamamos interfaz de usuario, aunque puede emplearse tambin para desarrollar interfaces entre componentes de Software o mdulos del ncleo. En los primeros tiempos de la computacin, los programas eran secuenciales, tambin llamados Batch. Un programa secuencial arranca, lee parmetros de entrada, procesa estos parmetros, y produce un resultado, todo de manera lineal y sin intervencin del usuario mientras se ejecuta. Con la aparicin y popularizacin de los PC, el software empez a ser demandado para usos alejados de los clsicos acadmicos y empresariales para los cuales era necesitado hasta entonces, y qued patente que el paradigma clsico de programacin no poda responder a las nuevas necesidades de interaccin con el usuario que surgieron a raz de

Programacin dirigida por eventos este hecho...

65

Deteccin de eventos
En contraposicin al modelo clsico, la programacin orientada a eventos permite interactuar con el usuario en cualquier momento de la ejecucin. Esto se consigue debido a que los programas creados bajo esta arquitectura se componen por un bucle exterior permanente encargado de recoger los eventos, y distintos procesos que se encargan de tratarlos. Habitualmente, este bucle externo permanece oculto al programador que simplemente se encarga de tratar los eventos, aunque en algunos lenguajes ser necesaria su construccin. Ejemplo de programa orientado a eventos en pseudo lenguaje: While (true){ Switch (event){ case mousse_button_down: case mouse_click: case keypressed: case Else: } }

Problemtica
La programacin orientada a eventos supone una complicacin aadida con respecto a otros paradigmas de programacin, debido a que el flujo de ejecucin del software escapa al control del programador. En cierta manera podramos decir que en la programacin clsica el flujo estaba en poder del programador y era este quin decida el orden de ejecucin de los procesos, mientras que en programacin orientada a eventos, es el usuario el que controla el flujo y decide. Pongamos como ejemplo de la problemtica existente, un men con dos botones, botn 1 y botn 2. Cuando el usuario pulsa botn 1, el programa se encarga de recoger ciertos parmetros que estn almacenados en un fichero y calcular algunas variables. Cuando el usuario pulsa el botn 2, se le muestran al usuario por pantalla dichas variables. Es sencillo darse cuenta de que la naturaleza indeterminada de las acciones del usuario y las caractersticas de este paradigma pueden fcilmente desembocar en el error fatal de que se pulse el botn 2 sin previamente haber sido pulsado el botn 1. Aunque esto no pasa si se tienen en cuenta las propiedades de dichos botones, haciendo inaccesible la pulsacin sobre el botn 2 hasta que previamente se haya pulsado el botn 1.

GUI's/ Interfaces Grficas de Usuarios


Con la evolucin de los lenguajes orientados a eventos, la interaccin del software con el usuario ha mejorado enormemente permitiendo la aparicin de interfaces que, aparte de ser la va de comunicacin del programa con el usuario, son la propia apariencia del mismo. Estas interfaces, tambin llamadas GUI (Graphical User Interface), han sido la herramienta imprescindible para acercar la informtica a los usuarios, permitiendo en muchos casos, a principiantes utilizar de manera intuitiva y sin necesidad de grandes conocimientos, el software que ha colaborado a mejorar la productividad en muchas tareas. Uno de los perifricos que ha cobrado mayor importancia tras la aparicin de los programas orientados a eventos ha sido el ratn, gracias tambin en parte a la aparicin de los sistemas operativos modernos con sus interfaces grficas. Sus interfaces graficas suelen dirigir directamente al controlador interior que va entrelazado al algoritmo.

Programacin dirigida por eventos

66

Herramientas visuales de desarrollo


Con el paso del tiempo, han ido apareciendo una nueva generacin de herramientas que incluyen cdigo que automatiza parte de las tareas ms comunes en la deteccin y tratamiento de eventos. Destacan particularmente los entornos de programacin visual que conjugan una herramienta de diseo grfica para la GUI y un lenguaje de alto nivel. Entre estas herramientas se encuentra la conocida Visual Basic, lenguaje altamente apreciado por principiantes debido a la facilidad para desarrollar software en poco tiempo y con pocos conocimientos, y denostado por tantos otros debido a su falta de eficiencia.

Lenguajes
Visual Basic Javascript Java(AWT,swing) Visual C++ Visual .Net ASP .Net Qt GTK+ Visual C# Visual J# AS3 Lexico Php

Referencias
Grant Palmer: Java Event Handling, Prentice Hall, ISBN 0-13-041802-1. David Luckham: The Power of Events - An Introduction to Complex Event Processing in Distributed Enterprise Systems, Addison-Wesley, ISBN 0-201-72789-7. George S. Fishman: Discrete-Event Simulation - Modeling, Programming, and Analysis, Springer, ISBN 0-387-95160-1. Bertrand Meyer (2004): The power of abstraction, reuse and simplicity: an object-oriented library for event-driven design, in Festschrift in Honor of Ole-Johan Dahl, eds. Olaf Owe et al., Springer-Verlag, Lecture Notes in Computer Science 2635, also available online [1]. Miro Samek: Practical Statecharts in C/C++: Quantum Programming for Embedded Systems, CMP Books, ISBN 1-57820-110-1. Faison, Ted (2006). Event-Based Programming: Taking Events to the Limit. Apress. ISBN 1-59059-643-9. En espaol: Adolfo Lozano Tello: Iniciacin a la programacin utilizando lenguajes visuales orientados a eventos, Ed.Bellisco Ediciones Tcnicas y Cientficas, ISBN 84-95279-49-5. ISBN 978-84-95279-49-1

Enlaces externos
Description [2] from Portland Pattern Repository Tutorial "Event-Driven Programming: Introduction, Tutorial, History [3]" by Stephen Ferg Tutorial "Event Driven Programming [4]" by Alan Gauld Article "Event Collaboration [5]" by Martin Fowler

Programacin dirigida por eventos Article "Transitioning from Structured to Event-Driven Programming [6]" by Ben Watson Article "Rethinking Swing Threading [7]" by Jonathan Simon Article "The event driven programming style [8]" by Chris McDonald Article "Event Driven Programming using Template Specialization [9]" by Christopher Diggins Article "Concepts and Architecture of Vista - a Multiparadigm Programming Environment [10]" by Stefan Schiffer and Joachim Hans Frhlich Chapter "Event-Driven Programming and Agents [11]" LabWindows/CVI Resources [12] Comment [13] by Tim Boudreau Complex Event Processing and Service Oriented Architecture [14] Event-driven programming and SOA: How EDA extends SOA and why it is important [15] Jack van Hoof For an open source example, see Distributed Publish/Subscribe Event System [16] Event-driven programming in Java, see open source project Jsasb [17] by Rex Young

67

Referencias
[1] http:/ / se. ethz. ch/ ~meyer/ publications/ lncs/ events. pdf [2] http:/ / c2. com/ cgi/ wiki?EventDrivenProgramming [3] http:/ / eventdrivenpgm. sourceforge. net/ [4] http:/ / www. freenetpages. co. uk/ hp/ alan. gauld/ tutevent. htm [5] http:/ / www. martinfowler. com/ eaaDev/ EventCollaboration. html [6] http:/ / www. devhood. com/ tutorials/ tutorial_details. aspx?tutorial_id=504 [7] http:/ / today. java. net/ lpt/ a/ 32 [8] http:/ / www. csse. uwa. edu. au/ cnet/ eventdriven. html [9] http:/ / codeproject. com/ cpp/ static-callbacks. asp [10] http:/ / www. swe. uni-linz. ac. at/ people/ schiffer/ se-94-17/ se-94-17. htm [11] http:/ / docs. eiffel. com/ eiffelstudio/ general/ guided_tour/ language/ invitation-09. html [12] http:/ / zone. ni. com/ devzone/ devzone. nsf/ webcategories/ FCE7EA7ECA51169C862567A9005878EA [13] http:/ / javalobby. org/ forums/ thread. jspa?threadID=13874& messageID=91806918& tstart=0 [14] http:/ / news. tmcnet. com/ news/ 2006/ 08/ 18/ 1816129. htm [15] http:/ / soa-eda. blogspot. com/ 2006/ 11/ how-eda-extends-soa-and-why-it-is. html [16] http:/ / www. codeplex. com/ pubsub [17] https:/ / jsasb. dev. java. net/

Ada (lenguaje de programacin)

68

Ada (lenguaje de programacin)


Ada es un lenguaje de programacin orientado a objetos y fuertemente tipado de forma esttica que fue diseado por Jean Ichbiah de CII Honeywell Bull por encargo del Departamento de Defensa de los Estados Unidos. Es un lenguaje multipropsito, orientado a objetos y concurrente, pudiendo llegar desde la facilidad de Pascal hasta la flexibilidad de C++. Fue diseado con la seguridad en mente y con una filosofa orientada a la reduccin de errores comunes y difciles de descubrir. Para ello se basa en un tipado muy fuerte y en chequeos en tiempo de ejecucin (desactivables en beneficio del rendimiento). La sincronizacin de tareas se realiza mediante la primitiva rendezvous. Ada se usa principalmente en entornos en los que se necesita una gran seguridad y fiabilidad como la defensa, la aeronutica (Boeing o Airbus), la gestin del trfico areo (como Indra en Espaa) y la industria aeroespacial entre otros.

Historia
El lenguaje fue diseado bajo encargo del Departamento de Defensa de los Estados Unidos (DoD). Durante los aos 1970, este departamento tena proyectos en una infinidad de lenguajes y estaba gastando mucho dinero en software. Para solucionarlo se busc un lenguaje nico que cumpliese unas ciertas normas recogidas en el documento Steelman. Despus de un estudio de los lenguajes existentes en la poca se decidi que ninguno las cumpla totalmente, por lo que se hizo un concurso pblico al que se presentaron cuatro equipos, cuyas propuestas se nombraron con un color: Rojo (Intermetrics), Verde (CII Honeywell Bull), Azul (SofTEch) y Amarillo (SRI International). Finalmente en mayo de 1979 se seleccion la propuesta Verde diseada por Jean Ichbiah de CII Honeywell Bull, y se le dio el nombre de Ada. Esta propuesta era un sucesor de un lenguaje anterior de este equipo llamado LIS y desarrollado durante los aos 1970. El nombre se eligi en conmemoracin de lady Ada Augusta Byron (1815-1852) Condesa de Lovelace, hija del poeta Lord George Byron, a quien se considera la primera programadora de la Historia, por su colaboracin y relacin con Charles Babbage, creador de la mquina analtica. El lenguaje se convirti en un estndar de ANSI en 1983 (ANSI/MIL-STD 1815) y un estndar ISO en 1987 (ISO-8652:1987). El DoD y los ministerios equivalentes de varios pases de la OTAN exigan el uso de este lenguaje en los proyectos que contrataban (el Ada mandate). La obligatoriedad en el caso de Estados Unidos termin en 1997, cuando el DoD comenz a usar productos COTS (commercial off the shelf). Ada ha sido utilizado por la NASA en sistemas VAX. Wikisource en ingls contiene obras originales de o sobre los requisitos de Steelman.Wikisource

pgina: Ada 2005.

Ada (lenguaje de programacin)

69

Compiladores
Un compilador de Ada muy usado es GNAT, originalmente desarrollado por la Universidad de Nueva York bajo patrocinio del DoD. Est basado en la tecnologa de GCC y es software libre. Actualmente est mantenido por AdaCore (antes llamada Ada Core Technologies), empresa que ofrece soporte y servicios sobre el compilador. Existen otros compiladores comerciales.

Caractersticas
La sintaxis, inspirada en Pascal, es bastante legible incluso para personas que no conozcan el lenguaje. Es un lenguaje que no escatima en la longitud de las palabras clave, en la filosofa de que un programa se escribe una vez, se modifica decenas de veces y se lee miles de veces (legibilidad es ms importante que rapidez de escritura). Es indiferente el uso de maysculas y minsculas en los identificadores y palabras claves, es decir es un lenguaje case-insensitive. En Ada, todo el programa es un nico procedimiento, que puede contener subprogramas (procedimientos o funciones). Cada sentencia se cierra con end qu_cerramos. Es un modo de evitar errores y facilitar la lectura. No es necesario hacerlo en el caso de subprogramas, aunque todos los manuales lo aconsejan y casi todos los programadores de Ada lo hacen. El operador de asignacin es :=, el de igualdad =. A los programadores de C y similares les puede confundir este rasgo inspirado en Pascal. La sintaxis de atributos predefinidos es Objeto'Atributo (o Tipo'Atributo) (nota: esto slo aplica a atributos predefinidos por el lenguaje, ya que no es el concepto de atributo tpico de OOP). Se distingue entre "procedimientos" (subrutinas que no devuelven ningn valor pero pueden modificar sus parmetros) y "funciones" (subrutinas que devuelven un valor y no modifican los parmetros). Muchos lenguajes de programacin no hacen esta distincin. Las funciones de Ada favorecen la seguridad al reducir los posibles efectos colaterales, pues no pueden tener parmetros in out.

Hola Mundo
ste es el tpico "Hola Mundo" escrito en Ada: with Ada.Text_IO, Ada.Strings.Unbounded; use Ada.Text_IO, , Ada.Strings.Unbounded; procedure Hola_Mundo is Rist : Unbounded_String := To_Unbounded_String ("Hola, mundo!"); begin Put (Rist); end Hola_Mundo;

Ada (lenguaje de programacin)

70

Enlaces externos
En espaol
Wikilibros Wikilibros alberga un libro o manual sobre Programacin en Ada. Curso bsico de Ada 95 en ulpgc.es [1] Asociacin Ada-Spain [2] Directorio de pginas sobre Ada [3] canalada.org - Foro sobre Ada [4] Compilar Ada en Mac OS X [5] Mxico-UTM [6]

En ingls
Ada Information Clearing House [7] Ada Power [8] Asociacin Ada-Europe [9] Directorio de pginas sobre Ada [10]

Referencias
[1] http:/ / www. gedlc. ulpgc. es/ docencia/ NGA/ index. html [2] http:/ / www. adaspain. org [3] http:/ / dmoz. org/ World/ Espa%c3%b1ol/ Computadoras/ Programaci%c3%b3n/ Lenguajes/ Ada/ [4] http:/ / www. canalada. org/ [5] http:/ / yosoyubik. wordpress. com/ 2007/ 03/ 28/ compilar-codigo-ada-en-mac-os-x/ [6] http:/ / www. utm. mx/ ~jvasquez/ ada/ index. htm [7] http:/ / www. adaic. org/ [8] http:/ / www. adapower. com [9] http:/ / www. ada-europe. org [10] http:/ / dmoz. org/ Computers/ Programming/ Languages/ Ada/

Lisp

71

Lisp
Lisp Informacin general Paradigma Apareci en Diseado por Tipo de dato multiparadigma: orientado a objetos, funcional, declarativo 1958 John McCarthy fuerte, dinmico

Implementaciones mltiples Dialectos Ha influido a Common Lisp, Scheme, Emacs Lisp Smalltalk, CLOS, Dylan, Perl

El Lisp (o LISP) es una familia de lenguajes de programacin de computadora de tipo multiparadigma con una larga historia y una sintaxis completamente entre parntesis. Especificado originalmente en 1958 por John McCarthy y sus colaboradores en el Instituto Tecnolgico de Massachusetts, el Lisp es el segundo ms viejo lenguaje de programacin de alto nivel de extenso uso hoy en da; solamente el FORTRAN es ms viejo. Al igual que el FORTRAN, el Lisp ha cambiado mucho desde sus comienzos, y han existido un nmero de dialectos en su historia. Hoy, los dialectos Lisp de propsito general ms ampliamente conocidos son el Common Lisp y el Scheme. El Lisp fue creado originalmente como una notacin matemtica prctica para los programas de computadora, basada en el clculo lambda de Alonzo Church. Se convirti rpidamente en el lenguaje de programacin favorito en la investigacin de la inteligencia artificial (AI). Como uno de los primeros lenguajes de programacin, el Lisp fue pionero en muchas ideas en ciencias de la computacin, incluyendo las estructuras de datos de rbol, el manejo de almacenamiento automtico, tipos dinmicos, y el compilador auto contenido. El nombre LISP deriva del "LISt Processing" (Proceso de LIStas). Las listas encadenadas son una de las estructuras de datos importantes del Lisp, y el cdigo fuente del Lisp en s mismo est compuesto de listas. Como resultado, los programas de Lisp pueden manipular el cdigo fuente como una estructura de datos, dando lugar a los macro sistemas que permiten a los programadores crear una nueva sintaxis de lenguajes de programacin de dominio especfico empotrados en el Lisp. La intercambiabilidad del cdigo y los datos tambin da a Lisp su instantneamente reconocible sintaxis. Todo el cdigo del programa es escrito como expresiones S, o listas entre parntesis. Una llamada de funcin o una forma sintctica es escrita como una lista, con la funcin o el nombre del operador en primer lugar, y los argumentos a continuacin; por ejemplo, una funcin f que toma tres argumentos puede ser llamada usando (f x y z).

Historia
El Lisp fue inventado por John McCarthy en 1958 mientras estaba en el Instituto Tecnolgico de Massachusetts (MIT). McCarthy public su diseo en 1960 en un artculo de Communications of the ACM titulado "funciones recursivas de expresiones simblicas y su cmputo por la mquina, parte I"[1] (la "parte II" nunca fue publicada). All mostr que con algunos operadores simples y una notacin para las funciones, uno puede construir un lenguaje turing completo para los algoritmos. Desde 1955 1956, el Information Processing Language fue el primer lenguaje de AI, y ya haba incluido muchos de los conceptos, tales como proceso por lista y recursin, que vinieron a ser usados en el Lisp. La notacin original de McCarthy usaba "expresiones M" en corchetes que seran traducidas a expresiones S. Como un ejemplo, la expresin M car[cons[A,B]] es equivalente a la expresin S (car (cons A B)). Una vez

Lisp el Lisp fue implementado, los programadores rpidamente eligieron usar expresiones S, y las expresiones M fueron abandonadas. las expresiones M emergieron otra vez con los intentos efmeros del MLISP[2] de Horace Enea y el CGOL de Vaughan Pratt. El Lisp fue implementado primero por Steve Russel en un computador IBM 704. Russell haba ledo el artculo de McCarthy, y se dio cuenta (para la sorpresa de McCarthy) que la funcin eval del Lisp poda ser implementada en cdigo de mquina.[3] El resultado fue un intrprete de Lisp funcional que poda ser usado para correr programas Lisp, o ms correctamente, "evaluar expresiones Lisp". Dos rutinas de lenguaje ensamblador para el IBM 704 se convirtieron en las operaciones primitivas para descomponer listas: car (contenido del registro de direccin) y cdr (contenido del registro del decremento). Los dialectos del Lisp todava usan el car y cdr (pronunciado /kr/ y /kdr/) para las operaciones que retornan el primer elemento y el resto de la lista respectivamente. El primer compilador completo de Lisp, escrito en Lisp, fue implementado en 1962 por Tim Hart y Mike Levin en el MIT.[4] Este compilador introdujo el modelo Lisp de compilacin incremental, en el cual las funciones compiladas e interpretadas pueden entremezclarse libremente. El lenguaje en los memos de Hart y Levin es mucho ms cercano al estilo moderno del Lisp que el anterior cdigo de McCarthy.

72

Genealoga y variantes
Sobre su historia de cincuenta aos, el Lisp ha producido muchas variaciones en el tema base de un lenguaje de expresin S. Por otra parte, cada dialecto dado puede tener varias implementaciones, por ejemplo, hay ms de una docena de implementaciones del Common Lisp. Las diferencias entre los dialectos pueden ser muy visibles, por ejemplo, el Common Lisp y el Scheme usan diferentes palabras clave para definir funciones. Dentro de un dialecto que est estandarizado, sin embargo, las implementaciones conformadas soportan el mismo lenguaje base, pero con diferentes extensiones y bibliotecas.

Relacin con la inteligencia artificial


Desde su inicio, el Lisp estaba estrechamente relacionado con la comunidad de investigacin de la inteligencia artificial, especialmente en sistemas PDP-10.[5] El Lisp fue usado como la implementacin del lenguaje de programacin Micro Planner que fue la fundacin para el famoso sistema de AI SHRDLU. En los aos 1970, a medida que la investigacin del AI engendr descendientes comerciales, el desempeo de los sistemas Lisp existentes se convirti en un problema creciente. El Lisp era un sistema difcil de implementar con las tcnicas de compilador y hardware comn de los aos 1970. Las rutinas de recoleccin de basura, desarrolladas por el entonces estudiante graduado del MIT, Daniel Edwards, hicieron prctico correr Lisp en sistemas de computacin de propsito general, pero la eficacia todava segua siendo un problema. Esto llev a la creacin de las mquinas Lisp: hardware dedicado para correr ambientes y programas Lisp. Avances tanto en el hardware de computadora como en la tecnologa de compiladores pronto hicieron obsoletas a las mquinas de Lisp, en detrimento del mercado del Lisp. Durante los aos 1980 y 1990, fue hecho un gran esfuerzo para unificar los numerosos dialectos del Lisp en un solo lenguaje (ms notablemente, InterLisp, Maclisp, ZetaLisp, MetaLisp, y Franz Lisp). El nuevo lenguaje, Common Lisp, fue esencialmente un subconjunto compatible de los dialectos que reemplaz. En 1994, la ANSI public el estndar del Common Lisp, "ANSI X3.226-1994 Information Technology Programming Language Common Lisp". En aquel momento el mercado mundial para el Lisp era mucho ms pequeo de lo que es hoy.[citarequerida]

Lisp

73

Desde el ao 2000
Habiendo declinado algo en los aos 1990, Lisp experiment un nuevo crecimiento de inters. La mayor parte de la nueva actividad est enfocada alrededor de las implementaciones de fuente abierta del Common Lisp, e incluye el desarrollo aplicaciones y de nuevas bibliotecas porttiles. Este inters puede ser medido en parte por las ventas de la versin impresa de Practical Common Lisp (Common Lisp Prctico) de Peter Seibel, un tutorial para nuevos programadores Lisp publicado en 2004,[6] que estuvo brevemente en Amazon.com como el segundo libro de programacin ms popular. El libro es accesible en lnea sin costo.[7] Muchos nuevos programadores Lisp fueron inspirados por escritores como Paul Graham y Eric S. Raymond luchando por un lenguaje que otros consideran anticuado. Los nuevos programadores de Lisp frecuentemente describen el lenguaje como una experiencia que abre los ojos y una aclamacin de ser substancialmente ms productivo que otros lenguajes.[8] Este aumento de conciencia puede ser contrastado con el "invierno de la inteligencia artificial" y el breve crecimiento del Lisp a mediados de los 1990.[9] En su encuesta de las implementaciones del Common Lisp, Dan Weinreb lista once implementaciones activamente mantenidas. Scieneer Common Lisp es una nueva implementacin comercial que bifurc (fork) del CMUCL con un primer lanzamiento en 2002. La comunidad de la fuente abierta ha creado la nueva infraestructura de soporte: Cliki es un Wiki que recoge la informacin relacionada con el Common Lisp, el Common Lisp directory [10] lista recursos, el #lisp es un canal popular de IRC (con soporte por un Bot escrito en Lisp), lisppaste [11] soporta la distribucin y el intercambio y comentario de retazos de cdigo (snippets), el Planet Lisp [12] recoge el contenido de varios blogs relacionados con el Lisp, en el LispForum [13] el usuario discute tpicos sobre Lisp, Lispjobs [14] es un servicio para anunciar ofertas de trabajo y hay un nuevo servicio de noticias semanales (Weekly Lisp News [15]). Han sido celebrados los 50 aos del Lisp (1958-2008) en LISP50@OOPSLA [16]. Hay varias reuniones de usuario locales regulares (Boston, Vancouver, Hamburg [17],), Reuniones Lisp (European Common Lisp Meeting [18], European Lisp Symposium [19]) y una International Lisp Conference [20]. La comunidad Scheme mantiene activamente ms de veinte implementaciones. Se han desarrollado en los ltimos aos varias significativas nuevas implementaciones (Chicken, Gauche, Ikarus, Larceny, Ypsilon). El estndar de Scheme Revised5 Report on the Algorithmic Language Scheme [21] fue ampliamente aceptado en la comunidad del Scheme. El proceso Scheme Requests for Implementation ha creado muchas bibliotecas y extensiones casi estndares para el Scheme. Las comunidades de usuario de implementaciones individuales del Scheme continan creciendo. En 2003 un nuevo proceso de estandarizacin del lenguaje fue comenzada y condujo al estndar R6RS del Scheme en 2007. El uso acadmico del Scheme para ensear ciencias de la computacin parece haber declinado algo. Algunas universidades ya no estn usando Scheme en sus cursos preliminares de ciencias de la computacin. Hay tambin algunos nuevos dialectos Lisp. Notablemente: Newlisp (un lenguaje de scripting), Arc (desarrollado por Paul Graham) y recientemente Clojure (desarrollado por Rich Hickey) y NU para la programacin con Cocoa de Apple.

Dialectos importantes
Los dos principales dialectos del Lisp usados para la programacin de propsitos generales hoy en da son Common Lisp y Scheme. Estos lenguajes representan opciones de diseo significativamente diferentes. El Common Lisp, descendiente principalmente de MacLisp, Interlisp, y Lisp Machine Lisp, es un superconjunto ampliado de los primeros dialectos del Lisp, con un estndar de lenguaje grande incluyendo muchos tipos de datos y formas sintcticas incorporados, as como un sistema del objeto. El Scheme es un diseo ms minimalista, con un mucho ms pequeo conjunto de caractersticas estndar pero con ciertas caractersticas de implementacin (tales como optimizacin de llamada de cola y continuacin completa) no encontradas necesariamente en Common Lisp. El Common Lisp tambin tom prestadas ciertas caractersticas de Scheme tales como mbito de lxico y clausura

Lisp lxica. El Scheme, es un dialecto del lenguaje Lisp con mbito esttico y cola recursiva autntica inventado por Guy Lewis Steele Jr. y Gerald Jay Sussman. Fue diseado para tener una semntica excepcionalmente clara y simple y pocas maneras diferentes de formar expresiones. Una amplia variedad de paradigmas programados encuentran una expresin conveniente en Scheme, incluyendo los estilos imperativo, funcional, y paso de mensajes. El Scheme contina evolucionando con una serie de los estndares (Revisedn Report on the Algorithmic Language Scheme) y una serie de Scheme Requests for Implementation. Adems, los dialectos del Lisp son usados como lenguajes de scripting en un nmero de aplicaciones, con los ms conocidos siendo el Emacs Lisp en el editor de Emacs, Visual Lisp en AutoCAD, Nyquist en Audacity.

74

Innovaciones del lenguaje


El Lisp fue el primer lenguaje de programacin homoicnico: la representacin primaria del cdigo del programa es el mismo tipo de estructura de la lista que tambin es usada para las principales estructuras de datos. Como resultado, las funciones del Lisp pueden ser manipuladas, alteradas o an creadas dentro de un programa Lisp sin un extensivo anlisis sintctico (parsing) o manipulacin de cdigo de mquina binario. Esto generalmente es considerado una de las ventajas primarias del lenguaje con respecto a su poder expresivo, y hace al lenguaje favorable a la evaluacin metacircular. La ubicua estructura IF THEN ELSE, ahora admitida como un elemento esencial de cualquier lenguaje de programacin, fue inventada por McCarthy para el uso en el Lisp, donde vio su primera apariencia en una forma ms general (la estructura cond). Fue heredada por el ALGOL, que la populariz. El Lisp influenci profundamente a Alan Kay, el lder de investigacin del Smalltalk, y entonces a su vez Lisp fue influenciado por Smalltalk, adoptando las caractersticas de la programacin orientada a objetos (clases, instancias, etc.) a finales de los aos 1970. En gran parte debido a sus requerimientos de recursos con respecto al temprano hardware computacional (incluyendo los primeros microprocesadores), el Lisp no se hizo tan popular fuera de la comunidad de AI, como lo fueron el FORTRAN y el descendiente del lenguaje ALGOL, el lenguaje C. Lenguajes ms nuevos como Java y Python han incorporado algunas versiones limitadas de algunas de las caractersticas del Lisp, pero no pueden necesariamente brindar la coherencia y la sinergia de los conceptos completos encontrados en el Lisp. Debido a su conveniencia para aplicaciones mal definidas, complejas, y dinmicas, el Lisp estn disfrutando actualmente de un cierto resurgimiento del inters popular.

Listas
El elemento fundamental en Lisp es la lista, en el sentido ms amplio del trmino, pues tanto los datos como los programas son listas. De ah viene su nombre, pues Lisp es un acrnimo de "LIStProcessing". Las listas en LISP estn delimitadas por parntesis. De aqu viene el chiste del significado de LISP: "LostInStupidParentheses" que aunque con buen humor es completamente ficticio. Algunas de las funciones predefinidas de Lisp tienen smbolos familiares (+ para la suma, * para el producto), pero otras son ms exticas, especialmente dos que sirven precisamente para manipular listas, descomponindolas en sus componentes. Sus nombres ("car" y "cdr") son un poco extraos, reliquias de tiempos pasados y de la estructura de los ordenadores de segunda generacin, "car" devuelve la cabeza de una lista y "cdr" su cola o resto. Lisp sigue una filosofa de tratamiento no-destructivo de los parmetros, de modo que la mayora de las funciones devuelven una lista resultado de efectuar alguna transformacin sobre la que recibieron, pero sin alterar esta ltima. Uno de los motivos por los que Lisp es especialmente adecuado para la IA es el hecho de que el cdigo y los datos tengan el mismo tratamiento (como listas); esto hace especialmente sencillo escribir programas capaces de escribir

Lisp otros programas segn las circunstancias. Lisp fue uno de los primeros lenguajes de programacin en incluir manejo de excepciones con las primitivas catch y throw. Derivado del Lisp es el lenguaje de programacin Logo. Sin entrar en detalles, podra decirse que Logo es Lisp sin parntesis y con operadores aritmticos infijos.

75

Orgenes de "car" y "cdr"


- car: Content of Address part of Register - cdr: Content of Decremental part of Register Son operaciones del juego de instrucciones del IBM 704

Ejemplos
Hola mundo
(format t "Hola, mundo!") Trabajando con listas ******************************************************************* Definicin de la funcin: (defun vacia (l) (cond ((null l) 1) (t 0))) Llamada a la funcin: (vacia '(1 3 4)) ; La lista no esta vacia, devolvera 0 (vacia '()) ; La lista esta vacia, devolvera 1 ******************************************************************* (defun ltimo (lista) (cond ((null (cdr lista)) (car lista)) (t (ltimo (cdr lista))))) (ltimo '(1 2 3 4 5 6 7)) ; devuelve el ltimo de la lista: 7

; si la lista esta vacia devuelve 1 ; en otro caso (lista llena) devuelve 0

******************************************************************* ; ---FACTORIAL---;Definicin matemtica ; Factorial(x) = 1 si x=0 caso base ; x*factorial(x-1) si x>0 caso recursivo ;Funcin factorial hecha con recursividad no final (defun factorial (n) (if (= 0 n)

Lisp 1 (* n (factorial (- n 1))))) (factorial 4) ; caso base ; caso recursivo

76

;esto nos devolvera 24=4*3*2*1

*******************************************************************

Grandes valores de la Funcin de Ackermann


;Propuesta por Nikolai Coica (defun ackermann (m n) "The Ackermann Function" (cond ((= m 0) (+ n 1)) ((= m 1) (+ n 2)) ((= m 2) (+ 3 (* n 2))) ((= m 3) (+ 5 (* 8 (- (expt 2 n) 1)))) (t (cond ((= n 0) (ackermann (- m 1) 1)) (t (ackermann (- m 1) (ackermann m (- n 1))))))))

Referencias
[1] John McCarthy. Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I (http:/ / www-formal. stanford. edu/ jmc/ recursive. html). Consultado el 13-10-2006. [2] David Canfield Smith. MLISP Users Manual (http:/ / community. computerhistory. org/ scc/ projects/ LISP/ stanford/ Smith-MLISP-AIM-84. pdf). Consultado el 13-10-2006. [3] According to what reported by Paul Graham in Hackers & Painters, p. 185, McCarthy said: "Steve Russell said, look, why don't I program this eval..., and I said to him, ho, ho, you're confusing theory with practice, this eval is intended for reading, not for computing. But he went ahead and did it. That is, he compiled the eval in my paper into IBM 704 machine code, fixing bug, and then advertised this as a Lisp interpreter, which it certainly was. So at that point Lisp had essentially the form that it has today..." [4] Tim Hart and Mike Levin. AI Memo 39-The new compiler (ftp:/ / publications. ai. mit. edu/ ai-publications/ pdf/ AIM-039. pdf). Consultado el 13-10-2006. [5] The 36-bit word size of the PDP-6/PDP-10 was influenced by the usefulness of having two Lisp 18-bit pointers in a single word. Lum Johnson. The History of TOPS or Life in the Fast ACs (http:/ / groups. google. com/ group/ alt. folklore. computers/ browse_thread/ thread/ 6e5602ce733d0ec/ 17597705ae289112), 18 de octubre de 1990.The PDP-6 project started in early 1963, as a 24-bit machine. It grew to 36 bits for LISP, a design goal. [6] Practical Common Lisp going into 3rd printing (http:/ / gigamonkeys. com/ blog/ 2007/ 05/ 26/ pcl-third-printing. html) [7] Practical Common Lisp (http:/ / gigamonkeys. com/ book/ ) [8] The Road To Lisp Survey (http:/ / wiki. alu. org/ The_Road_To_Lisp_Survey). Consultado el 13-10-2006. [9] Trends for the Future (http:/ / www. faqs. org/ docs/ artu/ ch14s05. html) [10] http:/ / www. cl-user. net/ [11] http:/ / paste. lisp. org/ [12] http:/ / planet. lisp. org/ [13] http:/ / www. lispforum. com/ [14] http:/ / lispjobs. wordpress. com/ [15] http:/ / lispnews. wordpress. com/ [16] http:/ / www. lisp50. org/ [17] http:/ / lisp-hh. de/ wiki/ Stammtisch [18] http:/ / www. weitz. de/ eclm2009/ [19] http:/ / european-lisp-symposium. org/ , [20] http:/ / www. international-lisp-conference. org/ [21] http:/ / www. schemers. org/ Documents/ Standards/ R5RS/

Lisp

77

Enlaces externos
Wikilibros Wikilibros alberga un libro o manual sobre Programacin en LISP. Features of Common Lisp (http://abhishek.geek.nz/docs/features-of-common-lisp) Una discusin de algunas de las caractersticas ms sobresalientes del lenguaje. Desarrollo de Software en LISP (http://www.gruposyahoo.com/group/DesarrolloLISP) Comunidad virtual para el intercambio de informacin en castellano sobre desarrollo de software en LISP para profesionales practicantes, docentes y estudiantes. Recursos Lisp en espaol (http://gnu.manticore.es) Textos en espaol y traducciones sobre Lisp, Common Lisp, Emacs Lisp, etc. www.cliki.net (http://www.cliki.net) CLiki, el wiki de common lisp Generar pginas dinmicamente con Lisp y Apache (http://lists.debian.org/debian-user-spanish/2005/07/ msg00126.html), artculo de Rober Morales La expansin decimal de A(4,2) (http://www.kosara.net/thoughts/ackermann42.html) Practical Common Lisp (http://www.gigamonkeys.com/book/) Libro introductorio de Common Lisp. Versin on-line y distribuible por la propia editorial.

Aplicaciones en Lisp
Entre las ms exitosas aplicaciones escritas en Lisp se pueden mencionar: Emacs, el editor de texto http://www.gnu.org/software/emacs/emacs.html ACL2, el demostrador de teoremas http://www.cs.utexas.edu/users/moore/acl2/ Maxima, el sistema de lgebra computacional http://maxima.sourceforge.net/

Compiladores de Lisp
GNU Common Lisp (http://www.gnu.org/software/gcl/gcl.html), software libre Allegro Common Lisp (http://www.franz.com/), software propietario CMU Common Lisp (http://www.cons.org/cmucl/), software libre CLISP, Una implementacin de Common Lisp, software libre OpenMCL (http://openmcl.clozure.com/) Common lisp para Macintosh, software libre Steel Bank Common Lisp (http://sbcl.sourceforge.net/), creado a partir de CMU Common Lisp, es un software libre con nfasis en proveer facilidades para su mantenimiento.

Pascal (lenguaje de programacin)

78

Pascal (lenguaje de programacin)


Pascal Informacin general Paradigma Apareci en Diseado por imperativo (estructurado) 1970 Niklaus Wirth

Implementaciones Mltiples Dialectos Influido por Ha influido a UCSD, Borland, Turbo Algol Modula-2, Oberon, Component Pascal, Ada, Object Pascal, Embarcadero Delphi, Java, Oxygene

Pascal es un lenguaje de programacin desarrollado por el profesor suizo Niklaus Wirth entre los aos 1968 y 1969 y publicado en 1970. Su objetivo era crear un lenguaje que facilitara el aprendizaje de programacin a sus alumnos, utilizando la programacin estructurada y estructuracin de datos. Sin embargo con el tiempo su utilizacin excedi el mbito acadmico para convertirse en una herramienta para la creacin de aplicaciones de todo tipo. Pascal se caracteriza por ser un lenguaje de programacin estructurado fuertemente topificado. Esto implica que: 1. El cdigo est dividido en porciones fcilmente legibles llamadas funciones o procedimientos. De esta forma Pascal facilita la utilizacin de la programacin estructurada en oposicin al antiguo estilo de programacin monoltica. 2. El tipo de dato de todas las variables debe ser declarado previamente para que su uso quede habilitado. El nombre de Pascal fue escogido en honor al matemtico Blaise Pascal.

Caractersticas nicas
Otra diferencia importante es que en Pascal, el tipo de una variable se fija en su definicin; la asignacin a variables de valores de tipo incompatible no estn autorizadas (en C, en cambio, el compilador hace el mejor esfuerzo para dar una interpretacin a casi todo tipo de asignaciones). Esto previene errores comunes donde variables son usadas incorrectamente porque el tipo es desconocido; y tambin evita la necesidad de notacin hngara, que vienen a ser prefijos que se aaden a los nombres de las variables y que indican su tipo.

Implementaciones
Las primeras versiones del compilador de Pascal, entre ellas la ms distribuida fue UCSD Pascal, traducan el lenguaje en cdigo para una mquina virtual llamada mquina-P. La gran ventaja de este enfoque es que para tener un compilador de Pascal en una nueva arquitectura de mquina solo haca falta reimplementar la mquina-P. Como consecuencia de esto, solo una pequea parte del intrprete tena que ser reescrita hacia muchas arquitecturas. En los aos 1980, Anders Hejlsberg escribi el compilador Blue Label Pascal para la Nascom-2. Ms tarde fue a trabajar para Borland y reescribi su compilador que se convirti en Turbo Pascal para la IBM PC. Este nuevo compilador se vendi por $49, un precio orientado a la distribucin masiva. El econmico compilador de Borland tuvo una larga influencia en la comunidad de Pascal que comenz a utilizarlo principalmente en el IBM PC. En busca de un lenguaje estructurado muchos aficionados al PC reemplazaron el BASIC por este producto. Dado que Turbo Pascal slo estaba disponible para una arquitectura, traduca directamente hacia el cdigo mquina del Intel 8088, logrando construir programas que se ejecutaban mucho ms rpidamente que los producidos en los esquemas interpretados.

Pascal (lenguaje de programacin) Durante los aos 1990, estuvo disponible la tecnologa para construir compiladores que pudieran producir cdigo para diferentes arquitecturas de hardware. Esto permiti que los compiladores de Pascal tradujeran directamente al cdigo de la arquitectura en que corre Con Turbo Pascal versin 5.5, Borland agreg programacin orientada a objetos a Pascal. Sin embargo, Borland despus decidi mejorar esa extensin del lenguaje introduciendo su producto Delphi, diseado a partir de estndar Object Pascal, propuesto por Apple como base. Borland tambin lo llam Object Pascal en las primeras versiones, pero cambi el nombre a 'lenguaje de programacin Delphi' en sus ltimas versiones.

79

Ejemplos
Raz cuadrada
program raiz(input, output); uses wincrt; (*Obtener la raz cuadrada de un nmero real x cualquiera.*) var x, y: real; respuesta: string; begin writeln('** Calcular la raz cuadrada de 12 **'); writeln('Entrar x (> 0): '); readln(x); y := sqrt(abs(x)); (* Raz cuadrada del valor absoluto de x para evitar races imaginarias *) writeln; if (x<0) then (* Si x es negativo, el resultado se notifica como imaginario *) writeln('La raz cuadrada de ', x, ' es el nmero imaginario ', y,'i') else writeln('La raz cuadrada de ', x:1:2, ' es ', y:1:2); writeln; writeln('** Fin **'); end.

Suma

program suma; uses crt;

var x,s,r:integer;

begin

clrscr;

writeln('Ingrese un numero');

readln(x);

Pascal (lenguaje de programacin)


writeln('Ingrese otro numero');

80

readln(s);

r:=x+s;

writeln('la suma es:

',r);

readln;

end.

Multiples program multi; {$APPTYPE CONSOLE} uses SysUtils; var n,x:integer;

begin x:=0; writeln('Entra un numero de la serie'); readln(n); while n<>0 do begin if (n mod 3)=0 then begin x:=x+1; writeln('Dame otro numero'); readln(n); end else begin writeln ('Dame otro numero'); readln(n); end; end; writeln ('El numero de multiples de 3 es',x); end. Exponenciacin Program Exponeciacion; Uses Crt,Dos; Var a,b,c,i:Integer; Begin ClrScr;

Pascal (lenguaje de programacin) Write('Base: '); ReadLn(a); Write('Exponente: '); ReadLn(b); c:=1; For i:=1 To b Do Begin c:=c*a; End; WriteLn(''); Write('Resultado: ',c); ReadKey; End.

81

Compiladores disponibles pblicamente


Varios compiladores de Pascal estn disponibles para el uso del pblico en general: Epox Compilador GNU Pascal (GPC), escrito en C, basado en GNU Compiler Collection (GCC). Se distribuye bajo licencia GPL. Free Pascal est escrito en Pascal (el compilador est creado usando Free Pascal), es un compilador estable y potente. Tambin distribuido libremente bajo la licencia GPL. Este sistema permite mezclar cdigo Turbo Pascal con cdigo Delphi, y soporta muchas plataformas y sistemas operativos. Turbo Pascal fue el compilador Pascal dominante para PC durante los aos 1980 y hasta principios de los aos 1990, muy popular debido a sus magnficas extensiones y tiempos de compilacin sumamente cortos. Actualmente, versiones viejas de Turbo Pascal (hasta la 7.0) estn disponibles para descargarlo gratuito desde el sitio de Borland (es necesario registrarse). Delphi es un producto tipo RAD (Rapid Application Development) de Borland. Utiliza el lenguaje de programacin Delphi, descendiente de Pascal, para crear aplicaciones para la plataforma Windows. Las ltimas versiones soportan compilacin en la plataforma .NET. Kylix fue una versin de Delphi para el sistema operativo Linux promovida por la antigua Borland reiterando la rama de Pascal de sus productos. Como descendiente de Delphi cuanta con una librera de objetos mejorada llamada denominada CLX, que es la versin para Linux de la VCL. Sin embargo el proyecto ya se haba descontinuado mucho antes de que Borland vendiera todos sus productos de desarrollo a Embarcadero Technologies, actual dueo de Delphi. Lazarus es un clon de Delphi, basado en Free Pascal es software libre. MidletPascal para la plataforma J2ME. TMT. Pascal.

Pascal (lenguaje de programacin)

82

Actualidad
Hoy en da se siguen usando programas como turbo pascal para ensear en escuelas de computacin.[citarequerida]

Enlaces externos
Wikiversidad alberga proyectos de aprendizaje sobre Pascal (lenguaje de programacin).Wikiversidad Desarrollo de Software en Pascal [1] Comunidad virtual para el intercambio de informacin en castellano sobre desarrollo de software en Pascal para profesionales practicantes, docentes y estudiantes. Museo de Borland, permite la descarga gratuita de software antiguo [2] Essential Pascal [3] Turbo-Pascal.com [4] Curso de Turbo Pascal de Carlos Pes [5] Curso de Pascal enfocado a Free Pascal y Lazarus [6]. Incluye Object Pascal, temas avanzados y foro con dudas. FreePascal [7] El compilador libre de pascal multiplataforma.

Referencias
[1] http:/ / www. gruposyahoo. com/ group/ DesarrolloPascal [2] [3] [4] [5] [6] [7] http:/ / bdn. borland. com/ museum/ http:/ / www. marcocantu. com/ epascal/ Spanish/ ch01hist. htm http:/ / www. turbo-pascal. com http:/ / www. carlospes. com/ curso_de_pascal/ http:/ / aprendepascal. wikidot. com/ http:/ / www. freepascal. org/

Sobrecarga
En programacin orientada a objetos la sobrecarga se refiere a la posibilidad de tener dos o ms funciones con el mismo nombre pero funcionalidad diferente. Es decir, dos o ms funciones con el mismo nombre realizan acciones diferentes. El compilador usar una u otra dependiendo de los parmetros usados. A esto se llama tambin sobrecarga de funciones. Tambin existe la sobrecarga de operadores que al igual que con la sobrecarga de funciones se le da ms de una implementacin a un operador. Sobrecarga es la capacidad de un lenguaje de programacin, que permite nombrar con el mismo identificador diferentes variables u operaciones. El mismo mtodo dentro de una clase permite hacer cosas distintas en funcin de los parmetros. Java no permite al programador implementar sus propios operadores sobrecargados, pero s utilizar los predefinidos como el +. C++, por el contrario si permite hacerlo.

Sobrecarga

83

Sobrecarga de mtodos
Algunos mtodos en una clase pueden tener el mismo nombre. Estos mtodos deben contar con diferentes argumentos. El compilador decide qu mtodo invocar comparando los argumentos. Se generara un error si los mtodos slo varan en el tipo de retorno. Ejemplo Articulo.java public class Articulo { private float precio; public void setPrecio() { precio = 3.50; } public void setPrecio(float nuevoPrecio) { precio = nuevoPrecio; } } Ej: Tenemos un mtodo que soporta varios tipos de parmetros, entonces cuando hacemos uso de este, lo que hace el compilador es buscar el que posee ese tipo de parmetros Color (int r, int g, int b) Color (float a, float b, float c) //-------------------------------------------//r,g,b (son valores enteros entre 0 y 255) //a,b,c (son valores flotantes entre 0.0 y 1.0) Entonces cuando hacemos un llamado a este mtodo (en este caso seria un constructor), el compilador hace referencia al tipo de parmetros. La sobrecarga seria redefinir cualquiera de estos mtodos utilizando los mismos parmetros pero para un proceso distinto.

Object Pascal

84

Object Pascal
Object Pascal es una evolucin del lenguaje de programacin Pascal, con inclusin de elementos pertenecientes al paradigma de la programacin orientada a objetos. Algunos de los compiladores que soportan este lenguaje son: Delphi Free Pascal Kylix

Fuentes y contribuyentes del artculo

85

Fuentes y contribuyentes del artculo


Programacin orientada a objetos Fuente: http://es.wikipedia.org/w/index.php?oldid=54922522 Contribuyentes: Abajo estaba el pez, Airunp, Akira 999, Aleator, Alejolp, Alhen, Alvaro qc, Andre Engels, Andreasmperu, Angel GN, Angus, Anonimato1990, Anthemfor182, Antur, Ascnder, AstroNomo, Barcex, Biasoli, Bitman28, Byj2000, Camilo, Caravena, Carmin, Carocbax, Carok, Chfiguer, Comae, Cosmox, Cratn, Crescent Moon, David0811, Dem, Developer, Diegusjaimes, Dj Merlin, Dodo, Dreitmen, ESTEBAN ESPINOZA, Edgar, Edmenb, Eduardosalg, Edwardcetera, Egaida, El Padrino, El mago de la Wiki, Elwikipedista, Emiduronte, Erfil, FJJW, Farisori, Foundling, Funflin, Furti, GermanX, HUB, Hprmedina, Humberto, Icvav, Identy, Ing moi, Isha, Ivan.Romero, J053d, JMPerez, JavierCantero, Jecanre, Jesuja, Jkbw, Jmvkrecords, JoaquinFerrero, Josuemb, Jstitch, Kavanagh, Kved, Lasneyx, Lentucky, Leonardo Tadei, Leonpolanco, Locos epraix, Lopezpablo 87, Maaksz2, MadriCR, Mahadeva, Manawo, Mansoncc, ManuelGR, Manw, MarcoAurelio, Mariano12 1989, Marsal20, Matdrodes, MatiasBellone, Milyka, Moriel, Mpeinadopa, Muro de Aguas, Murven, Nesita02, Netito777, Nicop, Niqueco, Nulain, Otermin, Otherox, Pablo323, PabloCastellano, Pan con queso, Pedro Felipe, Pedrovicenterosero, Penavarro09, Penguino, Poco a poco, Prision3ro, Plux, Queninosta, Raul2010, Raulshc, Raymonddoyle, Rosarino, Sauron, SergioVares, Serser, Sirpuppet, Soynatan, Spc, Spirit-Black-Wikipedista, SuperBraulio13, SuperJoe, Superbenja, Superzerocool, Tano4595, Technopat, Tirithel, Tomatejc, Tonchizerodos, Tosin2627, Tute, Txo, Vitamine, Vivero, Vubo, Wilfredor, Wrdhat, X.Cyclop, Xsm34, Yeza, ZeruGiran, conversion script, host-200-76-49-134.block.alestra.net.mx, l, 686 ediciones annimas Paradigma de programacin Fuente: http://es.wikipedia.org/w/index.php?oldid=54372900 Contribuyentes: -jem-, Adryitan, Alex ay18, Ascnder, Calsbert, Chfiguer, ColdWind, Dajoropo, Diegusjaimes, Dodo, Eduardosalg, Emonnott, Epnob, Especiales, GermanX, Heliocrono, Hprmedina, Humberto, Igna, JavierCantero, Jcaraballo, Jecanre, Jesuja, Jkbw, JoaquinFerrero, Jonpagecr, Jotagese, Juan Mayordomo, Libelula, ManuelGR, MarcoAurelio, MiguelRdz, Moriel, Msluis44, Nulain, Sabbut, Sauron, Soniautn, SuperBraulio13, Tigerfenix, Xerox 5B, Youssefsan, 87 ediciones annimas Objeto (programacin) Fuente: http://es.wikipedia.org/w/index.php?oldid=51996412 Contribuyentes: Achata, Adryitan, Auledas, Aipni-Lovrij, Diegusjaimes, Dodo, Ejmeza, Elabra sanchez, Farisori, Federico1984, Fsd141, Hprmedina, Informatico25, JavierCantero, Jesuja, Jkbw, Jose figueredo, Juan Mayordomo, KLosma, Ksarasola, Laura Fiorucci, Lucien leGrey, Marsal20, MatiasBellone, Nebulha, Otermin, Piztu, Santhy, Savh, Shooke, Tano4595, Tirithel, Utolotu, Wikilptico, 75 ediciones annimas Herencia (informtica) Fuente: http://es.wikipedia.org/w/index.php?oldid=54422708 Contribuyentes: Altenberg, AlumnoPedroPOOUEM, Ayyavazhi, Baiji, Beto29, Dangelin5, Diegusjaimes, Digigalos, Dodo, Ermey, Fbarg, GermanX, Gm fox, Isha, J.M.Domingo, JavierCantero, Jcaraballo, Jcvp, Jesuja, Jkbw, Kved, Leonpolanco, ManuelGR, Manw, Matdrodes, Mirkovich, Muro de Aguas, Netito777, Nicop, Oscar ., Pino, Poco a poco, Plux, Ronnyaveiropy, Sanbec, Taichi, Template namespace initialisation script, Thanos, Toniher, Un Mercenario, Vubo, Yakoo, 143 ediciones annimas Abstraccin (informtica) Fuente: http://es.wikipedia.org/w/index.php?oldid=54654743 Contribuyentes: Al Lemos, Arwing, Bazookao, BlackBeast, Cyborg ar, Diegusjaimes, Enrique r25, FAR, Fadesga, GermanX, Halfdrag, Hildergarn, JavierCantero, Jesuja, Jstitch, Lluvia, Lucien leGrey, Matdrodes, Netito777, Nulain, Poco a poco, Rigadoun, Sabbut, Sanbec, Savh, Soulreaper, Spangineer, Superzerocool, Template namespace initialisation script, Tirithel, Vanbasten 23, Vatelys, Vitamine, Yrithinnd, 47 ediciones annimas Polimorfismo (informtica) Fuente: http://es.wikipedia.org/w/index.php?oldid=54723566 Contribuyentes: Alexav8, Alexisabarca, AlumnoRodrigoPOOUEM, BuenaGente, Caliver, Crescent Moon, Dagavi, David0811, Diegusjaimes, Dodo, Fbarg, Humberto, Identy, Isha, JavierCantero, Jesuja, Jkbw, JorgeGG, Kved, Maldoror, ManuelGR, Manw, MarcoAurelio, MatiasBellone, Nubecosmica, Otermin, Paradanta, Patricio.lorente, Petronas, Poco a poco, Plux, Rdb19871987, Rizziac, RoyFocker, Rubenalcala, Saloca, Template namespace initialisation script, Thanos, 99 ediciones annimas Encapsulamiento (informtica) Fuente: http://es.wikipedia.org/w/index.php?oldid=54723263 Contribuyentes: Banfield, Cyborg ar, Diegojserrano, Diegusjaimes, Driverco, Farisori, Hispa, Humberto, Jcsoriap, Jecanre, Jesuja, Kved, Leopupy, Lobillo, Poco a poco, Rumpelstiltskin, SPZ, Taichi, Vivero, 64 ediciones annimas Mtodo (informtica) Fuente: http://es.wikipedia.org/w/index.php?oldid=54785277 Contribuyentes: Alvaro qc, Angus, BiT, Biasoli, Camilo, Eduardosalg, Elabra sanchez, Especiales, Gtorres, JavierCantero, Jkbw, Magister Mathematicae, Matdrodes, MatiasBellone, Nicop, Poco a poco, Resped, Serser, Stickel, Tano4595, 39 ediciones annimas Programacin estructurada Fuente: http://es.wikipedia.org/w/index.php?oldid=54874035 Contribuyentes: -jem-, 200.24.92.xxx, 200.81.64.xxx, Antur, Banfield, Cronos x, Damian cf, Diegusjaimes, Dnu72, Efeg, Elabra sanchez, Electrodan, Enramos, Erfil, Ezarate, Fsd141, GermanC, GermanX, Haitike, Jair Moreno, JamsJF, Javierito92, Jesuja, Jiptohej, Jkbw, JoaquinFerrero, LeinaD natipaC, Lmsilva, Magister Mathematicae, Maldoror, ManuelGR, Manw, Marcosaedro, Matdrodes, Mel 23, Moriel, Murven, Pieraco, Plux, SergioN, Shooke, Solde9, Tostadora, Wega, conversion script, 182 ediciones annimas Simula Fuente: http://es.wikipedia.org/w/index.php?oldid=53137172 Contribuyentes: 4lex, Cmgustavo, Gafotas, Igarcerant, Jkbw, ManuelGR, Palica, Platonides, RoyFocker, Sanbec, 23 ediciones annimas C++ Fuente: http://es.wikipedia.org/w/index.php?oldid=54759545 Contribuyentes: .Sergio, 6d23, A Vzquez O., A ver, A. B. 10, Abece, Adadon, Adept, Alejandrocaro35, Alejovivasp, Allan Javier Aguilar Castillo, Amgc56, Angus, Anonimato1990, Arlm1000, Arpabone, Ascnder, AstroNomo, BL, Banfield, Bedorlan, Belb, Beto29, Biasoli, BlackBeast, Calin99, Cally Berry, Caritdf, Carpem, Centeno, Clavec, ColdWind, Comae, Cristianrock2, Ctrl Z, Cyberdelic, D4gnu, Damifb, Danielba894, DarkSulivan, David0811, DiegoBM, Diegusjaimes, Dodo, Drever, Dusan, Edgar, Edgardo C, Edtruji, Eduardo Lima, Edub, Elwikipedista, Emiduronte, EnWILLYado, Ermey, FIAL NV JAIOVO JP;S J, Fernando.a.gomez.f, Fitoschido, FrancoGG, Francy lugo, Futbolero, Galandil, Gauss, George McFinnigan, GermanX, Ginta, Gonis, Grillitus, Gurulandio, HUB, Halfdrag, Hanzo86, Hispa, Hompis, Humberto, Hxxbin, Ia027, Icvav, Isha, Ivan rome, Ivancp, J....441111, JCCO, Jarisleif, Javier Carro, Jesuja, Jjvaca, Jkbw, JoC2011, JoaquinFerrero, JorgeGG, Joseagrc, Joseaperez, Josell2, Jstitch, Jucamo, KanTagoff, Kitalphar, Kona, LC0, Lasneyx, Laura Fiorucci, Levhita, Linkcisco, Locos epraix, LordAlfonso, LordT, Ludoviko, Macar, Maldoror, ManuelGR, Marc-Andr Abrock, Marioxcc, Marxto, Matdrodes, Maxvaz, Mcetina, Mortadelo2005, Muro de Aguas, Netito777, Neuron, Nicolapedia, Niqueco, Niuweme, Nonick, Numbo3, OMenda, Obazavil, Obelix83, Onzalo, Oscar ., Pablo.cl, PabloCastellano, Panchurret, Petronas, Piero71, Plux, RamiroGonzalezMaciel, SDaniel, Sacel, Sauron, Savh, Scmbg, Sebado, Shark-0106, Shooke, Skilltik, Skyhack, Snakeyes, Spyda72, Stoni, Superzerocool, Taichi, Technopat, Tirithel, Toad32767, Tomatejc, Tostadora, Tranchis, Triku, Tute, UA31, UnRar, Vargenau, Vcamacho, Vitamine, Wfox, White Master King, Wikante, X.Cyclop, Xoneca, Zam, Zcool, Zeioth, conversion script, 596 ediciones annimas C (lenguaje de programacin) Fuente: http://es.wikipedia.org/w/index.php?oldid=54929414 Contribuyentes: Achicoria, Acratta, Adryitan, Albert bug2, Alejandrocaro35, Aleposta, Alexquendi, Almorca, Andresrf123, Angelito7, Angus, Anonimato1990, Antonorsi, Antur, Arcibel, Argentumm, Arthur 'Two Sheds' Jackson, Ascnder, AstroNomo, Aipni-Lovrij, BL, Banfield, Biasoli, BuenaGente, Cad, Cahe, Carlos.motor, Carutsu, Cesar Jared, Chacas150, Comae, Damifb, Death Master, Dermot, Dhcp, Diegusjaimes, Dodo, Dorieo, Edgardo C, Edmenb, EduCas, Eduardo Lima, Edub, El mago de la Wiki, ElVaka, Especiales, Ezarate, Fcr, Fernandopcg, GASDEJAVA, Gaveho, GeorgeArthur, GermanX, Gothmog, Guevonaso, Gusgus, Hispa, House, IATG, Ignacio Icke, Interwiki, Ivan rome, J. A. Glvez, Javier Carro, Jcaraballo, Jesugut, Jesuja, Jileon, Joanfusan, JoaquinFerrero, Jorge c2010, JorgeGG, Jose alfredo vazquez mejia, Joseaperez, Jotego, Jstitch, Juan Mayordomo, JuanRodrguez, Jugones55, KnightRider, Krli2s, Lasneyx, Leonpolanco, Leugim1972, Linkedark, Lobillo, Locos epraix, LordT, Magister Mathematicae, Mahadeva, Mancku, ManuelGR, Manuelt15, Marco Regueira, MarcoAurelio, Mardolf, Mariano1989, Marioxcc, Martum, Matdrodes, MatiasBellone, Matutin, McMalamute, Mdiagom, Med, Microc, Miss Manzana, MorZilla, Moriel, Muimota, Nake, Netito777, Ni.cero, Nicoguaro, Niqueco, Nixn, NoeHernandez767, Numbo3, Ocaso, Oedipus, Oscar ., PabloCastellano, Pablomdo, Pablozing, Paquito150, Pccoronado, Pilaf, Platonides, Poco a poco, Porao, Programador, Plux, Qbit, Queres saber?, Qwertymith, Ramjar, Raulshc, Rdaneel, Resped, Robenauta, Rsg, RuLf, Ruben86, Sanbec, Sauron, Sebrev, Sergio Andres Segovia, Shooke, Snakeyes, Superzerocool, Surfaz, Swatnio, Tano4595, Technopat, Tigerfenix, Tintinando, Tirithel, Toad32767, Triku, Vitamine, Vyk2rr, Willtron, X.Cyclop, XD YO, Xmn1990, 406 ediciones annimas Interfaz grfica de usuario Fuente: http://es.wikipedia.org/w/index.php?oldid=54825705 Contribuyentes: Acratta, AlbertoDV, Alejandrozeballos, Alfa989, Amads, Antonorsi, Biasoli, Bufalo 1973, CarlosPSY, Carloswitt, Chr5, CommonsDelinker, Dejsoft, Diegusjaimes, Dodo, Egaida, Elwikipedista, Enric Naval, FedericoMP, Filipo, GermanX, Goliardo, Gusbelluwiki, Gussisaurio, Gustronico, Gtz, Hawking, Humberto, Isha, Ivanics, Jag2k4, Javierito92, Jesuja, Jjafjjaf, Jkbw, Jojolu, Jorge c2010, Jos Gnudista, Jurgens, Kimero, Kojie, Komputisto, Lazamazu, Leonpolanco, Leugim1972, Lucien leGrey, Machucho2007, Magister Mathematicae, Manuel Trujillo Berges, Matdrodes, Maty1206, Max Francesco, Migue1 ange1, MorZilla, Murphy era un optimista, Museo8bits, NaBUru38, Nerika, Netito777, Nicop, Nlandoni, Obelix83, Pablo323, Palica, Porao, Plux, Rastrojo, Real academia del gui, Ricky, Riggoperez, Sabbut, Saloca, Shooke, Sirpuppet, Snakefang, Snakeyes, Suisui, SuperBraulio13, Surfaz, Tano4595, Technopat, The worst user, Tomatejc, Trabajonacho, Ugly, Urbietorbi, VARGUX, Vitamine, ZrzlKing, 261 ediciones annimas Programacin dirigida por eventos Fuente: http://es.wikipedia.org/w/index.php?oldid=52206222 Contribuyentes: 199-LASP-X7.libre.retevision.es, AchedDamiman, Ascnder, Ayleen, Derlis py, Dgilperez, Diegusjaimes, Djiraan, Fanattiq, Farisori, GermanX, Humbefa, Jamierlend, Jkbw, Jorgelrm, KillerBlade, Manuelt15, Moriel, Myrecaba, Niqueco, Poc-oban, SuperBraulio13, Thorongil, Varrojo, Viento Turquesa, Zimio, conversion script, 48 ediciones annimas Ada (lenguaje de programacin) Fuente: http://es.wikipedia.org/w/index.php?oldid=54393498 Contribuyentes: Alejandro Matos, Ascnder, Bufalo 1973, CHV, DarkSulivan, Dianai, Dodo, Eatala, Ejmeza, Emijrp, Fxroland2, JMPerez, JorgeGG, Jsanchezes, Julie, Lobillo, Lupinoid, Mansoncc, ManuelGR, Marsal20, Matdrodes, MatiasBellone, Mdiagom, Moriel, Mortadelo2005, Nickel Spider, NotFound, Obelix83, Outisnn, Phe, Porao, Plux, Qbit, Quistnix, Robmen2, Rocastelo, Sanbec, Suruena, Template namespace initialisation script, Tortillovsky, Tute, Valadrem, Willtron, Xoneca, Zeroth, 60 ediciones annimas

Fuentes y contribuyentes del artculo


Lisp Fuente: http://es.wikipedia.org/w/index.php?oldid=54514955 Contribuyentes: -seb-, 80-26-139-67.uc.nombres.ttd.es, Akhram, AlfonsoERomero, Antur, Ascnder, Atreyu bbb, BrokenSegue, BuenaGente, Cfmli, DJ Nietzsche, Dianai, Dodo, Elwikipedista, Gaps96, GermanX, Isha, Jim88Argentina, Jjmarin, Jkbw, Jlmaque, JoaquinFerrero, Jonarock 2009, Josemiguel93, Juantequera, Kiwnix-dark, Locovich, Macar, ManuelGR, Moriel, Netsettler, Omerta-ve, Pablo.cl, Perseo512, Petronas, Sanbec, Sauron, Scostas, Sire, Sonett72, Tirithel, Tordek ar, Torkiv, Willtron, Yago AB, conversion script, 66 ediciones annimas Pascal (lenguaje de programacin) Fuente: http://es.wikipedia.org/w/index.php?oldid=54903171 Contribuyentes: Aimwiki, Albireo3000, Alexav8, Alhen, Angel GN, Angus, Aparejador, Arcibel, Ascnder, AstroNomo, Aipni-Lovrij, Barcex, Barteik, Biasoli, CHV, Camilo, ChristianH, Cookie, Developer, Diegusjaimes, Dodo, Drjackzon, Duuk-Tsarith, Edub, Erufailon, FAR, FBaena, Fernandopcg, Furti, GermanX, Giudicejesica, HUB, Hashar, Hprmedina, Humbefa, Ignacioerrico, Isha, Ivanics, Jakye gtz, Javierito92, Javuchi, Jkbw, Jorge c2010, Josmanbernal, Juan Mayordomo, Kasumin, Kved, Lamanada, Laura Fiorucci, Locos epraix, LordT, Lourdes Cardenal, Lucien leGrey, ManuelGR, Manw, Marsal20, Matdrodes, Maximoalberto, MetalMind, MorZilla, Moriel, Nachet70, Netito777, Orgullomoore, Patricio.lorente, Petronas, Platonides, Poc-oban, Prettytic, Programador, Plux, Roberpl, Rondador, RoyFocker, Samiam95124, Sebrev, Stuffy, SuperBraulio13, Tano4595, Technopat, Teo tez, Tonny logicc, Triku, Verdecito, Viejo15, Vitamine, Vitorres, XCesar, ZEOSWAV, Zorosandro, 324 ediciones annimas Sobrecarga Fuente: http://es.wikipedia.org/w/index.php?oldid=54893700 Contribuyentes: Achata, AlumnoGrupo4POOUEM, Damifb, Fabeirojorge, GermanX, Ignacio Icke, Javart, Jecanre, Josemariasaldana, Laura Fiorucci, Matdrodes, Mortadelo2005, Pieter, Yrithinnd, ZeruGiran, 28 ediciones annimas Object Pascal Fuente: http://es.wikipedia.org/w/index.php?oldid=52639784 Contribuyentes: GermanX, Gothmog, Locovich, Obelix83, Stuffy, Taichi, Yrithinnd, uo Martnez, 11 ediciones annimas

86

Fuentes de imagen, Licencias y contribuyentes

87

Fuentes de imagen, Licencias y contribuyentes


File:Polimorfismo-ES.svg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Polimorfismo-ES.svg Licencia: Creative Commons Attribution-Sharealike 3.0 Contribuyentes: User:Caliver Archivo:C_plus_plus.svg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:C_plus_plus.svg Licencia: Public Domain Contribuyentes: JTojnar Archivo:Wikiversity-logo-Snorky.svg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Wikiversity-logo-Snorky.svg Licencia: desconocido Contribuyentes: Archivo:Wikibooks-logo.svg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Wikibooks-logo.svg Licencia: logo Contribuyentes: User:Bastique, User:Ramac et al. Archivo:Multiple icon selection.png Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Multiple_icon_selection.png Licencia: GNU Free Documentation License Contribuyentes: Giacomo Ritucci Archivo:Gimp-buttons.png Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Gimp-buttons.png Licencia: GNU General Public License Contribuyentes: Original uploader was WEwert at en.wikipedia Archivo:Commons-logo.svg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Commons-logo.svg Licencia: logo Contribuyentes: SVG version was created by User:Grunt and cleaned up by 3247, based on the earlier PNG version, created by Reidab. Archivo:Wikisource-logo.svg Fuente: http://es.wikipedia.org/w/index.php?title=Archivo:Wikisource-logo.svg Licencia: logo Contribuyentes: Nicholas Moreau

Licencia

88

Licencia
Creative Commons Attribution-Share Alike 3.0 Unported //creativecommons.org/licenses/by-sa/3.0/