Guía Del estudiante Modalidad a distancia Modulo: PARADIGMAS DE PROGRAMACION DATOS DE IDENTIFICACION TUTOR HECTOR MAURICIO LEAL PARGA Teléfono 000-000-0000 E-mail infingml@yahoo.es Lugar CERES – SABANA DE OCCIDENTE – Corporación Universitaria Minuto de Dios 1 BIENVENIDA La Corporación Universitaria Minuto de Dios. UNIMINUTO –Educación a Distancia le da la bienvenida al Modulo Paradigmas de Programación. Esperamos que una vez terminado éste adquiera los conocimientos fundamentales de gestión de contenidos de programación para que pueda continuar con el desarrollo del pregrado de forma exitosa, con la profundización que como profesional deberá alcanzar. Recuerde que la metodología a distancia implica un manejo las exigencias propias del nivel de formación y de las profesional, por ello su rol como estudiante cobrará mayor Aspectos fundamentales para la concepción formal de dedicación y compromiso. de sus tiempos acorde con estrategias propias de un relevancia y protagonismo. una disciplina basada en Le auspiciamos los mejores deseos por alcanzar los objetivos planteados y el éxito en su formación profesional. 2 INTRODUCCION En el desarrollo del modulo a través de guías se podrá encontrar conceptos básicos de los Paradigmas de la Programación, así como una introducción a lenguajes de programación como Lenguaje C, Lenguaje Scheme, Lenguaje Java y Prolog. Las definiciones son tomadas principalmente de documentos y lecturas extraídas de de Internet, También debemos indicar que los libros donde se basa esta este modulo son: Lenguajes de programación, y Fundamentos de programación. Estos libros han sido recomendados por IDEA, por lo tanto hay conceptos es extraída de estos libros. El impacto local, nacional e internacional que se pretende desarrollar en los estudiantes con el modulo Paradigmas de la programación (PDP), es que identifique las característica fundamentales de los lenguajes de programación y los paradigmas y que además comprenda, comenten y diferencien segmentos de código escrito en uno u otro lenguaje. 3 UNIDAD DE TRABAJO No.1 Introducción a la los Paradigmas de Programación (PDP) Preguntas Generadoras ¿Cuál es la diferencia entre un compilador y un intérprete? ¿Por qué la capacidad de los computadores influye en la evolución de los lenguajes de programación? ¿Un programa escrito en lenguaje de alto nivel se ejecuta más rápido que un programa escrito en lenguaje de bajo nivel? ¿En qué consiste la arquitectura de Von Neumann? ¿Qué constituye un entorno de programación? ¿Por qué es importante la portabilidad de un lenguaje de programación? INDICADORES Dominar los conceptos fundamentales de programación. TEMAS A DESARROLLAR EN LA UNIDAD Conceptos fundamentales de programación Reseña histórica de los Lenguajes de Programación Influencias en la evolución de los LP Atributos de un buen Lenguaje de Programación Modelos básicos de Paradigmas de los LP Nuevos Paradigmas de Programación 4 MARCO TEORICO DE FORMACION Conceptos fundamentales de programación ¿Por qué paradigmas? A lo largo de la historia de las ciencias de la computación han ido surgiendo herramientas, reglas, conceptos y otros elementos que permitieron la creación de los más variados lenguajes de programación. Algunos nacieron y al poco tiempo desaparecieron, mientras que otros hace años ya que se diseñaron y siguen vigentes. Muchos se fueron adaptando y renovándose para subsistir y se vuelven casi irreconocibles de sus orígenes y en cambio otros permanecen fieles a sus principios fundantes y casi inalterables, más allá de ciertos cambios cosméticos. Los equipos, las metodologías y los campos de aplicación se transformaron radicalmente. Si Von Neumman se levantara de su tumba y se sentara frente a las computadoras de última generación se sentiría tan perdido como el inventor de la rueda al volante de un fórmula 1. Sin embargo, es probable que así como el conductor constataría que el vehículo sigue teniendo ruedas o preguntaría cómo hacen ahora para hacerla girar, los desarrolladores de software de otras épocas no dudarían de preguntar... ¿y cómo es la entrada de datos? ¿cómo los representan? ¿y el control de secuencia? ¿sigue existiendo el efecto de lado? Y la respuesta de un ingeniero en sistemas de esta época sería “Y... según el paradigma”. Si algo caracteriza al panorama actual del desarrollo de sistemas es su complejidad y heterogeneidad. No existe una sola forma de pensar y encarar las soluciones, no son uniformes los conceptos que fundamentan los lenguajes, no es única la manera de programar. Los modelos de datos, estructuras de control, mecanismos de evaluación, sentencias, enlaces, expresiones, declaraciones y tantos otros elementos que conforman los lenguajes de programación actuales son muy diferentes entre unos y otros, hasta opuestos, pero es posible detectar cuáles son los conceptos que marcan diferencias mayores o menores, muestran puntos de contacto o de inflexión, establecen criterios de clasificaciones, y así, aportan elementos teóricos para sistematizar el análisis de la programación. 5 De esta manera, tiene sentido hablar de la existencia de diferentes “paradigmas” de programación que aportan los fundamentos teóricos y conceptuales para desarrollar sistemas de una manera en particular, incluso podríamos decir con una “filosofía” especial, que los caracterizan, identifican y a la vez diferencian de los otros paradigmas. Lenguajes Un lenguaje de programación es un lenguaje que permite establecer una comunicación entre el hombre y la máquina. Los lenguajes contienen un conjunto variado de comandos, instrucciones, reglas, formas de organizar los datos y otros elementos, que permiten codificar programas con los que se indican las tareas que la máquina debe realizar para procesar un conjunto de información determinado y resolver un problema. Para ello, en los lenguajes existe una sintaxis (las reglas que hacen a las formas) y una semántica (los significados). • La sintaxis de un lenguaje tiene que ver con la forma de los programas, es decir, con cómo deben escribirse las expresiones, los comandos, las declaraciones, y todo el código del programa para que sea entendible sin ambigüedades. • La semántica de un lenguaje se relaciona con el significado de los programas, con cómo deben comportarse cuando son ejecutados en una computadora. Traductores e intérpretes Un programa escrito mediante un lenguaje de programación, se llama fuente o simbólico. Pero éste programa fuente no es ejecutable, pues a la máquina le es ininteligible, requieren de un paso previo que implica la conversión del lenguaje artificial al lenguaje absoluto (o de máquina), que sí sea ejecutable. Los conversores de lenguaje fuente a ejecutable se pueden clasificar en traductores e intérpretes. Traductores Los traductores convierten el programa fuente a una versión equivalente en lenguaje de máquina y dejan “armada” esta versión (programa objeto) para que el computador la ejecute cuantas veces sea necesario sin que el traductor vuelva a intervenir. Los traductores que producen un código ejecutable (un programa objeto) que luego es ejecutado por el computador en forma directa cuantas veces se quiera. Son de dos tipos: ensambladores, también llamados compaginadores, y compiladores. 6 Un ensamblador es un programa que traduce un programa fuente escrito en un tipo especial de lenguaje, “assembler”, al lenguaje de máquina. La estructura del “assembler” es similar al lenguaje de máquina, código de operación y operando, pero en lugar de la notación hexadecimal se utilizan códigos mnemotécnicos. El programa ensamblador lee el programa fuente escrito con simbólicos, traduce los códigos de operación a códigos de operación en lenguaje de máquina y asigna direcciones de memoria para almacenar las instrucciones y los datos. Cada instrucción simbólica se traduce en una instrucción en lenguaje de máquina y por esta característica se lo llama lenguaje de bajo nivel. Los otros tipos de traductores son los compiladores. Estos traductores generan por cada sentencia del lenguaje fuente muchas instrucciones de lenguaje de máquina. Se los llama lenguajes de alto nivel. Un programa escrito en un lenguaje de bajo nivel es mucho más rápido que otro semejante, pero escrito en un lenguaje de alto nivel y luego traducido con un compilador, pues utiliza la menor cantidad de instrucciones de máquina necesarias para lograr el objetivo. El absoluto producido por un compilador tiene más instrucciones pues cada sentencia se expande en una cantidad de instrucciones de máquina. Esto se produce en tiempo de compilación y el programador no tiene control sobre la traducción, a lo sumo puede llegar a conocer que código es más eficiente. Por otra parte, los lenguajes de bajo nivel presentan mayor dificultad para depurar un programa, modificarlo y mantenerlo. Intérpretes Los intérpretes, a diferencia de los traductores, ejecutan las instrucciones del programa fuente, interpretando cada vez las sentencias del programa. Va traduciendo y ejecutando cada vez que el programa lo requiere, y no almacena programa objeto alguno. Lo que se almacena es el interprete que reside en memoria, el programa fuente, tablas de símbolos y datos necesarios para la ejecución del programa. La modalidad interpretativa tiene como ventaja sobre la traducción la posibilidad de poner a punto los programas con más rapidez, ya que entre prueba y prueba no hay que pasar por la etapa de una nueva compilación o traducción. Como desventaja en cambio, la interpretación es más lenta ya que cada vez que se debe ejecutar el programa debe traducir cada vez, cada una de las instrucciones que se ejecutan. En realidad los casos de interpretación pura o traducción pura son extremos. En la práctica y con el devenir del tiempo y el incremento de la velocidad de los procesadores, muchos lenguajes se implementan mediante una combinación de ambas técnicas o una traducción a un código intermedio que luego es interpretado. 7 Reseña histórica de los Lenguajes de Programación Los primeros lenguajes de programación surgieron de la idea de Charles Babagge, la cual se le ocurrió a este hombre a mediados del siglo XIX. Era un profesor matemático de la universidad de Cambridge e inventor ingles, que la principio del siglo XIX predijo muchas de las teorías en que se basan los actuales ordenadores. Consistía en lo que él denominaba la maquina analítica, pero que por motivos técnicos no pudo construirse hasta mediados del siglo XX. Con él colaboro Ada Lovedby, la cual es considerada como la primera programadora de la historia, pues realizo programas para aquélla supuesta maquina de Babagge, en tarjetas perforadas. Como la maquina no llego nunca a construirse, los programas de Ada, lógicamente, tampoco llegaron a ejecutarse, pero si suponen un punto de partida de la programación, sobre todo si observamos que en cuanto se empezó a programar, los programadores utilizaron las técnicas diseñadas por Charles Babagge, y Ada, que consistían entre otras, en la programación mediante tarjetas perforadas. A pesar de ello, Ada ha permanecido como la primera programadora de la historia. Se dice por tanto que estos dos genios de antaño, se adelantaron un siglo a su época, lo cual describe la inteligencia de la que se hallaban dotados. En 1823 el gobierno Británico lo apoyo para crear el proyecto de una máquina de diferencias, un dispositivo mecánico para efectuar sumas repetidas. Pero Babagge se dedico al proyecto de la máquina analítica, abandonando la máquina de diferencias, que se pudiera programar con tarjetas perforadas, gracias a la creación de Charles Jacquard (francés). Este hombre era un fabricante de tejidos y había creado un telar que podía reproducir automáticamente patrones de tejidos, leyendo la información codificada en patrones de agujeros perforados en tarjetas de papel rígido. Entonces Babagge intento crear la máquina que se pudiera programar con tarjetas perforadas para efectuar cualquier cálculo con una precisión de 20 dígitos. Pero la tecnología de la época no bastaba para hacer realidad sus ideas. Si bien las ideas de Babagge no llegaron a materializarse de forma definitiva, su contribución es decisiva, ya que los ordenadores actuales responden a un esquema análogo al de la máquina analítica. En su diseño, la máquina constaba de cinco unidades básicas: 1) Unidad de entrada, para introducir datos e instrucciones; 2) Memoria, donde se almacenaban datos y resultados intermedios; 3) Unidad de control, para regular la secuencia de ejecución de las operaciones; 4) Unidad Aritmético−Lógica, que efectúa las operaciones; 5) Unidad de salida, encargada de comunicar al exterior 8 los resultados. Charles Babbage, conocido como el "padre de la informática" no pudo completar en aquella época la construcción del computador que había soñado, dado que faltaba algo fundamental: la electrónica. El camino señalado de Babbage, no fue nunca abandonado y siguiéndolo, se construyeron los primeros computadores. Cuando surgió el primer ordenador, el famoso ENIAC (Electronic Numerical Integrator And Calculator), su programación se basaba en componentes físicos, o sea, que se programaba, cambiando directamente el Hardware de la maquina, exactamente lo que sé hacia era cambiar cables de sitio para conseguir así la Programación de la maquina. La entrada y salida de datos se realizaba mediante tarjetas perforadas. El estudio de los lenguajes de programación agrupa tres intereses diferentes; el del programador profesional, el del diseñador del lenguaje y del Implementador del lenguaje. Además, estos tres trabajos han de realizarse dentro de las ligaduras y capacidades de la organización de una computadora y de las limitaciones fundamentales de la propia "calculabilidad". El termino "el programador" es un tanto amorfo, en el sentido de que camufla importantes diferencias entre distintos niveles y aplicaciones de la programación. Claramente el programador que ha realizado un curso de doce semanas en COBOL y luego entra en el campo del procesamiento de datos es diferente del programador que escribe un compilador en Pascal, o del programador que diseña un experimento de inteligencia artificial en LISP, o del programador que combina sus rutinas de FORTRAN para resolver un problema de ingeniería complejo, o del programador que desarrolla un sistema operativo multiprocesador en ADA. En este trabajo, intentare clarificar estas distinciones tratando diferentes lenguajes de programación en el contexto de cada área de aplicación diferente. El "diseñador del lenguaje" es también un termino algo nebuloso. Algunos lenguajes (como APL y LISP) fueron diseñados por una sola persona con un concepto único, mientras que otros (FORTRAN y COBOL) son el producto de desarrollo de varios años realizados por comités de diseño de lenguajes. El "Implementador del lenguaje" es la persona o grupo que desarrolla un compilador o interprete para un lenguaje sobre una maquina particular o tipos de maquinas. Mas frecuentemente, el primer compilador para el lenguaje Y sobre la maquina X es desarrollada por la corporación que manufactura la maquina X . Por ejemplo, hay varios compiladores de Fortran en uso; uno desarrollado por IBM para una maquina IBM, otro desarrollado por DEC para una maquina DEC, otro por CDC, y así sucesivamente. Las compañías de software también desarrollan compiladores y también lo hacen los grupos de investigación de las universidades. Por ejemplo, la universidad de Waterloo desarrolla compiladores para FORTRAN Y PASCAL, los cuales son se adelantaron un siglo a su época, lo cual describe la inteligencia de la que se hallaban dotados. 9 En 1823 el gobierno Británico lo apoyo para crear el proyecto de una máquina de diferencias, un dispositivo mecánico para efectuar sumas repetidas. Pero Babagge se dedico al proyecto de la máquina analítica, abandonando la maquina de diferencias, que se pudiera programar con tarjetas perforadas, gracias a la creación de Charles Jacquard (francés). Este hombre era un fabricante de tejidos y había creado un telar que podía reproducir automáticamente patrones de tejidos, leyendo la información codificada en patrones de agujeros perforados en tarjetas de papel rígido. Entonces Babagge intento crear la máquina que se pudiera programar con tarjetas perforadas para efectuar cualquier cálculo con una precisión de 20 dígitos. Pero la tecnología de la época no bastaba para hacer realidad sus ideas. Si bien las ideas de Babagge no llegaron a materializarse de forma definitiva, su contribución es decisiva, ya que los ordenadores actuales responden a un esquema análogo al de la máquina analítica. En su diseño, la máquina constaba de cinco unidades básicas: 1) Unidad de entrada, para introducir datos e instrucciones; 2) Memoria, donde se almacenaban datos y resultados intermedios; 3) Unidad de control, para regular la secuencia de ejecución de las operaciones; 4) Unidad Aritmético−Lógica, que efectúa las operaciones; 5) Unidad de salida, encargada de comunicar al exterior los resultados. Charles Babbage, conocido como el "padre de la informática" no pudo completar en aquella época la construcción del computador que había soñado, dado que faltaba algo fundamental: la electrónica. El camino señalado de Babbage, no fue nunca abandonado y siguiéndolo, se construyeron los primeros computadores. 2) Cuando surgió el primer ordenador, el famoso ENIAC (Electronic Numerical Integrator And Calculator), su programación se basaba en componentes físicos, o sea, que se programaba, cambiando directamente el Hardware de la maquina, exactamente lo que sé hacia era cambiar cables de sitio para conseguir así la programación de la maquina. La entrada y salida de datos se realizaba mediante tarjetas perforadas. El estudio de los lenguajes de programación agrupa tres intereses diferentes; el del programador profesional, el del diseñador del lenguaje y del Implementador del lenguaje. Además, estos tres trabajos han de realizarse dentro de las ligaduras y capacidades de la organización de una computadora y de las limitaciones fundamentales de la propia "calculabilidad". El término "el programador" es un tanto amorfo, en el sentido de que camufla importantes diferencias entre distintos niveles y aplicaciones de la programación. Claramente el programador que ha realizado un curso de doce semanas en COBOL y luego entra en el campo del procesamiento de datos es diferente del programador que escribe un compilador 10 en Pascal, o del programador que diseña un experimento de inteligencia artificial en LISP, o del programador que combina sus rutinas de FORTRAN para resolver un problema de ingeniería complejo, o del programador que desarrolla un sistema operativo multiprocesador en ADA. En este trabajo, intentare clarificar estas distinciones tratando diferentes lenguajes de programación en el contexto de cada área de aplicación diferente. El "diseñador del lenguaje" es también un termino algo nebuloso. Algunos lenguajes (como APL y LISP) fueron diseñados por una sola persona con un concepto único, mientras que otros (FORTRAN y COBOL) son el producto de desarrollo de varios años realizados por comités de diseño de lenguajes. El "Implementador del lenguaje" es la persona o grupo que desarrolla un compilador o interprete para un lenguaje sobre una maquina particular o tipos de maquinas. Mas frecuentemente, el primer compilador para el lenguaje Y sobre la maquina X es desarrollada por la corporación que manufactura la maquina X . Por ejemplo, hay varios compiladores de Fortran en uso; uno desarrollado por IBM para una maquina IBM, otro desarrollado por DEC para una maquina DEC, otro por CDC, y así sucesivamente. Las compañías de software también desarrollan compiladores y también lo hacen los grupos de investigación de las universidades. Por ejemplo, la universidad de Waterloo desarrolla compiladores para FORTRAN PASCAL, los cuales son parte, el interprete ejecuta directamente las instrucciones en un lenguaje Y de alto nivel, sin un paso de procesamiento previo. La compilación es, en general, un proceso más eficiente que la interpretación para la mayoría de los tipos de maquina. Esto se debe principalmente a que las sentencias dentro de un "bucle" deben ser reinterpretadas cada vez que se ejecutan por un interprete. Con un compilador. Cada sentencia es interpretada y luego traducida a lenguaje maquina solo una vez. Algunos lenguajes son lenguajes principalmente interpretados, como APL, PROLOG y LISP. El resto de los lenguajes −− Pascal, FORTRAN, COBOL, PL/I, SNOBOL, C, Ada y Modula−2 − son normalmente lenguajes compilados. En algunos casos, un compilador estará utilizable alternativamente para un lenguaje interpretado (tal como LISP) e inversamente (tal como el interprete SNOBOL4 de los laboratorios Bell). Frecuentemente la interpretación es preferible a la compilación en un entorno de programación experimental o de educación, donde cada nueva ejecución de un programa implicado un cambio en el propio texto del programa. La calidad de diagnosis y depuración que soportan los lenguajes interpretados es generalmente mejor que la de los lenguajes compilados, puesto que los mensajes de error se refieren directamente a sentencias del texto del programa original. Además, la ventaja de la eficiencia que se adjudica tradicionalmente a los lenguajes compilados frente a los interpretados puede pronto ser eliminado, debido a la evolución de las maquinas cuyos lenguajes son ellos mismos1lenguajes de alto nivel. Como ejemplo de estos están las nuevas maquinas LISP, las cuales han sido diseñadas recientemente por Symbolics y Xerox Corporations. 11 Los lenguajes de Programación son tomados de diferentes perspectivas. Es importante para un programador decidir cuales conceptos emitir o cuales incluir en la programación. Con frecuencia el programador es osado a usar combinaciones de conceptos que hacen al lenguaje "DURO" de usar, de entender e implementar. Cada programador tiene en mente un estilo particular de programación, la decisión de incluir u omitir ciertos tipos de datos que pueden tener una significativa influencia en la forma en que el Lenguaje es usado, la decisión de usar u omitir conceptos de programación o modelos. Influencias en la evolución de los LP Aplicaciones científicas. Gran cantidad de cómputos sobre grandes números en punto flotante. El principal exponente en esta categoría es Fortran. Aplicaciones de negocios. Gran producción de reportes, manejos de números decimales y caracteres. El lenguaje más destacado: COBOL. Inteligencia Artificial , EFICIENCIA, PORTABILIDAD, COMPLEJIDAD. Dominios de programación. Manipulación de símbolos en lugar de manipulación numérica - Ejemplo: LISP Programación de Sistemas – Base de datos Búsqueda de eficiencia (por uso continuo). Software para la web Colección ecléctica de lenguajes: Mark‐up languages: XHTML, Scipting: PHP, Proposito general: JAVA Atributos de un buen Lenguaje de Programación Claridad, simplicidad y unidad de conceptos - Ortogonalidad. Naturalidad para la aplicación. Soporte de abstracciones. Facilidad de verificación de programas. Ambiente de programación. Portabilidad de programas. Costo de uso: costo de ejecución costo de traducción 12 costo de creación, testeo y uso costo de mantenimiento Modelos básicos de Paradigmas de los LP LENGUAJES DE PROGRAMACIÓN DECLARATIVOS Se les conoce como lenguajes declarativos en ciencias computacionales a aquellos lenguajes de programación en los cuales se le indica a la computadora qué es lo que se desea obtener o qué es lo que se esta buscando, por ejemplo: Obtener los nombres de todos los empleados que tengan más de 32 años. Eso se puede lograr con un lenguaje declarativo como SQL. La programación declarativa es una forma de programación que implica la descripción de un problema dado en lugar de proveer una solución para dicho problema, dejando la interpretación de los pasos específicos para llegar a dicha solución a un intérprete no especificado. La programación declarativa adopta, por lo tanto, un enfoque diferente al de la programación imperativa tradicional. En otras palabras, la programación declarativa provee el “qué”, pero deja el “cómo” liberado a la implementación particular del intérprete. Por lo tanto se puede ver que la programación declarativa tiene dos fases bien diferenciadas, la declaración y la interpretación. Es importante señalar que a pesar de hacer referencia a intérprete, no hay que limitarse a “lenguajes interpretados” en el sentido habitual del término, sino que también se puede estar trabajando con “lenguajes compilados”. CARACTERÍSTICAS DE LOS LENGUAJES DE PROGRAMACIÓN DECLARATIVOS Los lenguajes declarativos están orientados a buscar la solución del problema, sin preocuparse por la forma de llegar a ello; es decir, el programador debe concentrarse en la lógica del algoritmo, más que en el control de la secuencia. Los programas están formados por un conjunto de definiciones o ecuaciones, las cuales describen lo que debe ser calculado, no en sí la forma de hacerlo. Las variables sólo pueden tener asignado un solo valor a lo largo de la ejecución del programa, lo cual implica que no puede existir asignación destructiva. Debido a esto, cobra especial importancia el uso del anidamiento y la recursividad. Las listas representan la estructura fundamental de datos. El orden de la ejecución no resulta importante debido a que no existen efectos colaterales; es decir, que al calcular un valor, resulta imposible 13 afectar el cálculo de otros y con esto se puede afirmar que cualquier secuencia de ejecución deberá conducir al mismo resultado. Las expresiones o definiciones pueden ser usadas como valores y por lo tanto se pueden tratar como argumentos de otras definiciones. El control de la ejecución no es responsabilidad del programador. DESVENTAJAS DE LA PROGRAMACIÓN DECLARATIVA La principal desventaja de la programación declarativa es que no puede resolver cualquier problema dado, sino que está restringida al subconjunto de problemas para los que el intérprete o compilador fue diseñado. Otra desventaja de la programación declarativa está relacionada con la eficiencia. Dado que es necesaria una fase de interpretación extra, en la cual se deben evaluar todas las consecuencias de todas las declaraciones realizadas, el proceso es relativamente más lento que en la programación imperativa, en que los cambios de estado del sistema están dados por instrucciones particulares y no por un conjunto de condiciones arbitrariamente grande. VENTAJAS DE LA PROGRAMACIÓN DECLARATIVA A pesar de lo anterior existen algunas ventajas en el uso de la programación declarativa. Entre las ventajas se destaca que la solución de un problema se puede realizar con un nivel de abstracción considerablemente alto, sin entrar en detalles de implementación irrelevantes, lo que hace a las soluciones más fácil de entender por las personas. La resolución de problemas complejos es resuelta por el intérprete a partir de la declaración de las condiciones dadas. La programación declarativa es muy usada en la resolución de problemas relacionados con inteligencia artificial, bases de datos, configuración, y comunicación entre procesos; sin embargo, ningún leguaje declarativo se aproxima en popularidad a los lenguajes imperativos. EJEMPLOS DE LENGUAJES DECLARATIVOS Algunos lenguajes declarativos que se pueden mencionar son: PROLOG SQL HTML WSDL (Web Services Description Language) XML Stylesheet Language for Transformation 14 PROGRAMACIÓN LÓGICA La idea fundamental de la programación lógica consiste en emplear la lógica como lenguaje de programación. La lógica no es imperativa porque no sirve para indicar cómo resolver un problema (órdenes). La lógica es declarativa porque sirve para especificar qué problema resolver (condiciones). En la programación lógica, se especifican las condiciones que satisfacen las soluciones, se deducen las soluciones a partir de las condiciones y el énfasis de todo está en qué problema resolver. El problema se describe especificando qué caracteriza a sus posibles soluciones. La programación lógica, junto con la funcional, forma parte de lo que se conoce como programación declarativa. En los lenguajes tradicionales, la programación consiste en indicar cómo resolver un problema mediante sentencias; en la programación lógica, se trabaja de forma descriptiva, estableciendo relaciones entre entidades, indicando no cómo, sino qué hacer. Se establece entonces que la idea esencial de la programación lógica es: algoritmos = lógica + control. Es decir, un algoritmo se construye especificando conocimiento en un lenguaje formal (lógica de primer orden), y el problema se resuelve mediante un mecanismo de inferencia (control) que actúa sobre aquél. Al hacer un recorrido por la programación lógica, aparece como uno de sus lenguajes más representativos, Prolog, que es un clásico de la inteligencia artificial y que se aplica de múltiples formas en el desarrollo de software comercial. PROGRAMACIÓN FUNCIONAL La programación funcional es un paradigma de programación declarativa basado en la utilización de funciones matemáticas. El objetivo de la programación funcional 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. 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 (pues la programación funcional es declarativa), 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. 15 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 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 permitir 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 híbrido. Nuevos Paradigmas de Programación Paradigma Heurístico Definición El Paradigma Heurístico se basa en una forma de modelar el problema, en lo que respecta a la representación de su estructura, estrategias de búsqueda y métodos de resolución, mediante reglas de “buena lógica” o reglas de “sentido común”, denominadas heurísticas16, las cuales proporcionan entre varios cursos de acción uno que presenta visos de ser el más “prometedor”, pero no garantiza necesariamente el curso de acción más efectivo. El entorno de programación heurístico es un entorno basado en el conocimiento humano (la experiencia), adaptativo, incremental y simbólico, y aplicable a ominios específicos en los que una buena heurística guía un proceso algorítmico o roporciona resultados superiores a éste. Principales características Las especificaciones más relevantes del tratamiento heurístico deben tener en cuenta las características de la heurística, de la información y de las especificaciones del problema: Simpleza y velocidad 16 Una buena heurística debe ser simple, con velocidad de búsqueda que no se incremente exponencialmente, precisa y robusta. Inexactitud La información a tratar es fundamentalmente inexacta, simbólica o limitada, como también los resultados obtenidos, en los que no se puede garantizar un 100% de exactitud. Incorporación del conocimiento La información utilizada como criterio para decidir entre los distintos cursos de acción está basada en el conocimiento previo sobre el dominio del problema, y tiene un crecimiento "incremental" a medida que se avanza en la ejecución, incorporando el conocimiento obtenido durante la búsqueda. Optimización o satisfacción Las especificaciones del problema deben ser claras y pueden ser de optimización de soluciones previas o de satisfacción de nuevos problemas, y por otro lado, pueden producir una o múltiples soluciones. Campo de aplicación Dado que el ser humano opera la mayor parte de las veces utilizando heurística, este tipo de programación se aplica con mayor intensidad en el campo de la Inteligencia Artificial y en especial, en el de la Ingeniería del Conocimiento. En aquellos problemas cuya solución implica potencialmente una búsqueda exhaustiva de todas las posibles combinaciones de algún conjunto finito, que puede producir un incremento exponencial del espacio de búsqueda, que lo hace muy difícil de tratar e incluso imposible, las técnicas heurísticas guían la búsqueda de soluciones por las direcciones que parecen ser las más adecuadas, en base al conocimiento específico sobre el problema en particular, y así evitan recorrer todas las posibilidades. Se suele utilizar un modelo heurístico cuando proporciona resultados superiores a los de otros modelos, en general en los siguientes casos: • Los datos del modelo son limitados o pueden contener errores inherentes. Se construye un modelo simplificado e impreciso de un problema real, por lo que la solución "óptima" es puramente académica. • No se dispone de un método exacto que sea fiable para ser aplicado en el modelo del problema, o si existe, es intratable computacionalmente. 17 • Se desea mejorar la eficacia de un algoritmo realizado con técnicas no Heurísticas. Lenguajes El Paradigma Heurística no ha producido un lenguaje específico de programación que soporte todas sus características, pero las técnicas heurísticas, se pueden implementar con lenguajes de otros paradigmas de Programación. Paradigma Concurrente Definición El concepto fundamental de la programación concurrente que da sentido a la existencia del paradigma concurrente, diferenciándolo de otros paradigmas, es la noción de proceso. Un proceso corresponde a un cálculo secuencial con su propio seguimiento de control. Su seguimiento es la secuencia de puntos en el programa que son alcanzados mientras el control fluye a través del código del programa. La ejecución simultánea de más de un proceso permite que cooperen para resolver un mismo problema y, a la vez, requiere necesariamente que compartan los recursos del sistema y compitan por acceder a ellos. Para lograrlo, se implementan distintas estrategias de interacción entre los procesos. Principales características: Comunicación y sincronización de procesos La interacción entre procesos se basa en mecanismos de comunicación y sincronización. La comunicación implica el intercambio de datos entre procesos, ya sea por medio de un mensaje implícito o a través de valores de variables compartidas. Una variable es compartida entre procesos si es visible al código de esos procesos. La sincronización relaciona el seguimiento de un proceso con el seguimiento de otro. Si p es un punto en el seguimiento de un proceso P, y q es un punto en el seguimiento de un proceso Q, entonces la sincronización puede usarse para 18 restringir el orden en el cual P alcanza p y Q alcanza q. En otras palabras, la sincronización implica el intercambio de información de control entre procesos. Competencia y cooperación La necesidad de contar con comunicación y sincronización puede verse en términos de competencia y cooperación entre procesos. La competencia ocurre cuando el proceso requiere el uso exclusivo de un recurso, como cuando dos procesos compiten por usar a la vez un mismo dispositivo de hardware, o para realizar una transacción sobre una misma estructura de datos. Aquí la sincronización es necesaria para garantizar a un proceso el uso exclusivo de un recurso. La cooperación ocurre cuando dos procesos trabajan sobre distintos aspectos del mismo problema, y por lo general incluye a la comunicación y la sincronización. ejecución. Por ejemplo, un programa solicita dos recursos iguales, y uno de ellos sólo es tomado si ya tomó el otro en primer lugar. Dos de estos procesos entrarían en interbloqueo porque cuando cada uno tome un recurso, no podrá tomar el otro, y no podrán avanzar. Otra situación es el estancamiento (o inanición), en el cual el sistema no está en interbloqueo, pero ningún proceso avanza. Supongamos que el proceso anterior cambia su lógica para pedir dos recursos, y libera el primero si no puede tomar el segundo. Por lo tanto, dos de estos procesos ejecutando concurrentemente entrarían en un ciclo infinito: tomar el primero, liberar el primero, tomar el primero, etc. Mecanismos concurrentes Para concretar la sincronización y comunicación entre procesos y garantizar que se complete la ejecución de todos ellos, existen numerosas estrategias y mecanismos. Algunos de ellos son: • Rendezvouz • Monitores • Semáforos Campo de aplicación La programación concurrente tiene aplicación en los más variados campos y 19 se ha potenciado su uso con el crecimiento de las redes de todo tipo. Tradicionalmente, uno de sus utilidades básicas es en el diseño de sistemas operativos. Lenguajes No hay en la actualidad lenguajes de programación exclusivos del paradigma concurrente, sino que existen lenguajes propios de otros paradigmas que incluyen en su definición conceptos y servicios aptos para que soporten la concurrencia. Taller No 1 20 CALENDARIO DEL MODULO (Se define por semanas y Núcleos temáticos según Matriz de Acuerdos pedagógicos) UNIDAD DE APRENDIZAJE ACTIVIDADES DE APRENDIZAJE SEMANA Inducción y Acuerdos Se entrega Matriz temática al estudiante fotocopiada para realizar acuerdos pedagógico del Modulo PDP NT1. Introducción a los paradigmas de programación Documentos – Wiki - 1 2 NT2. Programación Imperactiva o procedural Documentos – Wiki - NT3. Programación Funcional Documentos – Wiki - NT4. Programación orientada a objetos Documentos – Wiki - TALLERES – Preguntas Generadoras (Situaciones – Problemas) Aprendizaje – Significativo – Portafolio. PRODUCTOS – FINALES - Practicas pedagógicas productiva - (Temáticas y Portafolio). Seguimiento de: Temáticas y Portafolio – Según – Criterios. TALLERES – Preguntas Generadoras (Situaciones – Problemas) Aprendizaje – Significativo – Portafolio. TALLERES Ejercicios- Portafolio PRUEBA – DIRECTA - (Evaluación Escrita)- Portafolio PRODUCTOS – FINALES - Practicas pedagógicas productiva - (Temáticas y Portafolio). Seguimiento de: Temáticas y Portafolio – Según – Criterios. TALLERES – Preguntas Generadoras (Situaciones – Problemas) Aprendizaje – Significativo – Portafolio. TALLERES Ejercicios- Portafolio PRODUCTOS – FINALES - Practicas pedagógicas productiva - (Temáticas y Portafolio). Seguimiento de: Temáticas y Portafolio – Según – Criterios. TALLERES – Preguntas Generadoras (Situaciones – Problemas) Aprendizaje – Significativo – Portafolio. TALLERES Ejercicios- Portafolio PRUEBA – DIRECTA - (Evaluación Escrita)- Portafolio PRODUCTOS – FINALES - Practicas pedagógicas productiva - (Temáticas y Portafolio). Seguimiento de: Temáticas y Portafolio – Según – Criterios. 3 4 5 21 TALLERES – Preguntas Generadoras (Situaciones – Problemas) Aprendizaje – Significativo – Portafolio. TALLERES Ejercicios- Portafolio PRUEBA – DIRECTA - (Evaluación Escrita)- Portafolio PRODUCTOS – FINALES - Practicas pedagógicas productiva - (Temáticas y Portafolio). Seguimiento de: Temáticas y Portafolio – Según – Criterios. Convocatoria No 1. Sustentación – Productos Finales. Presentación y Sustentación de Portafolio Convocatoria No 2. Entrega de Notas Entrega de carpetas Retroalimentación y entrega de Nota Final Entrega de carpeta a Coordinación. NT5. Programación Lógica. Documentos – Wiki - 6 7 8 22 METODOLOGIA En la educación a distancia en CERES – Sabana de Occidente del Modulo Paradigmas de la Programación, es importante que el estudiante de Ingeniería de Sistemas asuma una estricta responsabilidad con sus procesos, condición que lo lleva a adquirir autoesigencia con su aprendizaje. El estudiante debe considerar la capacidad para organizar el tiempo de su estudio por sí mismo (autodisciplina), para poder cumplir con TALLERES – Preguntas Generadoras (Situaciones – Problemas) Aprendizaje – Significativo – y Portafolio. TALLERES Ejercicios- y Portafolio, PRUEBA – DIRECTA - (Evaluación Escrita)-, Portafolio y PRODUCTOS – FINALES - Practicas pedagógicas productiva - (Temáticas y Portafolio), y Seguimiento de: Temáticas y Portafolio – Según – Criterios. Usted ingeniero cuenta con varios recursos a su disposición los cuales le ayudaran a alcanzar la competencia al final de este modulo. Ellos son: Texto de Estudio. Guía de Estudio. El espacio tutorial. Material Interactivo (Wiki implementada por el tutor – Mauricio Leal Parga para el trabajo colaborativo con los estudiantes de PDP). Bibliografía ALONSO AMO, F y SEGOVIA PEREZ, F. Entornos y Metodologías de Programación. Paraninfo. GHEZZI, Carlo y JAZAYERI, Mehdi. Conceptos de Lenguajes de Programación. Díaz de los Santos. RAVI y SETHI. Lenguajes de programación - Conceptos y constructores. Addison Wesley. 23 ing. Lucas Spigariol - Buenos Aires – Abril 2005. Fundamentos teóricos de los Paradigmas de Programación: Cátedra de Paradigmas de programación, Facultad Regional Buenos Aires - Universidad Tecnológica Nacional, Coordinación. Análisis Comparativo de Lenguajes Teoría 1: Estudio de los Lenguajes de Programación Aspectos del Diseño de los Lenguajes de Programación Departamento de Informática - Facultad de Cs. Fco. Matemáticas y Naturales Universidad Nacional de San Luis San Luis – Argentina. Documentos de internet Tipos de Lenguajes de Programación. Jaime Oswaldo Montoya Guzmán - jaimemontoya@gmail.com - www.monografias.com WWW.LAWEBDELPROGRAMADOR.ES WWW.PROGRAMANDO.COM Lecturas complementarias. PARADIGMAS DE LA PROGRAMACION - Instituto Tecnológico de Celaya. Revisión de conceptos fundamentales de programación - Prof. Ing. M.C.Sambuelli HISTORIA Y EVOLUCIÓN DE LOS LENGUAJES DE PROGRAMACIÓN - WWW.LAWEBDELPROGRAMADOR.ES LENGUAJES DE PROGRAMACIÓN - Javier Martín Centro Asociado de Móstoles UNED Fundamentos teóricos de los Paradigmas de Programación - Cátedra de Paradigmas de Programación - Facultad Regional Buenos Aires Universidad Tecnológica Nacional - Ing. Lucas Spigariol - Buenos Aires – Abril 2005 Wiki Espacio creado por el Tutor Mauricio Leal Parga – donde se publican periódicamente – documentos y lecturas, Talleres, Preguntas Generadoras, Guías. Del Modulo Teoría 24 general de sistemas. Es de anotar que la información aquí publicada se puede descargar. EVALUACION TALLERES – Preguntas Generadoras (Situaciones – Problemas) Aprendizaje – Significativo – Portafolio. TALLERES Ejercicios- Portafolio PRUEBA – DIRECTA - (Evaluación Escrita)- Portafolio PRODUCTOS – FINALES - Practicas pedagógicas productiva - (Temáticas y Portafolio). Seguimiento de: Temáticas y Portafolio – Según – Criterios. Presentación y sustentación de talleres de PDP. Presentación y Sustentación de Preguntas Generadoras Presentación y Sustentación de Portafolio LABORATORIOS - (Trabajo – Práctico) - Portafolio 25 POLITICAS A continuación se presentan los siguientes enunciados que se deben cumplir para dar orden al proceso de aprendizaje, que orientan a cada estudiante para que cada participante presente sus actividades para poder alcanzar las competencias necesarias para la aprobación del modulo. Estas políticas dan una estructura al trabajo de todos. Tutor y estudiante. Documentos – E-Mail o la Wiki (El estudiante debe consultar periódicamente su correo electrónico o la Wiki donde se le envían documentos y lecturas, talleres, preguntas generadoras, guías de cada Núcleo Temático – NT). El estudiante debe resolver las Preguntas Generadoras de cada Núcleo, como política de cumplimiento de la metodología de la educación a distancia del proyecto CERES. Los talleres serán enviados al E-Mail de cada estudiante semanalmente, para resolverlos por dada Núcleo Temático. Se realizara LABORATORIO - (Trabajo – Práctico) – y es de obligatoriedad su asistencia. Se realizaran Pruebas escritas, finalizando cada sesión de tutorías según Núcleos Temáticos. El estudiante debe exponer libremente sus ideas, mediante momentos de discusión, reflexión donde se promueva el desarrollo autónomo, con un aporte de índole social en la ampliación de su profesión. El estudiante debe presentar Memorias de temática expuesta. El estudiante debe presentar temáticas y portafolios según acuerdo. El estudiante debe presentar y sustentar talleres realizados en PDP. El estudiante debe presentar y sustentar el desarrollo de preguntas generadoras. El estudiante debe presentar y sustentar el Portafolio del modulo –PDP- Rol del Tutor: El propósito fundamental como tutor es el de dar un servicio a los estudiantes, facilitando su proceso de aprendizaje y el logro de sus competencias. La supervisión que hago se enfocará tanto a los procesos, como a los productos de aprendizaje que evidencien 26 desarrollo de habilidades que conlleven a alcanzar la competencia, para ello asumo entre otros los compromisos de: Atender directamente a los estudiantes a él asignados utilizando diversos medios: encuentro tutorial, e-mail, Wiki, sistemas de mensajería y laboratorios prácticos. Asistir al lugar de tutoría asignado, en la hora y el día indicados previamente para tal fin. Respetar el calendario académico y cada una de las actividades propuestas en el. Guiar, facilitar, asesorar y orientar al estudiante en su proceso de aprendizaje. Suscitar la reflexión e indagar a los estudiantes sobre su proceso de aprendizaje. Evaluar las actividades teniendo en cuenta los criterios de evaluación socializados al estudiante al plantearse la actividad. Retroalimentar las actividades y sus evidencias de competencia en las fechas acordadas. Las dudas académicas serán atendidas directamente por el Tutor, o por E-mail y medios como foros en aulas virtuales y Wiki. Rol del estudiante Los estudiantes son participantes, honestos y comprometidos que como tales, son los principales responsables de iniciar, dirigir y sostener sus propios procesos de aprendizaje. Cada estudiante se compromete a propiciar las condiciones que estén a su alcance para maximizar las oportunidades de aprendizaje de acuerdo a su contexto y posibilidades. De igual forma se asume que nuestros estudiantes no incurrirán en actos deshonestos y de plagio intelectual de ideas en las diversas formas de interacción, actividades terminales e intermedias. Se espera que los estudiantes participen activamente en cada una de las actividades descritas en la guía de estudio, para ello es necesario tener en cuenta que: El estudiante es el protagonista del proceso de aprendizaje, que lo lleva a ser más activo y propositivo, por consiguiente a desarrollar el auto – estudio. Debe estar preparado para participar activamente de las actividades de aprendizaje, habiendo leído los contenidos de su texto de estudio y materiales adicionales relacionados en la guía de estudio, documentos y lecturas complementarias. 27 Debe realizar las actividades planteadas en la guía de estudio, entregando las evidencias de manera acorde a lo planteado en los criterios de evaluación, dentro de los tiempos establecidos en el calendario y bajo las instrucciones descritas en cada actividad. En las evidencias escritas, deberá saber citar las fuentes, es decir usar debidamente la bibliografía a fin de evitar el plagio. Guía Elaborada por el Tutor HECTOR MAURICIO LEAL PARGA Uso exclusivo de estudiantes - II Semestre de Ingeniería de Sistemas Universidad Minuto de Dios CERES SABANA DE OCCIDENTE MODULO: PARADIGMAS DE PROGRAMACIÓN Se prohíbe la publicación o reproducción total o parcial de esta Guía. 28