Paradigmas y lenguajes (material complementario)

48
PARADIGMAS Y LENGUAJES DE PROGRAMACIÓN Introducción -Que es un Lenguaje de Programación? Clasificación de los Lenguajes de Programación -Imperativos -Declarativos Paradigmas de Programación -Que es un Paradigma de Programación? -Tipos o clasificación de Paradigmas. Generaciones de los Lenguajes Historia y Características de algunos Lenguajes Ada - Objetos, Imperativo híbrido http://labsopa.dis.ulpgc.es/ada/ Smalltalk - Objetos puro http://www.smalltalk.org/ Java - Objetos puro http://www.java.org/ C++ - Objetos, Imperativo, Hipertexto híbrido http://www.masternet.com.co/prod/delphi.htm Pascal - Objetos, Imperativo híbrido busca un link en google, hay demasiados, el mejor es borland Delphi - Objetos, Imperativo híbrido http://www.masternet.com.co/prod/delphi.htm Ocaml - Objetos, Imperativo y Funcional híbrido http://www.ocaml.org/ Haskell - Funcional puro http://www.haskell.org/ Lisp - Funcional híbrido http://www.lisp.org/ Prolog - Lógico puro http://www.prolog.org/ Perl - Objetos, Imperativo, Hipertexto, Expresiones Regulares híbrido http://www.perl.org/ PHP - Objetos, Imperativo, Hipertexto, híbrido http://www.php.org/ SQL - Lenguaje Declarativo, Expresiones Regulares http://www.sql.org/ UML - Lenguaje Modelado http://www.uml.org/

Transcript of Paradigmas y lenguajes (material complementario)

Page 1: Paradigmas y lenguajes (material complementario)

PARADIGMAS Y LENGUAJES DE PROGRAMACIÓN

Introducción-Que es un Lenguaje de Programación?

Clasificación de los Lenguajes de Programación-Imperativos-Declarativos

Paradigmas de Programación-Que es un Paradigma de Programación?-Tipos o clasificación de Paradigmas.

Generaciones de los Lenguajes

Historia y Características de algunos LenguajesAda - Objetos, Imperativo híbridohttp://labsopa.dis.ulpgc.es/ada/Smalltalk - Objetos puro http://www.smalltalk.org/Java - Objetos puro http://www.java.org/C++ - Objetos, Imperativo, Hipertexto híbridohttp://www.masternet.com.co/prod/delphi.htmPascal - Objetos, Imperativo híbridobusca un link en google, hay

demasiados, el mejor es borlandDelphi - Objetos, Imperativo híbridohttp://www.masternet.com.co/prod/delphi.htmOcaml - Objetos, Imperativo y Funcional híbrido http://www.ocaml.org/Haskell - Funcional puro http://www.haskell.org/Lisp - Funcional híbrido http://www.lisp.org/Prolog - Lógico puro http://www.prolog.org/Perl - Objetos, Imperativo, Hipertexto, Expresiones Regulares híbrido http://www.perl.org/PHP - Objetos, Imperativo, Hipertexto, híbrido http://www.php.org/SQL - Lenguaje Declarativo, Expresiones Regulareshttp://www.sql.org/UML - Lenguaje Modelado http://www.uml.org/

Para cada lenguaje seleccionando su nombre podrás ver su historia y características y a la derecha tienes un link a un sitio que te brinda de todo demasiado.

INTRODUCCIÓN

¿Qué es un lenguaje de programación?. Un conjunto de sintaxis y reglas semánticas que definen los programas del computador. Es una técnica estándar de comunicación para entregarle instrucciones al computador. Un lenguaje le da la capacidad al programador de especificarle al computador, qué tipo de datos actúan y que acciones tomar bajo una variada gama de circunstancias, utilizando un lenguaje relativamente próximo al lenguaje humano.

Page 2: Paradigmas y lenguajes (material complementario)

Un programa escrito en un lenguaje de programación necesita pasar por un proceso de compilación, interpretación o intermedio, es decir, ser traducido al lenguaje de máquina para que pueda ser ejecutado por el ordenador.

En definitiva, '''Lenguaje de programación''' es un conjunto de sintaxis y reglas semánticas que definen los programas del computador.

Es una técnica estándar de comunicación para entregarle instrucciones al computador. Un lenguaje le da la capacidad al programador de especificarle al computador, qué tipo de datos actúan y que acciones tomar bajo una variada gama de circunstancias, utilizando un lenguaje relativamente próximo al lenguaje humano.

Un programa escrito en un lenguaje de programación necesita pasar por un proceso de compilación, es decir, ser traducido al lenguaje de máquina para que pueda ser ejecutado por el ordenador.

Los lenguajes de programación pueden ser clasificados de acuerdo a diversos criterios:

Lenguajes interpretados (Interpretes) como Basic, Dbase. Lenguajes compilados (Compiladores) como C, C++, Clipper. Lenguajes interpretados con recolectores de basura (Maquina Virtual) como Smalltalk, Java, Ocaml. Lenguajes Scripts (Motor de ejecución) como Perl, PhP.

Clasificación de los Lenguajes de Programación

Declarativos

Se les conoce como lenguajes declarativos en ciencias computacionales aquellos lenguajes de programación en los cuales se le indica a la computadora que es lo que se desea obtener o que es lo que se esta buscando, por ejemplo: Obtener los nombres de todos los empleados que tengan más de 32 años. Algunos ejemplos de lenguajes declarativos son el Datatrieve, SQL y las expresiones regulares.

Siglas de Structured Query Language (Lenguaje Estructurado de Consultas). Es un lenguaje declarativo que aúna características del Álgebra y el Cálculo Relacionales que nos permite lanzar consultas contra una Base de Datos para recuperar información de nuestro interés, almacenada en ella.

Ejemplos de consultas SQL: SELECT Nombre From Tabl_fich_personales where Edad >=18; Muestra el Campo "Nombre" de todos los individuos mayores de 18 años de la tabla "Tabl_fich_personales"

El concepto de expresiones regulares (Regular expressions en inglés) se refiere a una familia de lenguajes compactos y potentes para la descripción de conjuntos de cadenas de caracteres. Numerosos editores de texto y otras utilidades (especialmente en el sistema

Page 3: Paradigmas y lenguajes (material complementario)

operativo UNIX), como por ejemplo sed y awk, utilizan estos lenguajes para buscar ciertas estructuras en el texto y, por ejemplo, remplazarlas con alguna otra cadena de caracteres.

Imperativos

En ciencias de la computación se llama lenguajes imperativos a aquellos en los cuales se le ordena a la computadora cómo realizar una tarea siguiendo una serie de pasos o instrucciones, por ejemplo: Paso 1, solicitar número. Paso 2, multiplicar número por dos. Paso 3, imprimir resultado de la operación. Paso 4, etc,Algunos ejemplos de lenguajes imperativos son: BASIC, C, C++, Java, Clipper, Dbase, C# y Perl.

Paradigmas de Programación

Un paradigma de programación representa un enfoque particular o filosofía para la construcción del software. No es mejor uno que otro sino que cada uno tiene ventajas y desventajas. También hay situaciones donde un paradigma resulta más apropiado que otro.

Algunos ejemplos de paradigmas de programación:

El paradigma imperativo o por procedimientos es considerado el más común y está representado, por ejemplo, por el C o por BASIC.

El paradigma funcional está representado por la familia de lenguajes LISP (en particular Scheme), ML o Haskell.

El paradigma lógico , un ejemplo es PROLOG. El paradigma orientado a objetos . Un lenguaje completamente orientado a objetos

es Smalltalk.

Nota: La representación orientada a objetos mejora la estructura de los datos y por lo tanto se ha aplicado a diferentes paradigmas como Redes de Petri, Imperativo Secuencial, Lógica de Predicados, Funcional, etc. No obstante, la manipulación no queda fundamentalmente afectada y por lo tanto el paradigma inicial tampoco a pesar de ser re-orientado a objetos.

Si bien puede seleccionarse la forma pura de estos paradigmas al momento de programar, en la práctica es habitual que se mezclen, dando lugar a la programación multiparadigma.

Actualmente el paradigma de programación más usado debido a múltiples ventajas respecto a sus anteriores, es la programación orientada a objetos

Paradigma Imperativo o por Procedimientos

La programación imperativa, en contraposición a la programación declarativa es un paradigma de programación que describe la programación en términos del estado del

Page 4: Paradigmas y lenguajes (material complementario)

programa y sentencias que cambian dicho estado. Los programas imperativos son un conjunto de instrucciones que le indican al computador cómo realizar una tarea.

La implementación de hardware de la mayoría de computadores es imperativa; prácticamente todo el hardware de los computadores está diseñado para ejecutar código de máquina, que es nativo al computador, escrito en una forma imperativa. Esto se debe a que el hardware de los computadores implementa el paradigma de las Máquinas de Turing. Desde esta perspectiva de bajo nivel, el estilo del programa está definido por los contenidos de la memoria, y las sentencias son instrucciones en el lenguaje de máquina nativo del computador (por ejemplo el lenguaje ensamblador).

Los lenguajes imperativos de alto nivel usan variables y sentencias más complejas, pero aún siguen el mismo paradigma. Las recetas y las listas de revisión de procesos, a pesar de no ser programas de computadora, son también conceptos familiares similares en estilo a la programación imperativa; cada paso es una instrucción, y el mundo físico guarda el estado (Zoom).

Los primeros lenguajes imperativos fueron los lenguajes de máquina de los computadores originales. En estos lenguajes, las instrucciones fueron muy simples, lo cual hizo la implementación de hardware fácil, pero obstruyendo la creación de programas complejos. Fortran, cuyo desarrollo fue iniciado en 1954 por John Backus en IBM, fue el primer gran lenguaje de programación en superar los obstáculos presentados por el código de máquina en la creación de programas complejos.

Paradigma Funcional

Sus orígenes se remontan al cálculo lambda (o λ-cálculo), una teoría matemática elaborada por Alonzo Church como apoyo a sus estudios sobre computabilidad. Un lenguaje funcional es, a grandes rasgos, azúcar sintáctica para el Cálculo Lambda.

El objetivo es conseguir lenguajes expresivos y matemáticamente elegantes, en los que no sea necesario bajar al nivel de la máquina para describir el proceso llevado a cabo por el programa, y evitando el concepto de estado del cómputo. La secuencia de computaciones llevadas a cabo por el programa se regiría única y exclusivamente por la reescritura de definiciones más amplias a otras cada vez más concretas y definidas, usando lo que se denominan "definiciones dirigidas".

Los programas escritos en un lenguaje funcional están constituidos únicamente por definiciones de funciones, entendiendo éstas no como subprogramas clásicos de un lenguaje imperativo, sino como funciones puramente matemáticas, en las que se verifican ciertas propiedades como la transparencia referencial (el significado de una expresión depende únicamente del significado de sus subexpresiones), y por tanto, la carencia total de efectos laterales.

Otras características propias de estos lenguajes son la no existencia de asignaciones de variables y la falta de construcciones estructuradas como la secuencia o la iteración (lo que

Page 5: Paradigmas y lenguajes (material complementario)

obliga en la práctica a que todas las repeticiones de instrucciones se lleven a cabo por medio de funciones recursivas).

Existen dos grandes categorías de lenguajes funcionales: los funcionales puros y los híbridos. La diferencia entre ambos estriba en que los lenguajes funcionales híbridos son menos dogmáticos que los puros, al admitir conceptos tomados de los lenguajes imperativos, como las secuencias de instrucciones o la asignación de variables. En contraste, los lenguajes funcionales puros tienen una mayor potencia expresiva, conservando a la vez su transparencia referencial, algo que no se cumple siempre con un lenguaje funcional híbrido.

Entre los lenguajes funcionales puros, cabe destacar a Haskell y Miranda. Los lenguajes funcionales híbridos más conocidos son Scala, Lisp, Scheme, Ocaml, SAP y Standard ML (estos dos últimos, descendientes del lenguaje ML). Erlang es otro lenguaje funcional de programación concurrente. R también es un lenguaje funcional dedicado a la estadística.1

Como ejemplo de lenguaje funcional híbrido se podría incluir a Perl, pues, aunque es un lenguaje de propósito muy general, se pueden realizar programas usando exclusivamente funciones definidas por el usuario.

Cabe citar tambien al Python, como lenguage que incorpora el paradigma funcional.

Paradigma Lógico

La programación lógica consiste en la aplicación del corpus de conocimiento sobre lógica para el diseño de lenguajes de programación; no debe confundirse con la disciplina de la lógica computacional.La programación lógica comprende dos paradigmas de programación: la programación declarativa y la programación funcional. La programación declarativa gira en torno al concepto de predicado, o relación entre elementos. La programación funcional se basa en el concepto de función (que no es más que una evolución de los predicados), de corte más matemático.

Históricamente, los ordenadores se han programado utilizando lenguajes muy cercanos a las peculiaridades de la propia máquina: operaciones aritméticas simples, instrucciones de acceso a memoria, etc. Un programa escrito de esta manera puede ocultar totalmente su propósito a la comprensión de un ser humano, incluso uno entrenado. Hoy día, estos lenguajes pertenecientes al paradigma de la Programación imperativa han evolucionado de manera que ya no son tan crípticos.

En cambio, la lógica matemática es la manera más sencilla, para el intelecto humano, de expresar formalmente problemas complejos y de resolverlos mediante la aplicación de reglas, hipótesis y teoremas. De ahí que el concepto de "programación lógica" resulte atractivo en diversos campos donde la programación tradicional es un fracaso.

Page 6: Paradigmas y lenguajes (material complementario)

La programación lógica encuentra su hábitat natural en aplicaciones de inteligencia artificial o relacionadas:

Sistemas expertos , donde un sistema de información imita las recomendaciones de un experto sobre algún dominio de conocimiento.

Demostración automática de teoremas, donde un programa genera nuevos teoremas sobre una teoría existente.

Reconocimiento de lenguaje natural, donde un programa es capaz de comprender (con limitaciones) la información contenida en una expresión lingüística humana.

Etc.

La programación lógica también se utiliza en aplicaciones más "mundanas" pero de manera muy limitada, ya que la programación tradicional es más adecuada a tareas de propósito general.

La mayoría de los lenguajes de programación lógica se basan en la teoría lógica de primer orden, aunque también incorporan algunos comportamientos de orden superior. En este sentido, destacan los lenguajes funcionales, ya que se basan en el cálculo lambda, que es la única teoría lógica de orden superior que es demostradamente computable (hasta el momento).

Paradigma Orientado a Objetos

La Programación Orientada a Objetos (POO u OOP según sus siglas en inglés) es un paradigma de programación que usa objetos y sus interacciones para diseñar aplicaciones y programas de computadora. Está basado en varias técnicas, incluyendo herencia, modularidad, polimorfismo, y encapsulamiento. Su uso se popularizó a principios de la década de 1990. Actualmente son muchos los lenguajes de programación que soportan la orientación a objetos.

Los objetos son entidades que combinan estado, comportamiento e identidad:

El estado está compuesto de datos, serán uno o varios atributos a los que se habrán asignado unos valores concretos (datos).

El comportamiento está definido por los procedimientos o métodos con que puede operar 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 análogo al de identificador de una variable o una constante).

La programación orientada a objetos expresa un programa como un conjunto de estos objetos, que colaboran entre ellos para realizar tareas. Esto permite hacer los programas y módulos más fáciles de escribir, mantener y reutilizar.

De esta forma, un objeto contiene toda la información que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma

Page 7: Paradigmas y lenguajes (material complementario)

clase, al poder tener valores bien diferenciados en sus atributos. A su vez, los objetos disponen de mecanismos de interacción llamados métodos que favorecen la comunicación entre ellos. Esta comunicación favorece a su vez el cambio de estado en los propios objetos. Esta característica lleva a tratarlos como unidades indivisibles, en las que no se separan ni deben separarse el estado y el comportamiento.

Los métodos (comportamiento) y atributos (estado) están estrechamente relacionados por la propiedad de conjunto. Esta propiedad destaca que una clase requiere de métodos para poder tratar los atributos con los que cuenta. El programador debe pensar indistintamente en ambos conceptos, sin separar ni darle mayor importancia a ninguno de ellos, hacerlo podría producir el hábito erróneo de crear clases contenedoras de información por un lado y clases con métodos que manejen a las primeras por el otro. De esta manera se estaría realizando una programación estructurada camuflada en un lenguaje de programación orientado a objetos.

Esto difiere de la programación estructurada tradicional, en la que los datos y los procedimientos están separados y sin relación, ya que lo único que se busca es el procesamiento de unos datos de entrada para obtener otros de salida. La programación estructurada anima al programador a pensar sobre todo en términos de procedimientos o funciones, y en segundo lugar en las estructuras de datos que esos procedimientos manejan. En la programación estructurada sólo se escriben funciones que procesan datos. Los programadores que emplean éste nuevo paradigma, en cambio, primero definen objetos para luego enviarles mensajes solicitándoles que realicen sus métodos por sí mismos.

Los conceptos de la programación orientada a objetos tienen origen en Simula 67, un lenguaje diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard del Centro de Cómputo Noruego en Oslo. Al parecer, en este centro, trabajaban en simulaciones de naves, y fueron confundidos por la explosión combinatoria de cómo las diversas cualidades de diversas naves podían afectar unas a las otras. La idea ocurrió para agrupar los diversos tipos de naves en diversas clases de objetos, siendo responsable cada clase de objetos de definir sus propios datos y comportamiento. Fueron refinados más tarde en Smalltalk, que fue desarrollado en Simula en Xerox PARC (y cuya primera versión fue escrita sobre Basic) pero diseñado para ser un sistema completamente dinámico en el cual los objetos se podrían crear y modificar "en marcha" en lugar de tener un sistema basado en programas estáticos.

La programación orientada a objetos tomó posición como el estilo de programación dominante a mediados de los años ochenta, en gran parte debido a la influencia de C++, una extensión del lenguaje de programación C. Su dominación fue consolidada gracias al auge de las Interfaces gráficas de usuario, para las cuales la programación orientada a objetos está particularmente bien adaptada. En este caso, se habla también de programación dirigida por eventos.

Las características de orientación a objetos fueron agregadas a muchos lenguajes existentes durante ese tiempo, incluyendo Ada, BASIC, Lisp, Pascal, entre otros. La adición de estas características a los lenguajes que no fueron diseñados inicialmente para ellas condujo a menudo a problemas de compatibilidad y a la capacidad de mantenimiento del código. Los

Page 8: Paradigmas y lenguajes (material complementario)

lenguajes orientados a objetos "puros", por otra parte, carecían de las características de las cuales muchos programadores habían venido a depender. Para saltar este obstáculo, se hicieron muchas tentativas para crear nuevos lenguajes basados en métodos orientados a objetos, pero permitiendo algunas características 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 aparición de Internet, y a la implementación de la máquina virtual de Java en la mayoría de navegadores. PHP en su versión 5 se ha ido modificando y soporta una orientación completa a objetos, cumpliendo todas las características propias de la orientación a objetos.

La programación orientada a objetos es una nueva forma de programar que trata de encontrar una solución a estos problemas. Introduce nuevos conceptos, que superan y amplían conceptos antiguos ya conocidos. Entre ellos destacan los siguientes:

Clase : definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ellas, (de c a d),Es la facilidad mediante la cual la clase D ha definido en ella cada uno de los atributos y operaciones de C, como si esos atributos y operaciones hubiesen sido definidos por la misma D.

Objeto : entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad (métodos). 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.

Método : algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema.

Evento: un suceso en el sistema (tal como una interacción del usuario con la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. También se puede definir como evento, a la reacción que puede desencadenar un objeto, es decir la acción que genera.

Mensaje: una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros 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 características predeterminadas, y cuyo valor puede ser alterado por la ejecución de algún método.

Estado interno: es una variable que se declara privada, que puede ser únicamente accedida y alterada por un método del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos). No es visible al programador que maneja una instancia de la clase.

Componentes de un objeto:atributos, identidad, relaciones y métodos. Representación de un objeto: un objeto se representa por medio de una tabla o

entidad que esté compuesta por sus atributos y funciones correspondientes.

Page 9: Paradigmas y lenguajes (material complementario)

En comparación con un lenguaje imperativo, una "variable", no es más que un contenedor interno del atributo del objeto o de un estado interno, así como la "función" es un procedimiento interno del método del objeto.

Hay un cierto desacuerdo sobre exactamente qué características de un método de programación o lenguaje le definen como "orientado a objetos", pero hay un consenso general en que las características siguientes son las más importantes (para más información, seguir los enlaces respectivos):

Abstracción : 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 cómo se implementan estas características. Los procesos, las funciones o los métodos pueden también ser abstraídos y cuando lo están, una variedad de técnicas son requeridas para ampliar una abstracción.

Encapsulamiento : Significa reunir a todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstracción. Esto permite aumentar la cohesión de los componentes del sistema. Algunos autores confunden este concepto con el principio de ocultación, principalmente porque se suelen emplear conjuntamente.

Principio de ocultación : Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone una interfaz a otros objetos que especifica cómo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificación por quien no tenga derecho a acceder a ellas, solamente los propios métodos 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 abstracción. La aplicación 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 invocación de un comportamiento en una referencia producirá el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecución", esta última característica se llama asignación tardía o asignación dinámica. Algunos lenguajes proporcionan medios más estáticos (en "tiempo de compilación") de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++.

Herencia : las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación. 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 que volver a implementarlo. Esto suele hacerse habitualmente agrupando los objetos en clases y estas en árboles o

Page 10: Paradigmas y lenguajes (material complementario)

enrejados que reflejan un comportamiento común. Cuando un objeto hereda de más de una clase se dice que hay herencia múltiple.

Generaciones de los Lenguajes

Los equipos de ordenador (el hardware) han pasado por cuatro generaciones, de las que las tres primeras (ordenadores con válvulas, transistores y circuitos integrados) están muy claras, la cuarta (circuitos integrados a gran escala) es más discutible.

Algo parecido ha ocurrido con la programación de los ordenadores (el software), que se realiza en lenguajes que suelen clasificarse en cinco generaciones, de las que las tres primeras son evidentes, mientras no todo el mundo está de acuerdo en las otras dos. Estas generaciones no coincidieron exactamente en el tiempo con las de hardware, pero sí de forma aproximada, y son las siguientes:

Primera generación: Los primeros ordenadores se programaban directamente en código binario, que puede representarse mediante secuencias de ceros y unos sistema binario. Cada modelo de ordenador tiene su propio código, por esa razón se llama lenguaje de máquina.

Segunda generación: Los lenguajes simbólicos, así mismo propios de la máquina, simplifican la escritura de las instrucciones y las hacen más legibles.

Tercera generación: Los lenguajes de alto nivel sustituyen las instrucciones simbólicas por códigos independientes de la máquina, parecidas al lenguaje humano o al de las Matemáticas.

Cuarta generación: se ha dado este nombre a ciertas herramientas que permiten construir aplicaciones sencillas combinando piezas prefabricadas. Hoy se piensa que estas herramientas no son, propiamente hablando, lenguajes. Algunos proponen reservar el nombre de cuarta generación para la programación orientada a objetos.

Quinta generación: se llama así a veces a los lenguajes de la inteligencia artificial, aunque con el fracaso del proyecto japonés de la quinta generación el nombre ha caído en desuso.

Historia y Características de algunos Lenguajes

AdaLenguaje de programación diseñado por Jean Ichbiah de Cii Honeywell Bull por encargo del Departamento de Defensa de los EE.UU. para unificar el uso de los lenguajes de programación en los proyectos que le fuesen entregados. Es un lenguaje diseñado con la seguridad en mente y es multipropósito, pudiendo llegar desde la facilidad de Pascal a la flexibilidad de C pero con una filosofía orientada a la reducción de errores.Su nombre conmemora a la condesa Ada Lovelace, hija de Lord Byron, a quien se considera la primera programadora de la Historia, por su relación con Charles Babbage, creador de la máquina analítica. El Departamento de Defensa de los Estados Unidos (DoD) y los ministerios equivalentes de varios países europeos exigen la utilización de este lenguaje en los proyectos realizados bajo su patrocinio. También es usado en otros entornos

Page 11: Paradigmas y lenguajes (material complementario)

en los que también se necesita una gran seguridad como la gestión del tráfico aéreo (en empresas como Boeing o la española Indra).Ada se diseñó de manera que permita evitar los errores comunes y difíciles de descubrir. Esto puede hacer que sea muy irritante para los programadores principiantes.Hasta la fecha la ISO ha publicado dos ediciones del estándar de Ada: la original Ada 83 que incluía conceptos novedosos como las excepciones y la programación genérica; y la revisión Ada 95, que entre otras cosas añadió la capacidad de herencia para completar sus características de lenguaje OOP.Un compilador de Ada muy usado es GNAT, originalmente desarrollado por la Universidad de Nueva York y mantenido en la actualidad por Ada Core Technologies. Está basado en la tecnología de GCC y es software libre.

Ejemplo: «Hola Mundo» en Ada es:

with Ada.Text_IO; use Ada.Text_IO;

procedure Hola_Mundo isbegin Put_Line ("Hola Mundo");end;

Aquí abajo hay un ejemplo más elaborado (función de Ackermann) de código fuente escrito en Ada, para mostrar sus rasgos principales.with Ada.Command_Line; use Ada.Command_Line;with Ada.Text_Io; use Ada.Text_Io;

procedure Ackermann is function ack (x : integer; y: integer) return integer is begin if x = 0 then return y + 1; elsif y = 0 then return ack(x-1,1); else return ack(x-1,ack(x,y-1)); end if; end ack; x,y,a : integer;begin if Argument_Count = 2 then x := Integer'Value (Argument(1)); y := Integer'Value (Argument(2)); elsif Argument_Count = 1 then x := 3; y := Integer'Value (Argument(1)); else x := 3;

Page 12: Paradigmas y lenguajes (material complementario)

y := 3; end if; a := ack (x,y); Put ("Ack (" & Integer'Image (x) & ","); Put_Line (Integer'Image (y) & ") = " & Integer'Image (a));end Ackermann;

Podemos observar que: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 filosofía de que un programa se escribe una vez, se modifica decenas de veces y se lee miles de veces (legibilidad es más importante que rapidez de escritura). Todo es case-insensitive. Ya que todo el entorno Unix es case-sensitive, a algunos programadores de Unix no les gusta este rasgo de Ada. En este caso, todo el programa es un solo procedimiento, que puede contener subprogramas (procedimientos o funciones) (en este caso: la función ack). Cada sentencia se cierra con un 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. Se asigna un valor con :=, se comparan dos valores con =. A los programadores de C les puede confundir este rasgo inspirado en Pascal. La sintaxis de atributos es objeto'atributo (o tipo'atributo) (nota: esto sólo aplica a los objetos predefinidos, ya que no es el concepto de atributo típico de OOP). Se distingue entre "procedimientos" (subrutinas que no devuelven ningún valor pero pueden modificar sus parámetros) y "funciones" (subrutinas que devuelven un valor y no modifican los parámetros). La mayoría de lenguajes de programación no hacen esta distinción, sin embargo las funciones de Ada favorecen la seguridad al reducir los posibles efectos colaterales, pues no tienen parámetros in out.

SmalltalkDiseñado por Alan Kay durante los años setenta en el Palo Alto Reasearch Institute de Xerox (conocido como Xerox Parc). Smalltalk era un elemento de la primera computadora personal con interfaz gráfica el "Alto" (que nunca fue llevado al mercado pero de cuyas ideas nació el Macintosh).Smalltalk es considerado el primero de los lenguajes orientados a objetos (OOP). En Smalltalk TODO es un objeto.. aun los números enteros. Smalltalk se basó en ideas de Simula (un lenguaje de simulaciones).Pero Smalltalk no es meramente un lenguaje, sino un entorno completo, prácticamente un sistema operativo que se ejecuta encima de una "máquina virtual". Esto asegura su máxima portabilidad entre plataformas.A pesar de ser un lenguaje muy simple, muy poderoso, y que promueve buenas prácticas de programación, Smalltalk (hasta el 2002) no había llegado a ser un lenguaje muy popular. Esto se debe a la poca aceptación de lenguajes interpretados en los años 1980 y 1990. A pesar de esto algunas empresas como Digitalk, VisualWorks e IBM llegaron a tener relativo éxito con la plataforma como una herramienta de desarrollo rápido que competía contra herramientas como PowerBuilder y en menor grado contra VisualBasic que eran muy populares en los años 80 y 90.

Page 13: Paradigmas y lenguajes (material complementario)

En 1995, Sun Microsystems lanzó Java que es un lenguaje fuertemente influenciado por Smalltalk. Un lenguaje que popularizaría el concepto de lenguajes interpretados con recolectores de basura.Ejemplos de Smalltalk:En Smalltalk todo es un objeto, y a un objeto le enviamos mensajes. Por ejemplo:1 + 1Significa que al objeto "1" le enviamos el mensaje "+" con el parámetro "1". Este ejemplo entonces resulta en el valor "2".

JavaPlataforma de software desarrollada por Sun Microsystems. Esta plataforma ha sido desarrollada de tal manera que los programas desarrollados para ella puedan ejecutarse de la misma forma en diferentes tipos de arquitecturas y dispositivos computacionales.La plataforma Java consta de tres partes:

El lenguaje de programación Máquina virtual de Java API Java

Originalmente llamado OAK por Ingenieros de Sun Microsystems, Java fue diseñado para correr en computadoras embebidas. Sin embargo, en 1995, dada la atención que estaba produciendo la Web, Sun Microsystems la distribuyó para sistemas operativos tales como Microsoft Windows.El lenguaje mismo adopta la sintaxis de C++, pero su funcionamiento es muy similar al de Smalltalk. Incorpora sincronización y manejo de tareas en el lenguaje mismo (similar a Ada) e incorpora interfaces como un mecanismo alternativo a la herencia múltiple de C++.A fines del siglo XX, Java llegó a ser el lenguaje de mayor acogida para programas de servidor. Utilizando una tecnología llamada JSP (similar a ASP de Microsoft), se hizó muy fácil escribir páginas dinámicas para sitios de Internet. Sumado a esto, la tecnología de JavaBeans, al incorporarse con JSP, permitía utilizar el patrón MVC (Modelo-Vista-Controlador) que ya tanto se había aplicado a interfaces gráficas.Java llegó a ser extremadamente popular cuando Sun Microsystems introdujo la plataforma y el modelo de programación J2EE (Java 2 Enterprise Edition). Este modelo permite una separación entre la presentación de los datos al usuario (JSP o Applets), el modelo de datos (EJB), y el control (Servlets). Enterprise Java Beans (EJB) que es una tecnología de objetos distribuídos que pudo lograr el sueño de muchas empresas como Microsoft e IBM de crear una plataforma de objetos distribuídos con un monitor de transacciones. Con este nuevo estándar, empresas como BEA, IBM, Sun Microsystems, Oracle y otros crearon nuevos "servidores de aplicaciones" que tuvieron gran acogida en el mercado.Además de programas del servidor, Java permite escribir programas de interfaz gráfica o textual. Además se pueden correr programas de manera incorporada o embebida en los navegadores web de Internet, aunque esto nunca llegó a popularizarse como se esperaba en un principio.Los programas en Java generalmente son compilados a un lenguaje intermedio o bytecode, y luego interpretados por una máquina virtual (JVM). Esta última sirve como una plataforma de abstracción entre la máquina y el lenguaje permitiendo que se pueda "escribir el programa una vez, y correrlo en cualquier lado". También existen compiladores nativos

Page 14: Paradigmas y lenguajes (material complementario)

de Java, tanto comercial como libre. El compilador GCC de GNU compila Java a código de máquina con algunas limitaciones al año 2002.

Ejemplo:

import javax.swing.JFrame;import javax.swing.JLabel;

public class HolaMundo extends javax.swing.JFrame { public static void main(String[] args) { System.out.println("Vamos a crear una ventana que ponga \"HolaMundo\""); new HolaMundo(); }

public HolaMundo() { super("HolaMundo"); JLabel etiqueta = new JLabel("HolaMundo"); etiqueta.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); getContentPane().add(etiqueta); setSize(400,200); addWindowListener( new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { System.exit(0); } } ); setVisible(true); }}

C Más MásC++ (pronunciado "C plus plus" o "C más más", por algunos programadores de habla hispana) es un lenguaje de programación, diseñado a mediados de los ochenta, por Bjarne Stroustrup, como extensión del lenguaje de programación C.Es un lenguaje híbrido, que se puede compilar y resulta más sencillo de aprender para los programadores que ya conocen C. Actualmente existe un estándar, denominado ISO C++, al que se han adherido la mayoría de los fabricantes de compiladores más modernos. Existen también algunos intérpretes como ROOT (http://root.cern.ch/) (enlace externo). Las principales características del C++ son abstracción (encapsulación), el soporte para programación orientada a objetos (polimorfismo) y el soporte de plantillas o programación genérica (Templates). Las plantillas se las define de la manera siguiente: template <parámetros> declaración X y se las instancia con X<parámetros>.

Page 15: Paradigmas y lenguajes (material complementario)

Pero añade otra serie de propiedades que se encuentran más difícilmente en otros lenguajes de alto nivel:

Posibilidad de redefinir los operadores Indentificación de tipos en tiempo de ejecución (RTTI)

El nombre C++ fue propuesto por Rick Masciatti en el año 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio científico. Antes se había usado el nombre "C con clases". En el C++, "C++" significa "uno más de C" y se refiere a que C++ es una extensión del C.Algunos dicen que "C++" todavía significa "C", porque "++" en este caso es el operador de la postincrementación, es decir, aumenta el valor de la expresión a la que se refiere, después, en las instrucciones siguientes. Por esto el valor de la expresión en este momento permanece original.

Aquí hay un programa de ejemplo escrito en C++:

#include <iostream>

int main() { std::cout << "¡Hola mundo!" << std::endl; }

PascalPascal es un lenguaje de programación de alto nivel, desarrollado por Niklaus Wirth. Se convirtió en uno de los lenguajes extensamente usados en lo cursos de introducción a la programación, pues fue bien recibido como lenguaje de enseñanza para estudiantes universitarios. Pascal es un lenguaje con técnicas de programación estructurada, dicha programación hace programadores disciplinados.Sus primeras versiones datan de 1970. Es un lenguaje de programación estructurado creado por Niklaus Wirth, un profesor del Instituto tecnológico de Zurich, que lo creó pensando en un lenguaje didáctico que enseñase la programación como "una disciplina sistemática basada en determinados conceptos fundamentales". Estos conceptos más tarde se tornarían motivo de controversia entre los que creen que este lenguage tiene utilidad limitada a los medios academicos, como Brian W. Kernighan.A partir de los años setenta se convirtió en el sucesor de ALGOL en el entorno universitario. Pascal permite construir programas muy legibles. Wirth es también autor del lenguaje Modula-2 y de Oberon.El lenguaje de programación Delphi es una versión orientada a objetos moderna del lenguaje Pascal y es ampliamente utilizada en la industria de software.

Ejemplo:

PROGRAM Ejemplo(INPUT, OUTPUT);

FUNCTION PreguntaNombre:STRING;VAR

Page 16: Paradigmas y lenguajes (material complementario)

nombre:STRING;BEGIN REPEAT WRITELN('Ingresa tu nombre:'); READLN(nombre); UNTIL nombre <> ''; PreguntaNombre := nombre;END;

PROCEDURE Saluda;VAR nombre:STRING; BEGIN nombre := PreguntaNombre; IF nombre = 'wirth' THEN WRITELN('Hola señor Wirth!'); ELSE WRITELN('Hola '+nombre);END;

BEGIN Saluda;END.

En la ciencia de la computación, Pascal es uno de los hitos de lenguajes de programación el cual tiene definido la programación de computadora y esta todavía en uso hoy en día.Niklaus Wirth lo desarrollo para hacer posible la programación estructurada que seria mas fácil para un compilador para procesar. Pascal se baso en el lenguaje de programación Algol y su nombre se debe en honor del matemático Blaise Pascal. Wirth también desarrollo Modula-2 y Oberon, lenguajes similares a Pascal el cual también soporta programación orientada a objetos.

Características únicas

A diferencia de lenguajes de programación descendientes de C, Pascal utiliza := para asignamiento en vez de =. Esto es una ventaja en diferenciar comparaciones y asignamientos. En C = = es comparación, pero = es una asignación. Esas pueden ser fáciles de confundir resultando en una línea de asignamiento en vez de comparación. También = tiene siempre siendo comparación en matemáticas, así a cambiar el significado en un lenguaje de programación resulta en confusión. Esta sintaxis conduce a muchos errores [bugs] difíciles de rastrear en código C. Desde que Pascal no permite asignamientos en línea y utiliza sintaxis distinta para asignamientos y comparaciones, esto no sufre de esos errores.Otra mayor diferencia es que Pascal se determina el tipo fuertemente. Esto significa que toda variable debe ser definida con un tipo especifico antes que puedan ser usadas. También, asignamientos de variable incompatibles no son permitidas sin un tipo explicito. Esto previene errores comunes donde variables son usadas incorrectamente por que el tipo

Page 17: Paradigmas y lenguajes (material complementario)

es desconocido. Esto también aliviana la necesidad de notación húngara - la practica de nombres de variables sufijos con tipo- identificando letras.

Implementaciones

Primeros acercamientos (mas notables en UCSD p-System) trasladar código Pascal dentro de una representación de p-Code de máquina independiente. Este código intermediario fue entonces interpretado por un programa especifico a cada arquitectura. Como una consecuencia, solo el interprete pequeño tuvo que ser portada a muchas arquitecturas.En los 1980s Anders Hejlsberg escribió el compilador Blue Label Pascal para la Nascom-2. Mas tarde el fue a trabajar para Borland y rescribió su compilador que se convirtió en Turbo Pascal para la IBM PC. Este nuevo compilador se vendió por $49, el cual fue mucho menos que el precio que Hejlsberg originalmente solicito para el compilador Blue Label Pascal.El barato compilador de Borland tubo una larga influencia en la comunidad de Pascal que comenzó concentrándose principalmente en el IBM PC a finales de los 80. Muchos aficionados a la PC en busca de un estructurado reemplazo para el BASIC utilizo este producto. Turbo Pascal, siendo disponible solo en una arquitectura, trasladada directamente al código de máquina del Intel 8088, haciéndola mucho mas rápida que esquemas interpretados.Durante los 90s compiladores que pudieron redesignar a diferentes arquitecturas de hardware se convirtieron mas común. Esto permitió para Pascal traducción a código de maquina nativo que fue al mismo tiempo fácil portar a hardware nuevo.Con Turbo Pascal versión 5 Borland agregó orientación a objetos a Pascal. Sin embargo, Borland después decidió característica orientado a objetos mas elaborada, y volvió a empezar en Delphi usando el proyecto estándar Object Pascal propuesto por Apple como una base. (Este proyecto de Apple no es un estándar formal aún) Borland también llamo este Object Pascal en las primeras versiones de Delphi, pero cambio el nombre a lenguaje de programación Delphi en sus ultimas versiones. Los primeros cambios comparando a las viejas extensiones OOP fueron una basada-referencia modelo objeto, constructores y destructores virtuales, y propiedades. Hay otros compiladores implementando este dialecto: vease lenguaje de programación Delphi.

Compiladores disponibles publicamente

Varios compiladores de Pascal están disponibles para el uso del publico en general: Compilador GNU Pascal Compiler (GPC) es un adicional front-end para el GNU

Compiler Collection (GCC), y esta escrito en C. Distribuido libremente bajo la licencia GNU General Public License. El soporte de Borlan/Turbo Pascal está sin embargo algo limitado.

FreePascal esta escrito en Pascal (asi que se compilo este mismo), y esta apuntado a proveer un conveniente y poderoso compilador. También distribuido libremente bajo la licencia GNU GPL. Este puede mezclar Turbo Pascal con código Delphi, y soporta muchas plataformas y sistemas operativos.

Turbo Pascal fue el compilador Pascal dominante para PCs durante los 80s y a principios de los 90s,popular ambos debido a sus extensiones poderosas y los tiempos de la compilación sumamente bajos. Actualmente, versiones viejas de TP

Page 18: Paradigmas y lenguajes (material complementario)

(hasta la 5.5) están disponibles para descargarlo gratuitamente desde el sitio de Borland (se requiere registración)

Delphi es un producto de Borland RAD (Rapid Application Development). Utiliza el lenguaje de programación Delphi, descendiente de Pascal, para crear aplicaciones para la plataforma windows. La ultima versión también soporta compilación de la plataforma .NET.

Kylix es la mas nueva versión de Borland reiterando la rama de Pascal de sus productos. Esta es la descendiente de Delphi, con soporte para el sistema operativo Linux y una libreria object mejorada. El compilador y el IDE están disponibles para uso no comercial. El compilador (pero no la librería o la IDE) es supuestamente a convertirse en software Open Source pronto algún día

Crítica pasada

Mientras muy popular (aunque mucho mas en los 80s y principios de los 90s que en el tiempo de su escritura), primeras versiones de Pascal han sido extensamente criticadas por ser impropio para "serio" uso fuera de enseñanza. Brian Kernighan, co-creador de el lenguaje de programación C, delineo su mas notables criticas de Pascal como a principios como en 1981, en su papel Why Pascal Is Not My Favorite Programming Language.Desde este tiempo Pascal ha continuado evolucionando y la mayoría de sus puntos no aplica a las implementaciones actuales.Muchas personas ignorantes todavia subscriben a la creencia vieja que Pascal no es para "seria" programación y no comprende los beneficios que actualmente ofrece. Este estigma, mas de cualquier deficiencia real, es la obligacion mas grande de Pascal.

Hola mundo

Un ejemplo comun de una sintaxis de lenguaje es el programa Hola mundo PROGRAM Holamundo; BEGIN WriteLn('¡Hola mundo!'); END.

Todos los programas comienzan con la palabra clave "Program", y un bloque de código es indicado con el "Begin"/"End" . Case es ignorado en el lenguaje Pascal. Punto y coma separa las declaraciones, y el periodo termina el programa (o unidad). Para algunos compiladores la línea de Program es opcional.

DelphiDelphi es un entorno de programación visual basado en una versión moderna del lenguaje de programación Pascal. Como entorno visual, la programación en Delphi consiste en diseñar las pantallas de que se compone el programa colocando todos sus componentes (botones, campos de texto, etc.), asociando después código a ellos. El lenguaje utilizado por Delphi es una extensión de Pascal denominada Object Pascal, que básicamente añade al Pascal tradicional soporte para la programación orientada a objetos (habitualmente llamada POO).

Page 19: Paradigmas y lenguajes (material complementario)

Además de poder utilizar en un programa los controles estándar de los programas Windows (botones, etc.), es posible crear controles nuevos, denominados componentes. En internet existe un gran número de componentes, tanto gratuitos como comerciales, disponibles para los programadores a los que no les basten los que vienen ya con el programa.Delphi es una herramienta comercial para Windows, cuyo fabricante es la empresa norteamericana Borland. Existe una versión de Delphi para sistemas UNIX y LINUX, denominada Kylix (de la cual existe un version libre, pero limitada). Existe un desarrollo de la comunidad del software libre que intenta producir una versión multiplataforma y completamente libre de Delphi llamado Lazarus (http://www.lazarus.freepascal.org/).El nombre proviene del Oráculo de Delfos.

OcamlEl lenguaje Objective CAML, también llamado Ocaml u O'Caml, es un lenguaje de programación avanzado de la familia de los lenguajes ML, desarrollado y distribuido por el INRIA en Francia. Ocaml admite los paradigmas de programación imperativa, programación funcional y programación orientada a objetos.Ocaml nace de la evalución del lenguaje CAML (http://www.pps.jussieu.fr/~cousinea/Caml/caml_history.html), abreviación de Categorical Abstract Machine Language, al integrarse la programación con objetos.El código fuente en Ocaml se compila en código para una máquina virtual o en código nativo para diferentes arquitecturas que incluyen IA32, IA64, PowerPC, AMD64, Sparc, Alpha, HP/PA, MIPS y StrongARM. Este último compilador produce código comparable en eficiencia al producido por compiladores como el del lenguaje C/C++ (http://shootout.alioth.debian.org/).Ocaml dispone de un análisis de tipos estático con inferencia de tipos, valores funcionales de primera clase, polimorfismo paramétrizado, llamada por patrones, manejo de excepciones, recolección de basura y otras características avanzadas

(* Manipulación de listas *) (* Listas genéricas *) (* Longitud de una lista *) let rec long = function |[ ] -> 0 |x::xs -> 1 + long xs;; (* Ordenamiento por inserción *) (* dada una relación de orden *) let rec ordenar = function |[ ] -> [ ] |x::xs -> insertar x (ordenar xs) and insertar e = function |[ ] -> [e] |x::xs -> if x > e then e::x::xs else x::(insertar e xs);;

# let l = ["La"; "vida"; "es"; "un"; "largo"; "y"; "tranquilo"; "rio"];;

Page 20: Paradigmas y lenguajes (material complementario)

- : string list = ["La"; "vida"; "es"; "un"; "largo"; "y"; "tranquilo"; "rio"]

# long l;; - : int = 8

# ordenar l;; - : string list = ["La"; "es"; "largo"; "rio"; "tranquilo"; "un"; "vida"; "y"]

(* Arboles *) (* Definición de un árbol binario, para cualquier tipo 'a *) type 'a arbol = AVac | Nodo of ('a arbol * 'a * 'a arbol);;

let a = Nodo(AVac, 4, Nodo(AVac, 2, AVac));; (* Altura del árbol *) let rec altura = function |AVac -> 0 |Nodo(i, _, d) -> 1 + max (altura i) (altura d) ;; # altura a;; - : int = 2

HaskellHacia 1950, John McCarthy diseñó el lenguaje LISP (List Processing) que utilizaba las listas como tipo básico y admitía funciones de orden superior. Este lenguaje se ha convertido en uno de los lenguajes más populares en el campo de la inteligencia Artificial. Sin embargo, para que el lenguaje fuese práctico, fue necesario incluir características propias de los lenguajes imperativos como la asignación destructiva y los efectos laterales que lo alejaron del paradigma funcional. Actualmente ha surgido una nueva corriente defensora de las características funcionales del lenguaje encabezada por el dialecto Scheme, que aunque no es puramente funcional, se acerca a la definición original de McCarthy. En 1964, Peter Landin diseñó la máquina abstracta SECD para mecanizar la evaluación de expresiones, definió un subconjunto no trivial de Algol-60 mediante el cálculo lambda e introdujo la familia de lenguajes ISWIM (If You See What I Mean) con innovaciones sintácticas (operadores infijos y espaciado) y semánticas importantes.En 1978 J. Backus (uno de los diseñadores de FORTRAN y ALGOL) consiguió que la comunidad informática prestara mayor atención a la programación funcional con su artículo “Can Programming be liberated from the Von Neumann style?” en el que criticaba las bases de la programación imperativa tradicional mostrando las ventajas del modelo funcional.Además Backus diseñó el lenguaje funcional FP (Functional Programming) con la filosofía de definir nuevas funciones combinando otras funciones.

Page 21: Paradigmas y lenguajes (material complementario)

A mediados de los 70, Gordon trabajaba en un sistema generador de demostraciones denominado LCF que incluía el lenguaje de programación ML (Metalenguaje). Aunque el sistema LCF era interesante, se observó que el lenguaje ML podía utilizarse como un lenguaje de propósito general eficiente. ML optaba por una solución de compromiso entre el modelo funcional y el imperativo ya que, aunque contiene asignaciones destructivas y Entrada/Salida con efectos laterales, fomenta un estilo de programación claramente funcional. Esa solución permite que los sistemas ML compitan en eficiencia con los lenguajes imperativos. A mediados de los ochenta se realizó un esfuerzo de estandarización que culminó con la definición de SML (Stándar ML). Este lenguaje es fuertemente tipado con resolución estática de tipos, definición de funciones polimórficas y tipos abstractos. Actualmente, los sistemas en SML compiten en eficiencia con los sistemas en otros lenguajes imperativos y han aparecido proyectos como Fox Project 1994 [HL94] que pretenden desarrollar un nuevo lenguaje ML2000 con subtipos y módulos de orden superior.Al mismo tiempo que se desarrollaban FP y ML, David Turner (primero en la Universidad de St. Andrews y posteriormente en la Universidad de Kent) trabajaba en un nuevo estilo de lenguajes funcionales con evaluación perezosa y definición de funciones mediante encaje de patrones. El desarrollo de los lenguajes SASL (St. Andrews Static Language), KRC (Kent Recursive Calculator) y Miranda tenía como objetivo facilitar la tarea del programador incorporando facilidades sintácticas como las guardas, el encaje de patrones, las listas por comprehensión y las secciones.A comienzos de los ochenta surgieron una gran cantidad de lenguajes funcionales debido a los avances en las técnicas de implementación. Entre éstos, se podrían destacar Hope, LML, Orwell, Erlang, FEL, Alfl, etc. Esta gran cantidad de lenguajes perjudicaba el desarrollo del paradigma funcional. En septiembre de 1987, se celebró la conferencia FPCA en Portland, Oregon, en la que se discutieron los problemas que creaba esta proliferación. Se decidió formar un comité internacional que diseñase un nuevo lenguaje puramente funcional de propósito general denominado Haskell [Hud92].Con el lenguaje Haskell se pretendía unificar las características más importantes de los lenguajes funcionales. como las funciones de orden superior, evaluación perezosa, inferencia estática de tipos, tipos de datos definidos por el usuario, encaje de patrones y listas por comprehensión. Al diseñar el lenguaje se observó que no existía un tratamiento sistemático de la sobrecarga con lo cual se construyó una nueva solución conocida como las clases de tipos.El lenguaje incorporaba, además, Entrada/Salida puramente funcional y definición de arrays por comprehensión.En Mayo de 1996 aparecía la versión 1.3 del lenguaje Haskell [Has95] que incorporaba, entre otras características, mónadas para Entrada/Salida, registros para nombrar componentes de tipos de datos, clases de constructores de tipos y diversas librerías de propósito general. Posteriormente, surge la versión 1.4 con ligeras modificaciones.En 1998 se ha decidido proporcionar una versión estable del lenguaje, que se denominará Haskell98 a la vez que se continúa la investigación de nuevas características.La principal información sobre el lenguaje Haskell puede consultarse en la dirección: http://www.haskell.org

Page 22: Paradigmas y lenguajes (material complementario)

LispDespués de Fortran es el segundo lenguaje de programación de alto nivel. LISP fue creado por John McCarthy y sus colaboradores en el MIT.El elemento fundamental en LISP es la lista, en el sentido más amplio del término, pues tanto los datos como los programas son listas. De ahí viene su nombre, pues LISP es un acrónimo de "LIStProcessing".Los lenguajes de este tipo se llaman "aplicativos" o "funcionales", porque se basan en la aplicación de funciones a sus datos.En LISP se distinguen dos tipos fundamentales de elementos:

Átomos: son datos elementales y pueden pertenecer a varios tipos: números, caracteres, cadenas de caracteres y símbolos.

Listas: son secuencias de átomos o de listas encerradas entre paréntesis. Además, existe una lista especial, "nil", que es la lista nula, que no tiene ningún elemento.

En LISP, una función se expresa como una lista.Algunas de las funciones predefinidas de LISP tienen símbolos familiares (+ para la suma, * para el producto), pero otras son más exóticas, especialmente dos que sirven precisamente para manipular listas, descomponiéndolas en sus componentes.Sus nombres ("car" y "cdr") son un poco extraños, reliquias de tiempos pasados y de la estructura de los ordenadores de segunda generación, "car" devuelve la cabeza de una lista y "cdr" su cola o resto.LISP sigue una filosofía de tratamiento no-destructivo de los parámetros, de modo que la mayoría de las funciones devuelven un lista resultado de efectuar alguna transformación 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 código y los datos tengan el mismo tratamiento (como listas); esto hace especialmente sencillo escribir programas capaces de escribir otros programas según las circunstancias.Un lenguaje de programación derivado del Lisp es el Logo. Sin entrar en detalles, podría decirse que Logo es Lisp sin paréntesis y con operadores aritméticos infijos.

Ejemplo de código en Lisp

(defun fact (n) (if (<= n 1) 1 (* n (fact (- n 1)))))

(defun fibo (n) (if (<= n 2) 1 (+ (fibo (- n 1)) (fibo (- n 2)))))

PrologLa Programación Lógica es un Paradigma de Programación basado en la Lógica. Los programas construidos un lenguaje lógico están construidos únicamente por expresiones lógicas, es decir, que son ciertas o falsas, en oposición a un expresión interrogativa (una pregunta) o expresiones imperativas (una orden). Un ejemplo de lenguaje lógico es Prolog (Programación lógica).

Page 23: Paradigmas y lenguajes (material complementario)

Prolog, proveniente del inglés Programming in Logic, es un lenguaje lógico bastante popular en el medio de investigación en Inteligencia Artificial. Prolog es un lenguaje muy diferente, tanto de los imperativos como Fortran, Pascal, C etc, como de los funcionales como Lisp. En todos los mencionados, las instrucciones se ejecutan normalmente en orden secuencial, es decir, una a continuación de otra, en el mismo orden en que están escritas, que sólo varía cuando se alcanza una instrucción de control (un bucle, una instrucción condicional o una transferencia).

En Prolog, las cosas son distintas: el orden de ejecución de las instrucciones no tiene nada que ver con el orden en que fueron escritas. Tampoco hay instrucciones de control propiamente dichas. Para trabajar con este lenguaje, un programador debe acostumbrarse a pensar de una manera muy diferente a la que se utiliza en los lenguajes clásicos.

Las instrucciones de Prolog se llaman "reglas o cláusulas de Horn" y esencialmente pueden representarse así: "Hacer esto si se cumplen tales o cuales condiciones". Una instrucción se ejecutará automáticamente en cualquier momento en que se cumplan las condiciones especificadas. Además de las reglas, también se definen "factors" en la cual se aplicarán las reglas. Es decir, en Prolog, un programa consiste de una descripción lógica de una teoría y la computación es la deducción de la teoría para una dada consulta.

Ejemplo:

%%%% declaraciones%%padrede('juan', 'maria'). % juan es padre de mariapadrede('pablo', 'juan'). % pablo es padre de juanpadrede('pablo', 'marcela').padrede('carlos', 'debora').% A es hijo de B si B es padre de Ahijode(A,B) :- padrede(B,A).% A es abuelo de B si A es padre de C y C es padre Babuelode(A,B) :- padrede(A,C), padrede(C, B).% A y B son hermanos si el padre de A es tambien el padre de B y si A y B no son lo mismohermanode(A,B) :- padrede(C,A) , padrede(C,B), A <> B.% A y B son familiares si A es padre de B o A es hijo de B o A es hermano de Bfamiliarde(A,B) :- padrede(A,B) ; hijode(A,B) ; hermanode(A,B).%%%% consultas%%% juan es hermano de marcela??- hermanode('juan', 'marcela').si% carlos es hermano de juan??- hermanode('carlos', 'juan').no

Page 24: Paradigmas y lenguajes (material complementario)

% pablo es abuelo de maria??- abuelode('pablo', 'maria').si% maria es abuelo de pablo??- abuelode('maria', 'pablo').no

PerlPerl (Practical Extraction and Report Language) es un lenguaje de programación desarrollado por Larry Wall (lwall at netlabs.com) a partir otras herramientas de UNIX como son: ed,grep,awk,c-shell, para la administración de tareas propias de sistemas UNIX.No establece ninguna filosofía de programación concreta. No se puede decir que sea orientado a objetos, modular o estructurado aunque soporta directamente todos estos paradigmas y su punto fuerte son las labores de procesamiento de textos y archivos.No es ni un compilador ni un intérprete, esta en un punto intermedio, cuando mandamos a ejecutar un programa en Perl, se compila el código fuente a un código intermedio en memoria que se optimiza como si se fuera a elaborar un programa ejecutable pero es ejecutado por un motor, como si se tratase de un interprete.Lenguaje de programación basado en scripts portable a casi cualquier plataforma. Es muy utilizado para escribir CGIs.Lenguaje optimizado para el escaneo de texto arbitrario de ficheros. Es también un buen lenguaje para tareas de administración de sistemas. Es un lenguaje con intención de ser práctico en lugar de bonito. Satisface las tres virtudes del programador: flojera, impaciencia y petulancia.Según el manual, Perl también significa Pathologically Eclectic Rubbish Lister.

Resumen técnico de PERL.PERL es un lenguaje de script de tipo BCPL (como TCL o PHP), muy semejante al AWK (de hecho está basado en él), de tipo estructurado con trazas de orientación a objetos (no completamente soportado de forma directa), que permite el desarrollo rápido de aplicaciones y herramientas especialmente orientadas al tratamiento de textos y archivos, aunque actualmente también se utiliza incluso para entornos graficos, en combinación con sistemas como Perl/TK o GTK.Básicamente, es un lenguaje que se ha intentado que sea lo más natural posible, lo que conlleva que en ocasiones nos encontremos estructuras poco habituales en un lenguaje de este tipo:print "hola" if $saludo == 1;Destaca también el uso de variables especiales, muy habituales en los lenguajes de tipo script en los sistemas de tipo Unix. Estas variables permiten realizar una serie de operaciones sobre los datos y los archivos que aportan a PERL una flexibilidad y potencia enormes. Además de variables que podemos encontrar en otros lenguajes como @ARGV (indica los parámetros con los que se ha llamado al programa) o %ENV (indica las variables de entorno de la aplicación), podemos utilizar también variables como $_ (que representa el último dato que llegó por la entrada estandar), o $/, que nos indica si PERL debe enviar el texto a la salida estandar inmediatamente (o al flujo de salida que le hayamos indicado previamente). PERL tiene implementadas las expresiones regulares, (regular expressions), lo que le da una potencia muy grande en el procesamiento de textos.

Page 25: Paradigmas y lenguajes (material complementario)

PHPPHP (acrónimo de "PHP: Hypertext Preprocessor") es un lenguaje de programación de scripts, concebido en el tercer trimestre de 1994 por Rasmus Lerdorf. Se utiliza principalmente para la programación de CGIs para páginas web, destaca por su capacidad de ser embebido en el código HTML. Además, existe un compilador comercial (el Zend Optimizer).

Las primeras versiones no distribuidas al público fueron usadas en un sus páginas web para mantener un control sobre quien consultaba su currículum. La primera versión disponible para el público a principios de 1995 fue conocida como "Herramientas para paginas web personales" (Personal Home Page Tools). Consistían en un analizador sintáctico muy simple que solo entendía unas cuantas macros y una serie de utilidades comunes en las páginas web de entonces, un libro de visitas, un contador y otras pequeñas cosas.

PHP/FI

El analizador sintáctico fue reescrito a mediados de 1995 y fue nombrado PHP/FI version 2. FI viene de otro programa que Rasmus había escrito y que procesaba los datos de formularios. Así que combinó las "Herramientas para páginas web personales", el "intérprete de formularios", añadió soporte para mSQL y PHP/FI vio la luz. PHP/FI creció a gran velocidad y la gente empezó a contribuir en el código.

PHP 3

PHP 3 fue creado por Andi Gutmans y Zeev Zuraski en 1997 reescribiéndolo completamente, después de que encontraran que PHP/FI 2 tenía pocas posibilidades para desarrollar su propia aplicación comercial.Una de las mejores características de PHP 3 era su gran extensibilidad. Además de proveer a los usuarios finales de una sólida infraestructura para muchísimas bases de datos, protocolos y APIs. Las características de extensibilidad de PHP 3 atrajeron a docenas de desarrolladores a unirse y enviar nuevos módulos de extensión. Sin duda, ésta fue la clave del enorme éxito de PHP 3 frente a otras tecnologías de generación de páginas para la web.Todo el nuevo lenguaje fue liberado bajo un nuevo nombre, que borraba la implicación de uso personal limitado que tenía el nombre PHP/FI. Se llamó 'PHP' a secas, con el significado de ser un acrónimo recursivo "PHP: Hypertext Preprocessor". A finales de 1998, PHP creció hasta una base de instalación de decenas de millares de usuarios (estimados) y cientos de miles de sitios web informando de su instalación. En su apogeo, PHP 3 estaba instalado en aproximadamente un 10% de los servidores web en Internet.

PHP 4

Andi Gutmans y Zeev Suraski comenzaron a trabajar en la versión 4 reescribiendo el núcleo de PHP. Los objetivos de diseño fueron mejorar la ejecución de aplicaciones complejas, y mejorar la modularidad del código base de PHP. El nuevo motor, apodado 'Motor Zend' (comprimido de sus apellidos, Zeev y Andi), alcanzó estos objetivos de diseño satisfactoriamente, y se introdujo por primera vez a mediados de 1999. PHP 4, basado en

Page 26: Paradigmas y lenguajes (material complementario)

este motor, y acoplado con un gran rango de nuevas características adicionales, fue oficialmente liberado en Mayo de 2000.

PHP 5

En junio de 2003 se liberó la primera versión beta de PHP 5, con más mejoras sobre el motor Zend y otras importantes características como el soporte de datos XML y adaptación al protocolo IP versión 6.

Usos de PHP

Los principales usos del PHP son los siguientes: Programación de páginas dinámicas en servidores, habitualmente en combinación

con MySQL, aunque cuenta con soporte nativo para otras muchas bases de datos, soportando además ODBC, lo que le permite conectarse prácticamente a cualquier base de datos.

En combinación con PHP-GTK (la adaptación para PHP del entorno gráfico de Gimp), se pueden desarrollar aplicaciones de escritorio tanto para los sistemas operativos basados en Unix, como para Windows y Mac OS.

También puede ser utilizado como lenguaje de scripting en consola, al estilo de Perl, en Linux, Windows y Mac.

Ejemplo:

Sigue un ejemplo de una aplicación web sencilla, en PHP: <html> <head> <title>Ejemplo</title> </head> <body> <?php if (isset($_POST['muestra'])) { echo 'Hola, '.htmlentities($_POST['nombre']) .', tu comida favorita es:'. htmlentities($_POST['comida']); } else { ?> <form method="POST"> ¿Cuál es tu nombre? <input type="text" name="nombre"/> ¿Cuál es tu comida favorita? <select name="comida"> <option>Spaghetti</option> <option>Asado</option> <option>Pizza</option> </select> <input type="submit" name="muestra" value="Seguir"> </form>

Page 27: Paradigmas y lenguajes (material complementario)

<?php } ?> </body> </html>

Podemos Observar que: Las variables enviadas por un formulario por método POST, son recibidas en el

script dentro del arreglo $_POST, esto facilita tremendamente la obtención de datos y funciona para todas las fuentes de información en una aplicación web, desde cookies en el arreglo $_COOKIES, en el URL por $_GET, en la sesión por $_SESSION, del servidor y el cliente por $_SERVER.

Sintaxis embebida dentro del HTML, lo que permite diseñar la página Web en un editor común de HTML y añadir el código dinámico dentro de las etiquetas <?php ?>.

Operador de concatenación '.', que facilita el trabajo con cadenas de texto. Numerosas funciones de utilidad para aplicaciones Web como la función

htmlentitites(), que convierte los caracteres que tienen algun significado en el marcado HTML o que podrían desplegarse erróneamente en el navegador como acentos y diéresis, en sus equivalentes en formato HTML .

Su primera página con PHPComienze por crear un archivo llamado hola.php y colocarle en el "directorio raíz" (DOCUMENT_ROOT) con el siguiente contenido: Ejemplo 2-1. Nuestro primer script PHP: hola.php

<html> <head>  <title>Ejemplo de PHP</title> </head> <body> <?php echo "<p>Hola Mundo</p>"; ?></body></html>

Utilice su navegador web para acceder al archivo, con la URL terminando en "/hola.php". Si está programando localmente este URL lucirá algo como http://localhost/hola.php o http://127.0.0.1/hola.php pero esto depende de la configuración de su servidor web. Aunque este tema está fuera del alcance de este tutorial, también puede ver las directivas DocumentRoot y ServerName en la configuración de su servidor (en Apache, esto es httpd.conf). Si todo está configurado correctamente, el archivo será analizado por PHP y el siguiente contenido aparecerá en su navegador:

<html> <head>

Page 28: Paradigmas y lenguajes (material complementario)

<title>Ejemplo de PHP</title> </head> <body> <p>Hola Mundo</p> </body></html>

Note que esto no es como los scripts de CGI. El archivo no necesita ninguna clase especial de permisos para ser ejecutado. Piense en ellos como si fueran archivos HTML con un conjunto muy especial de etiquetas disponibles, y que hacen muchas cosas interesantes. Este programa es extremadamente simple, y no necesita usar PHP para crear una página como ésta. Todo lo que hace es mostrar: Hola Mundo usando la sentencia echo(). Si ha intentado usar este ejemplo, y no produjo ningún resultado, preguntando si deseaba descargar el archivo, o mostró todo el archivo como texto, lo más seguro es que PHP no se encuentra habilitado en su servidor. Pídale a su administrador que active esta función por usted, o use el capítulo titulado Instalación en el manual. Si está trabajando localmente, lea también el capítulo dedicado a la instalación, y asegúrese de que todo esté configurado apropiadamente. Si el problema continúa, por favor use una de las muchas opciones para obtener ayuda con PHP. El objetivo de este ejemplo es demostrar cómo puede usar las etiquetas PHP. En este ejemplo usamos <?php para indicar el inicio de la etiqueta PHP. Después indicamos la sentencia y abandonamos el modo PHP usando ?>. Puede salir de PHP y regresar cuantas veces lo desee usando este método. Para más información, puede leer la sección en el manual titulada Sintaxis básica de PHP.

Una nota acerca de editores de texto: Hay muchos editores de texto y Entornos Integrados de Desarrollo (IDE por sus siglas en Inglés) que puede usar para crear, editar, y organizar archivos PHP. Puede encontrar una lista parcial de éstos en Lista de editores de PHP. Si desea recomendar un editor, por favor visite la página mencionada anteriormente, y comunique su recomendación a las personas encargadas del mantenimiento para que lo incluyan en la lista. Contar con un editor que resalte la sintaxis de PHP puede ser de mucha ayuda.

Una nota acerca de los procesadores de palabras: Los procesadores de palabras como "StarOffice", "Microsoft word" y "Abiword" no son buenas opciones para editar archivos de PHP. Si desea usar uno de éstos programas para probar sus scripts, primero debe asegurarse de guardar el documento en formato de "Texto" puro, o PHP no será capaz de ejecutar el script.

Una nota acerca del "Bloc de Notas de Windows": Si desea escribir sus archivos PHP usando el "Bloc de Notas de Windows" o en algún otro editor de texto para Windows necesita asegurarse de que sus archivos sean guardados con la extensión .php (la mayoría de editores de texto en Windows automáticamente tratarán de añadir la extensión .txt a los archivos a menos que tome los siguientes pasos para prevenirlo). Cuando guarde sus archivos y el programa le pregunte qué nombre le desea dar al archivo, use

Page 29: Paradigmas y lenguajes (material complementario)

comillas para indicar el nombre (es decir, "hola.php"). Una alternativa es, en la lista de opciones "Archivos de Texto *.txt", seleccionar la opción "Todos los archivos *.*". Aquí puede escribir el nombre del archivo sin las comillas.

Ahora que ha creado un pequeño script de PHP que funciona correctamente, es hora de trabajar con el script de PHP más famoso; vamos a hacer una llamada a la función phpinfo() para obtener información acerca de su sistema y configuración como las variables predefinidas disponibles, los módulos utilizados por PHP, y las diferentes opciones de configuración. Tomemos unos segundos para revisar esta información

SQLSiglas de Structured Query Language (Lenguaje Estructurado de Consultas). Es un lenguaje declarativo que aúna características del Álgebra y el Cálculo Relacionales que nos permite lanzar consultas contra una Base de Datos para recuperar información de nuestro interés, almacenada en ella.

Ejemplo: SQL

SELECT Nombre From Tabl_fich_personales where Edad >=18;Muestra el Campo "Nombre" de todos los individuos mayores de 18 años de la tabla "Tabl_fich_personales"

UMLLenguaje Unificado de Modelado (UML, por sus siglas en inglés, Unified Modelling Language) es el lenguaje de modelado de sistemas de software más conocido en la actualidad; aún cuando todavía no es un estándar oficial, está apoyado en gran manera por la OMG.El UML cuenta con varios tipos de modelos, los cuales muestran diferentes aspectos de las entidades representadas.

Tipos de modelo

Funcional: Muestra la funcionalidad del sistema desde el punto de vista del usuario, incluye:

o Diagramas de caso de uso Objetos: Muestra la estructura y la subestructura del sistema usando objetos,

atributos, operaciones y asociaciones, incluye: o Diagramas de clase

Dinámico: Muestra el comportamiento interno del sistema, incluye: o Diagramas de secuencia o Diagramas de actividad o Diagramas de estado

Ejemplo de diagrama de caso de uso:

Page 30: Paradigmas y lenguajes (material complementario)

Este diagrama describe la funcionalidad (simplificada) de un sistema de restaurante, el comenzal puede comer, tomar vino y pagar; solo el cocinero puede preparar la comida.

Los casos de uso son los óvalos y las figuras con forma "humana" son los actores.La OMG define una notación gráfica para los casos de uso, pero se abstiene de definir algún formato escrito para describir los casos de uso en detalle; debido a esto algunas personas tienen el concepto erróneo acerca de que un caso de uso es su notación gráfica, cuando es la descripción escrita de escenarios la que da el verdadero valor al caso de uso.

Ejemplo de diagrama de clases:

Este diagrama describe la estructura (simplificada) de un sistema de restaurante. El sistema tiene cualquier cantidad de platillos, una cocina, comedor y cualquier número de empleados, todos estos

Page 31: Paradigmas y lenguajes (material complementario)

objetos asociados a un restaurante.

El UML muestra las relaciones es_un con un triángulo y las relaciones contiene con un rombo.

Ejemplo de diagrama de secuencia:

Este diagrama describe la secuencia (simplificada) de mensajes de un sistema de restaurante. El diagrama representa a un cliente pidiendo comida y pagando.

las líneas punteadas extendiéndose hacia abajo indican la línea de tiempo de cada objeto. Las flechas representan mensajes (estímulos) de un actor u objeto a otros objetos; en el ejemplo el cliente envía el mensaje de pago al cajero.

Programas de Software Libre para modelado en UML

ArgoUml , Herramienta de modelado UML escrito en java (enlace externo (http://argouml.tigris.org/))

Dia Puede ser usado para modelar varios tipos de diagramas UML (enlace externo (http://www.lysator.liu.se/~alla/dia/))

Umbrello Herramienta para modelado UML para el entorno KDE (enlace externo (http://uml.sourceforge.net/index.php))

UMLet Herramienta para modelado rápido de UML también escrita en java (enlace externo (http://qse.ifs.tuwien.ac.at/~auer/umlet/index.html))

Page 32: Paradigmas y lenguajes (material complementario)