Download Lenguajes de programación
Document related concepts
Transcript
Un lenguaje de programación es un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones. Es utilizado para controlar el comportamiento físico y lógico de una máquina. Un lenguaje de programación permite a uno o más programadores especificar de manera precisa sobre qué datos debe operar una computadora, cómo estos datos deben ser almacenados o transmitidos y qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural, tal como sucede con el lenguaje Léxico. 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 inglés, que al 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: Unidad de entrada, para introducir datos e instrucciones. Memoria, donde se almacenaban datos y resultados intermedios. Unidad de control, para regular la secuencia de ejecución de las operaciones. Unidad Aritmético-Lógica, que efectúa las operaciones. 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. 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. Los lenguajes de programación se pueden clasificar atendiendo a varios criterios: Según el nivel de abstracción. Según el paradigma de programación que poseen cada uno de ellos. I. Según su nivel de abstracción: 1.1 Lenguajes de Máquina Están escritos en lenguajes directamente legibles por la máquina (computadora), ya que sus instrucciones son cadenas binarias (0 y 1). Da la posibilidad de cargar (transferir un programa a la memoria) sin necesidad de traducción posterior lo que supone una velocidad de ejecución superior, solo que con poca fiabilidad y dificultad de verificar y poner a punto los programas. Ejemplos: lenguaje máquina: 00000 00001 00010 00011 00100 00101 00000000 HALT 1001110 10110100 10011110 11010100 10111111 LOAD STOR LOAD ADD STOR 11110 10100 11110 10100 11111 1.2Lenguajes de bajo nivel (ensamblador): Los lenguajes de bajo nivel son lenguajes de programación que se acercan al funcionamiento de una computadora. El lenguaje de más bajo nivel por excelencia es el código maquina. A éste le sigue el lenguaje ensamblador, ya que al programar en ensamblador se trabajan con los registros de memoria de la computadora de forma directa. Ejemplo: Un ejemplo de este tipo de lenguajes es el ensamblador. En él, las instrucciones se escriben en códigos alfabéticos conocidos como mnemotécnicos (generalmente, abreviaturas de palabras inglesas). Las palabras mnemotécnicas son mucho más fáciles de recordar que las secuencias de ceros y unos. Una instrucción típica de ensamblador puede ser: ADD x, y, z Esta instrucción significaría que se deben sumar los números almacenados en las direcciones de memoria. 1.3 Lenguajes de medio nivel: Es un lenguaje de programación informática como el lenguaje C, que se encuentran entre los lenguajes de alto nivel y los lenguajes de bajo nivel Suelen ser clasificados muchas veces de alto nivel, pero permiten ciertos manejos de bajo nivel. Son precisos para ciertas aplicaciones como la creación de sistemas operativos, ya que permiten un manejo abstracto (independiente de la máquina, a diferencia del ensamblador), pero sin perder mucho del poder y eficiencia que tienen los lenguajes de bajo nivel. 1.4 Lenguajes de alto nivel: Los lenguajes de alto nivel son normalmente fáciles de aprender porque están formados por elementos de lenguajes naturales, como el inglés. En BASIC, uno de los lenguajes de alto nivel más conocidos, los comandos como "IF CONTADOR = 10 THEN STOP" pueden utilizarse para pedir a la computadora que pare si el CONTADOR es igual a 10. Esta forma de trabajar puede dar la sensación de que las computadoras parecen comprender un lenguaje natural; en realidad lo hacen de una forma rígida y sistemática, sin que haya cabida, por ejemplo, para ambigüedades o dobles sentidos II. Según el paradigma 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. Dependiendo de la situación un paradigma resulta más apropiado que otro. Atendiendo al paradigma de programación, se pueden clasificar los lenguajes en: El paradigma imperativo o por procedimiento es considerado el mas comun y esta representado por el lenguaje C o el lenguaje BASIC El paradigma Funcional está representado por la familia de lenguajes LISP ( en particular SCHEME) ML HASKELL El paradihma Logico. Ejemplo PROLOG El paradigma orientado a Objetos. Un lenguaje completamente orientado a Objetos es SMALLTALK. Actualmente el paradigma de programación más usado debido a múltiples ventajas respecto a sus anteriores, es la programación orientados a objetos. 2.1 Lenguajes imperativos: Son los lenguajes que dan instrucciones a la computadora, es decir, órdenes. 2.2 Lenguajes Funcionales: Este paradigma concibe a la computación como la evaluación de funciones matemáticas y evita declarar y cambiar datos. En otras palabras, hace hincapié en la aplicación de las funciones y composición entre ellas, más que en los cambios de estados y la ejecución secuencial de comandos (como lo hace el paradigma procedimental). Permite resolver ciertos problemas de forma elegante y los lenguajes puramente funcionales evitan los efectos secundarios comunes en otro tipo de programaciones. 2.3 Lenguajes Lógicos La computación lógica direcciona métodos de procesamiento basados en el razonamiento formal. Los objetos de tales razonamientos son "hechos" o reglas "if then". Para computar lógicamente se utiliza un conjunto de tales estamentos para calcular la verdad o falsedad de ese conjunto de estamentos. Un estamento es un hecho si sus tuplas verifican una serie de operaciones. Un hecho es una expresión en la que algún objeto o conjunto de objetos satisface una relación específica. Una tupla es una lista inmutable. Una tupla no puede modificarse de ningún modo después de su creación. Un regla if then es un estamento que informa acerca de conjuntos de tuplas o estamentos relacionados que pueden predecir si otras tuplas satisfacerán otras relaciones. 2.4 Lenguajes orientados a objetos: La Programación Orientados 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. La implementación de un lenguaje es la que provee una manera de que se ejecute un programa para una determinada combinación de software y hardware. Existen básicamente dos maneras de implementar un lenguaje: Compilación e interpretación. Compilación es la traducción a un código que pueda utilizar la máquina. Los programas traductores que pueden realizar esta operación se llaman Compiladores. Éstos, como los programas ensambladores avanzados, pueden generar muchas líneas de código de máquina por cada proposición del programa fuente. Se puede también utilizar una alternativa diferente de los compiladores para traducir lenguajes de alto nivel. En vez de traducir el programa fuente y grabar en forma permanente el código objeto que se produce durante la compilación para utilizarlo en una ejecución futura, el programador sólo carga el programa fuente en la computadora junto con los datos que se van a procesar. Programación Es un proceso por el cual se escribe (en un Lenguaje de Programación), se prueba, se depura y se mantiene el código fuente de un programa informático. Dentro de la informática, los programas son los elementos que forman el software, que es el conjunto de las instrucciones que ejecuta el hardware de una computadora para realizar una tarea determinada. Por lo tanto, la programación es una de las principales áreas dentro de la informática. Tipos de Programación La programación estructurada (en adelante simplemente PE), es un estilo de programación con el cual el programador elabora programas, cuya estructura es la más clara posible, mediante el uso de tres estructuras básicas de control lógico, a saber: Secuencia. Selección. Iteración. 1.- SECUENCIA Indica que las instrucciones de un programa se ejecutan una después de la otra, en el mismo orden en el cual aparecen en el programa. Se representa gráficamente como una caja después de otra, ambas con una sola entrada y una única salida. 2.- SELECCIÓN También conocida como la estructura SI-CIERTO-FALSO, plantea la selección entre dos alternativas con base en el resultado de la evaluación de una condición o predicado; equivale a la instrucción IF de todos los lenguajes de programación y se representa gráficamente de la siguiente manera: 3.- ITERACIÓN También llamada la estructura HACER-MIENTRAS-QUE, corresponde a la ejecución repetida de una instrucción mientras que se cumple una determinada condición. El diagrama de flujo para esta estructura es el siguiente : Programación Modular Costa de varias secciones divididas de forma que interactúan de forma llamadas procedimientos, que integran el programa en su totalidad. El programa principal coordina la llamada a los módulos secundarios y pasa los datos necesarios en formas de parámetros. A su vez cada modulo puede contener sus propios datos. Programación Orientada a Objetos (POO) Se trata de una técnica que aumenta considerablemente la velocidad de desarrollo de los programas gracias a la reutilización de los objetos. El elemento principal orientado a objeto es el objeto. El objeto es un conjunto complejo de datos y programas que poseen estructura u forman parte de una organización. Programación concurrente Este tipo de programación se utiliza cuando tenemos que realizar varias acciones a la vez. Se suele utilizar para controlar los accesos de usuarios y programas a un recurso de forma simultánea. Se trata de una programación más lenta y laboriosa, obteniendo unos resultados lentos en las acciones. Programación funcional Se caracteriza principalmente por permitir declarar y llamar a funciones dentro de otras funciones. Programación lógica Se suele utilizar en la inteligencia artificial y pequeños programas infantiles. Se trata de una programación basada en el cálculo de predicados (una teoría matemática que permite lograr que un ordenador basándose en hecho y reglas lógicas, pueda dar soluciones inteligentes). Los principales pasos que se deben seguir al elaborar un programa son: Requer imient o Revision y Mejora Especific acion del Program a Diseño del Codigo Manteni miento Codificac ion Release Dubug ging Pruebas 1. Requerimientos: Los programas empiezan cuando alguien tiene la idea de hacer algo y comienza a implementarlo. El documento con los requerimientos del sistema describen, en términos generales, qué es lo que se quiere hacer. 2. Especificación del programa: La especificación es una breve descripción de qué es lo que el programa hace. En un principio, una especificación preliminar describe qué es lo que va a hacer el programa. Después, mientras el programa se va refinando, de la misma manera se va refinando la especificación del mismo. 3. Diseño del código: El programador tiene que llevar a cabo un diseño del código a implementar. En él se deben incluir los algoritmos utilizados, las definiciones de los módulos a utilizar, archivos utilizados y estructuras de datos usadas en el programa. Es aquí en donde se desarrolla el pseudocódigo del programa. El uso de diagramas de flujo también nos permitirá obtener una abstracción sobre el problema, tanto en entradas, salidas, flujo y procesamiento de la información. 4. Codificación: El siguiente paso es empezar a escribir el programa. Este primer paso involucra primero escribir un prototipo y después irlo puliendo para crear el programa final. 5. Pruebas: El programador debe diseñar un plan de pruebas para posteriormente utilizarlo para probar su programa. Cuando es posible, debe existir un equipo de pruebas, diferente del equipo de programadores. 6. Debugging: Desafortunadamente, pocos son los programas que funcionan a la primera. Los programas deben ser corregidos y probados nuevamente. 7. Release: El programa es empaquetado, documentado y mandado al mundo a ser usado. 8. Mantenimiento: Los programas rara vez, o nunca son perfectos. 9. Revisión y mejora: Después de que un programa ha sido usado, los usuarios querrán realizarle algún cambio al funcionamiento del programa, tal como alguna nueva funcionalidad o un cambio en algún algoritmo. En este punto se crea una nueva especificación y el proceso comienza de nuevo. Fases de la Programación Las Fases de la Programación son: Definición del problema Análisis del problema Diseño de la solución Codificación Prueba y depuración (puesta a punto o testing) Documentación Implementación (producción) Mantenimiento 1. Definición del Problema Consiste en la obtención sin ambigüedades de una visión general y clara del problema. Ayuda a identificar los elementos claves del problema y los de la futura solución, así como fijar los límites de los mismos basados en su planteamiento textual sobre el papel. Un problema mal planteado, incompleto o mal comprendido es un mal inicio para la programación. 2. Análisis del Problema Es la comprensión a fondo del problema y sus detalles y es un requisito para lograr una solución eficaz. Es precisamente en esta fase donde se definen formal y correctamente la Entrada que recibirá el programa (datos o materia prima), la Salida que producirá (información o resultados) y el Proceso necesario para su solución (el método para convertir los datos de entrada en información de salida). Cada uno de estos aspectos coincide respectivamente con las preguntas planteadas en la fase de Definición del Problema. A este enfoque se le conoce comúnmente como E-P-S (Entrada-ProcesoSalida). 3. Diseño de la solución En esta fase se diseña la lógica de la solución a usar, o sea, cómo hará el programa la tarea que se desea automatizar usando los datos de entrada para generar los datos de salida, enfatizándose los diseños limpios, sencillos y claros. Pueden plantearse diferentes alternativas de solución al problema y elegir la más adecuada, la que produzca los resultados esperados en el menor tiempo y al menor costo. El proceso de diseño se realiza en dos pasos: 3.1 Elaboración del Algoritmo Un algoritmo es una secuencia lógica y cronológica de pasos encaminados a resolver un problema. Las acciones básicas que puede llevar a cabo un algoritmo son: pedir datos, desplegar datos, evaluar condiciones y ejecutar operaciones. Los programas se estructuran a partir de los algoritmos, los cuales se pueden escribir utilizando la técnica convencional del pseudocódigo (mezcla de lenguaje común, términos técnicos de computación, símbolos y palabras reservadas de algún lenguaje de programación) y los diagramas de flujo que son la representación gráfica de un algoritmo, plasmados en papel para su estudio. En el caso de emplear diagramas de flujo pueden emplearse herramientas de software tales como el DFDv1.0 Si se opta por el pseudocódigo, se recomienda escribirlos a doble interlínea para efecto de facilitar modificaciones o adición de acciones no consideradas y dotarlos de las siguientes características. 3.1.1 Características de los Algoritmos Un algoritmo debe tener un punto de inicio o partida. Debe ser preciso e indicar el orden de realización de cada paso. Debe estar bien definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo resultado cada vez. Debe ser finito (tener un número finito de pasos). Si se sigue un algoritmo, se debe terminar en algún momento. La definición de un algoritmo debe describir con claridad las tres partes fundamentales del problema: Entrada, Proceso y Salida encontrados en las fases de Definición y Análisis del problema. 3.2 Realización de Pruebas de Escritorio O sea, comprobaciones a mano del algoritmo planteado (en pseudocódigo o en diagrama de flujo) con datos y resultados de prueba conocidos, papel, lápiz y calculadora (si es necesaria) para simular su ejecución y evaluar su correcta operación. Si la lógica es correcta, los resultados serán satisfactorios. Si no, el algoritmo deberá modificarse y volverlo a probar hasta que esté correcto. Algunos programas no son fáciles de probar a mano por su complejidad y/o tamaño, pero en tu ayuda está la verificación durante la programación inicial (la creación del algoritmo), el trace and debugging (rastreo y detección de errores) automático que incorporan los lenguajes de compiladores de los lenguajes de programación y otras técnicas. Se hace notar que éste acápite depende de los anteriores. Si la definición y el análisis son errados, el diseño del programa también lo será, por lo que se tendrá que rehacer, retrocediendo quizá hasta la fase de Definición del Problema. 4. Codificación En este paso se traduce el algoritmo ya estructurado, verificado y comprobado a mano, al lenguaje de programación que vaya a utilizarse. Sólo se convierten las acciones del algoritmo en instrucciones de computadora usando la sintaxis de un lenguaje particular, pero requiere de conocimientos del lenguaje y de sumo cuidado en la colocación de las instrucciones, las que deben apegarse y seguir fielmente a la lógica del algoritmo y la semántica y sintaxis del lenguaje. La digitación, el acto de teclear el algoritmo codificado, se lleva a cabo para almacenar el programa en la memoria de la computadora (virtual o física) y pueda ser aceptado por esta. Con frecuencia los programadores realizan la codificación y la digitación al mismo tiempo a fin de ahorrar tiempo, pero esto puede conducir a errores debido a la pérdida de concentración que implica el uso de un editor. La compilación, o corrección de los errores sintácticos y semánticos del código, es la eliminación de los errores "gramaticales" según las reglas de construcción de instrucciones particulares del propio lenguaje (la sintaxis). Puede hacerse a medida que se traduce, pero es mejor al final para no perder la secuencia de la codificación. Al terminar debe tenerse el código libre de los errores antes mencionados. 4. Prueba y Depuración (Puesta a Punto o Testing) Una vez compilado el programa, este es sometido a pruebas a fin de determinar si resuelve o no el problema planteado en forma satisfactoria. El programa codificado y compilado no garantiza que funcione correctamente. Debe depurarse (librarse de errores de lógica o de ejecución) realizando corridas de prueba continuas con datos y respuestas conocidas Las pruebas que se aplican al programa son de diversa índole y generalmente dependen del tipo de problema que se está resolviendo. Comúnmente se inicia la prueba de un programa introduciendo datos válidos, inválidos e incongruentes y observando cómo reacciona en cada ocasión. Los resultados obtenidos en las pruebas pueden ser cualquiera de los siguientes: a. La lógica del programa está bien, pero hay errores sencillos, los cuales los corregimos eliminando o modificando algunas instrucciones o incluyendo nuevas. b. Hay errores ocasionados por fallas en la lógica, lo que nos obliga a regresar a las fases de Diseño y Codificación para revisión y modificación del diagrama. c. Hay errores muy graves y lo más aconsejable es que regresemos para analizar nuevamente el problema, y repetir todo el proceso. d. No hay errores y los resultados son los esperados. En este caso guardamos el programa permanentemente en un medio de almacenamiento. 5. Documentación Es la fase más ignorada por la mayoría de los programadores noveles, por razones de tiempo, costos o simple pereza. Pero no documentar los programas es un mal hábito en programación y un gran error. Será muy difícil a los usuarios entender un programa si no cuentan con un manual de operaciones (el Manual de Usuario). También para los programadores que necesiten darle mantenimiento o hacerle modificaciones si no existe ninguna documentación acerca de sus fases de desarrollo. Incluso será difícil de entender para el mismo autor, algún tiempo después. La documentación es la guía o comunicación escrita en sus variadas formas, ya sea en enunciados, procedimientos, dibujos o diagramas y sirve para ayudar a comprender o usar un programa o para facilitar futuras modificaciones (mantenimiento). Recoge todos los elementos encontrados y material creado en las diferentes fases del desarrollo, además de las normas de instalación o las recomendaciones para la ejecución del programa. La documentación se divide en tres partes: Documentación Interna Documentación Externa Manual del Usuario Documentación Interna: Son los comentarios que se añaden al código fuente para clarificarlo. Documentación Externa: Es todo el material creado y empleado en las diferentes fases del desarrollo del programa. Incluye: Descripción del Problema. Narrativo con la descripción de la solución. Autor(s). Algoritmo (diagrama de flujo y/o pseudocódigo). Código Fuente (programa). Relación de los elementos utilizados en el programa, cada uno con su respectiva función. Limitaciones del programa. Manual del Usuario: Describe paso a paso la manera cómo funciona el programa, con el fin de que los usuarios pueda operarlo correctamente y obtener los resultados deseados. 7. Implementación (Producción) El programa ya probado, revisado y mejorado se considera terminado y puede utilizarse con un alto grado de confianza para resolver los problemas que dieron origen a su creación. Si se está automatizando alguna tarea manual, ésta última se desecha para emplear solamente la programa. 8. Mantenimiento Es posible que el programa deba revisarse cada cierto tiempo para ajustes. Estos cambios pueden ser por la dinámica del problema, por la naturaleza del código, las exigencias del tiempo o las modernas necesidades que surgen frecuentemente, por lo que se considera que ningún programa es estático. Los programas siempre son susceptibles de mejoras y de mantenimiento. Por tales razones, es común que se tenga que retornar a una de las fases iníciales de desarrollo para corregir o añadir funcionalidades, repitiendo el proceso en cada fase subsiguiente para introducir los cambios pertinentes y lograr que el programa funcione correctamente con los cambios realizados. Se enfatiza el hecho de que cualquier actualización o cambio en el programa deberá reflejarse en su documentación para que ésta mantenga su vigencia. Escribir un programa es establecer el comportamiento de una máquina mediante una serie de algoritmos que definirán su funcionamiento. En el estado actual de la ciencia, este algoritmo se plasma por escrito utilizando un lenguaje artificial comprensible por el humano-programador. Generalmente estas instrucciones, que aquí se denominan código fuente, vienen acompañadas de algunos datos en forma de texto o imágenes, contenidas en uno o varios ficheros denominados ficheros de recursos. Sin embargo, las instrucciones y recursos solo pueden ser utilizadas por la máquina después de un proceso de traducción que es realizado por la propia máquina (puede ser distinta de la que ejecuta el programa). ¡Un Programa nunca está terminado del todo! El proceso exige que el código fuente sea transformado en una nueva secuencia de instrucciones según un nuevo sistema de codificación (el lenguaje máquina), y que los recursos adopten una disposición particular. Este conjunto de instrucciones y datos, que constituyen el denominado ejecutable, corresponden a acciones concretas y datos, que pueden ser entendidas, ejecutadas y utilizados por la máquina. En general este comportamiento pretende modelar o mimetizar el comportamiento de una entidad del mundo real, o de una abstracción que hemos imaginado; y es de tipo genérico. Se pretende que la máquina se comporte como una función que acepta un conjunto de condiciones de entrada y devuelve como salida un comportamiento concreto y predecible para cada combinación de las condiciones de entrada. Existen básicamente dos tipos de software: El software de sistema y el de aplicación. El software de aplicación es aquel capaz de resolver un problema requerido por el usuario. Existen infinidad de actividades donde se deben resolver problemas en forma cotidiana, allí está el trabajo del software de aplicación, resolviendo a medida. Se define como Proceso al conjunto ordenado de pasos a seguir para llegar a la solución de un problema u obtención de un producto, en este caso particular, para lograr la obtención de un producto software que resuelva un problema. El proceso de creación de software puede llegar a ser muy complejo, dependiendo de su porte, características y criticidad del mismo. Considerando los de gran porte, es necesario realizar tantas y tan complejas tareas, tanto técnicas, de gerenciamiento, fuerte gestión y análisis diversos que toda una ingeniería hace falta para su estudio y realización: es la Ingeniería de Software. En tanto que en los de mediano porte, pequeños equipos de trabajo pueden realizar la tarea. Aunque, siempre en casos de mediano y gran porte (y a veces también en algunos de pequeño porte, según su complejidad), se deben seguir ciertas etapas que son necesarias para la construcción del software. Tales etapas, si bien deben existir, son flexibles en su forma de aplicación, de acuerdo a la metodología o Proceso de Desarrollo escogido y utilizado por el equipo de desarrollo o por el analista-programador solitario. Los "procesos de desarrollo de software" poseen reglas preestablecidas, y deben ser aplicados en la creación del software de mediano y gran porte, ya que en caso contrario lo más seguro es que el proyecto o no logre concluir o termine sin cumplir los objetivos previstos, y con variedad de fallos inaceptables. Entre tales "procesos" los hay ágiles o livianos, pesados y lentos y variantes intermedias; y normalmente se aplican de acuerdo al tipo, porte y tipología del software a desarrollar, a criterio del líder del equipo de desarrollo. Algunos de esos procesos son Extreme Programming (XP), Rational Unified Process (RUP), Feature Driven Development. Cualquiera sea el "proceso" utilizado y aplicado al desarrollo del software (RUP, FDD), y casi independientemente de él, siempre se debe aplicar un "Modelo de Ciclo de Vida". Se estima que, del total de proyectos software grandes emprendidos, un 28% fracasan, un 46% caen en severas modificaciones que lo retrasan y un 26% son totalmente exitosos. Cuando un proyecto fracasa, rara vez es debido a fallas técnicas, la principal causa de fallos y fracasos es la falta de aplicación de una buena metodología o proceso de desarrollo. Entre otras, una fuerte tendencia, desde hace pocas décadas, es mejorar las metodologías o procesos de desarrollo, o crear nuevas y concientizar a los profesionales en su utilización adecuada. Normalmente los especialistas en el estudio y desarrollo de estas áreas (metodologías) y afines son los Ingenieros en Software, es su orientación. Los especialistas en cualquier otra área de desarrollo informático (analista, programador, Lic. en Informática, Ingeniero en Informática, Ingeniero de Sistemas, etc.) normalmente aplican sus conocimientos especializados pero utilizando modelos, paradigmas y procesos ya elaborados. Es común para el desarrollo de software de mediano porte que los equipos humanos involucrados apliquen sus propias metodologías, normalmente un híbrido de los procesos anteriores y a veces con criterios propios. El proceso de desarrollo puede involucrar numerosas y variadas tareas, desde lo administrativo, pasando por lo técnico y hasta la gestión y el gerenciamiento. Pero casi rigurosamente siempre se cumplen ciertas etapas mínimas; las que se pueden resumir como sigue: Captura, Especificación y Análisis de requisitos (ERS) Diseño Codificación Pruebas (unitarias y de integración) Instalación y paso a Producción Mantenimiento Desarrollo y diseño en el Proceso de Creación de un Programa El análisis del problema: Luego del requerimiento del programa, se debe comprender en forma cierta la problemática que se debe resolver, en este aspecto no puede haber ambigüedades o inconsistencias. Se deben establecer las salidas necesarias del programa y las entradas que serán requeridas al usuario, para tal fin. La comprensión de esta etapa evita problemas serios a futuro. Desarrollo de la solución: Aquí se determinan los pasos que tendrá nuestro algoritmo. Los algoritmos se van refinando a lo largo del proyecto hasta que sean completos, robustos y confiables. Escribiendo el código de la aplicación: En esta etapa el desarrollo planteado en los pasos anteriores es llevado a código del lenguaje C++. Hay algunos patrones que se deben considerar en la creación del programa ya que son determinantes de la forma de ejecución del mismo: Secuencia: Definen el orden en que se ejecutarán las instrucciones de un programa. Selección: Permite elegir entre diferentes operaciones, dependiendo del resultado de alguna operación. Iteración: Permite que la misma operación se repita, establecida en el valor de una condición. Invocación: Consiste en la solicitud de un conjunto de instrucciones (habitualmente separadas), cuando se necesiten. Prueba y corrección del programa Esta etapa permite comprobar si el funcionamiento del programa es acorde a lo previsto. Un conjunto de datos de prueba deben permitir la verificación de la salida. Las últimas etapas Documentación: Estas etapas se ocupan de documentar el programa, esto es muy importante, ya que mucho esfuerzo se suele perder por la falta de registros. Se debe, por lo menos, describir el programa, el desarrollo y cambios en el algoritmo, los resultados de las pruebas efectuadas y al desarrollo de manuales para el usuario, si fuese necesario. Mantenimiento: Aquí se trabaja en forma permanente en la optimización del programa, el agregado de nuevas funciones, ya sea, por nuevas versiones o solicitud expresa del cliente. Se deben mantener copias de seguridad. Modelos de proceso o ciclo de vida El modelo de proceso o modelo de ciclo de vida utilizado para el desarrollo define el orden para las tareas o actividades involucradas también definen la coordinación entre ellas, enlace y realimentación entre las mencionadas etapas. Entre los más conocidos se puede mencionar: modelo en cascada o secuencial, modelo espiral, modelo iterativo incremental. De los antedichos hay a su vez algunas variantes o alternativas, más o menos atractivas según sea la aplicación requerida y sus requisitos. Modelo cascada Es también llamado "modelo clásico", "modelo tradicional" o "modelo lineal secuencial". El modelo en cascada puro difícilmente se utilice tal cual, pues esto implicaría un previo y absoluto conocimiento de los requisitos, la no volatilidad de los mismos (o rigidez) y etapas subsiguientes libres de errores; ello sólo podría ser aplicable a escasos y pequeños desarrollos de sistemas. En estas circunstancias, el paso de una etapa a otra de las mencionadas sería sin retorno. Modelo Cascada Algún cambio durante la ejecución de una cualquiera de las etapas en este modelo secuencial implicaría reiniciar desde el principio todo el ciclo completo. El modelo lineal o en Cascada es el paradigma más antiguo y extensamente utilizado, sin embargo las críticas a él han puesto en duda su eficacia. Desventajas del modelo cascada: Los cambios introducidos durante el desarrollo pueden confundir al equipo profesional en las etapas tempranas del proyecto. Si los cambios se producen en etapa madura (codificación o prueba) pueden ser catastróficos para un proyecto grande. No es frecuente que el cliente o usuario final explicite clara y completamente los requisitos (etapa de inicio); y el modelo lineal lo requiere. La incertidumbre natural en los comienzos es luego difícil de acomodar. El cliente debe tener paciencia ya que el software no estará disponible hasta muy avanzado el proyecto. Un error detectado por el cliente (en fase de operación) puede ser desastroso, implicando reinicio del proyecto, con altos costos. Modelos evolutivos El software evoluciona con el tiempo. Los requisitos del usuario y del producto suelen cambiar conforme se desarrolla el mismo. Las fechas de mercado y la competencia hacen que no sea posible esperar a poner en el mercado un producto absolutamente completo, por lo que se debe introducir una versión funcional limitada de alguna forma para aliviar las presiones competitivas. Los evolutivos son modelos iterativos, permiten desarrollar versiones cada vez más completas y complejas, hasta llegar al objetivo final deseado; incluso evolucionar más allá, durante la fase de operación. Los modelos “Iterativo Incremental” y “Espiral” son dos de los más conocidos y utilizados del tipo evolutivo. Modelo iterativo incremental En términos generales, podemos distinguir los pasos generales que sigue el proceso de desarrollo de un producto software. En el modelo de ciclo de vida seleccionado, se identifican claramente dichos pasos. La Descripción del Sistema es esencial para especificar y confeccionar los distintos incrementos hasta llegar al Producto global y final. Las actividades concurrentes (Especificación, Desarrollo y Validación) sintetizan el desarrollo pormenorizado de los incrementos, que se hará posteriormente. Modelo espiral El modelo espiral fue propuesto inicialmente por Barry Boehm. Es un modelo evolutivo que conjuga la naturaleza iterativa del modelo MCP con los aspectos controlados y sistemáticos del Modelo Cascada. Proporciona potencial para desarrollo rápido de versiones incrementales. En el modelo Espiral el software se construye en una serie de versiones incrementales. En las primeras iteraciones la versión incremental podría ser un modelo en papel o bien un prototipo. En las últimas iteraciones se producen versiones cada vez más completas del sistema diseñado. El modelo se divide en un número de Actividades de marco de trabajo, llamadas "regiones de tareas". En general existen entre tres y seis regiones de tareas (hay variantes del modelo). En la figura 6 se muestra el esquema de un Modelo Espiral con 6 regiones. En este caso se explica una variante del modelo original de Boehm, expuesto en su tratado de 1988; en 1998 expuso un tratado más reciente. Las regiones definidas en el modelo de la figura son: Región 1 - Tareas requeridas para establecer la comunicación entre el cliente y el desarrollador. Región 2 - Tareas inherentes a la definición de los recursos, tiempo y otra información relacionada con el proyecto. Región 3 - Tareas necesarias para evaluar los riesgos técnicos y de gestión del proyecto. Región 4 - Tareas para construir una o más representaciones de la aplicación software. Región 5 - Tareas para construir la aplicación, instalarla, probarla y proporcionar soporte al usuario o cliente (Ej. documentación y práctica). Región 6 - Tareas para obtener la reacción del cliente, según la evaluación de lo creado e instalado en los ciclos anteriores. Las actividades enunciadas para el marco de trabajo son generales y se aplican a cualquier proyecto, grande, mediano o pequeño, complejo o no. Las regiones que definen esas actividades comprenden un "conjunto de tareas" del trabajo: ese conjunto sí se debe adaptar a las características del proyecto en particular a emprender. Nótese que lo listado en los ítems de 1 a 6 son conjuntos de tareas, algunas de las ellas normalmente dependen del proyecto o desarrollo en sí. Lenguajes de programación Cuando se programa, se indica una serie de instrucciones para que la computadora las ejecute. Para asegurarse que la computadora entienda las instrucciones, se han establecido lenguajes bien definidos para especificar y poder generar la comunicación con al computadora. Estos lenguajes tienen características similares a los lenguajes comunes que utilizan las personas para comunicarse unas con otras, pues cuentan con reglas y estructuras que deben seguirse. En computación, un lenguaje de programación es cualquier lenguaje artificial, el cual, se utiliza para definir adecuadamente una secuencia de instrucciones que puedan ser interpretadas y ejecutadas en una computadora. Se asume que las instrucciones así escritas son traducidas luego a un código que la máquina pueda comprender. El proceso de traducción es realizado normalmente por la computadora, usando un programa especializado para tal fin. Los lenguajes de programación intentan conservar una similitud con el lenguaje humano, con la finalidad de que sean más naturales a quienes los usan. Establecen un conjunto de reglas sintácticas y semánticas, las cuales rigen la estructura del programa de computación que se escribe o edita. De esta forma, permiten a los programadores o desarrolladores, poder especificar de forma precisa los datos sobre los que se va a actuar, su almacenamiento, transmisión y demás acciones a realizar bajo las distintas circunstancias consideradas. Uso de los lenguajes de programación Una vez que se identifica una tarea y se conoce el algoritmo para resolverla, el programador debe codificarlo en una lista de instrucciones, propias de algún lenguaje de computación. Los programas pueden ser escritos en cualquier lenguaje de la amplia gama disponibles. La escogencia del más adecuado, dependerá de factores como la experiencia del programador con un lenguaje, determinar cuál producirá el programa menos complicado, la flexibilidad y la compatibilidad del programa como resultado del lenguaje usado. A continuación se presenta como ejemplo un sencillo programa fuente, escrito en C, el cual, es un lenguaje de programación que llegó a ser muy popular, y justo al lado se explica la acción que realizará la computadora en respuesta a los comandos del programa. El programa tiene como finalidad el cálculo del promedio de una lista de cinco números. Instrucciones en Lenguaje C int datos[ ] = { 25, 88, 20, 75, 62 }; int nDatos = 5; int promedio () Acción de la computadora 1.- Define una matriz (datos) de números enteros y le asigna los valores 25, 88, 20, 75, 62. 2.- Define la variable (nDatos) de tipo entero y le asigna el valor 5. 3.- Define la función (promedio) que devuelve un número entero. { int suma; 4.- Define la variable (suma) de tipo entero. int prom; 5.- Define la variable (prom) de tipo entero. int cont; 6.- Define la variable (cont) de tipo entero. suma = 0; 7.- Asigna a suma el valor 0. for (cont=0; cont<nDatos; 8.- Para cada elemento de la matriz datos, añade cont++) su valor a la variable suma. { suma += datos [cont]; } 9.- Asigna a prom el resultado de dividir la prom=suma/nDatos; variable suma por la variable nDatos. 10.- Devuelve como resultado de la función el return (prom); contenido de la variable prom. } Clasificación de los lenguajes de programación Niveles y Generaciones En computación se suele hablar de niveles y generaciones de los lenguajes de programación. Respecto al nivel, se clasifican en lenguajes de bajo y alto nivel. Los lenguajes de bajo nivel, son aquellos que se asemejan al lenguaje empleado por la computadora, mientras que los lenguajes de alto nivel, son aquellos que se asemejan al lenguaje humano. Niveles de los lenguajes de programación Los lenguajes de alto nivel son resultado de una evolución, desde los lenguajes de bajo nivel. La computadora sólo es capaz de comprender su lenguaje máquina. Pero para las personas no es fácil entender y manejar este código máquina de combinaciones binarias. Las investigaciones dieron un primer paso que llevó a la evolución desde las hileras de números binarios del código máquina, a un lenguaje ensamblador, que las representaba como una serie de comandos más entendibles. Los lenguajes de nivel superior están orientados más hacia lo que se quiere realizar, que en la manera como se ejecutarán los comandos. 1.- Lenguajes de bajo nivel A nivel de circuitos, los microprocesadores sólo son capaces de procesar señales electrónicas binarias. Estas instrucciones binarias que se envían al microprocesador, se componen de series de unos y ceros, espaciadas en el tiempo de una forma determinada. Esta secuencia de señales se denomina código máquina. El código representa normalmente datos y números, así como instrucciones para manipularlos. Para hacer más fácil el manejo del código máquina, se dio a cada instrucción un mnemónico, como por ejemplo STORE (Almacenar), ADD (Adicionar) o JUMP (Saltar). Tal abstracción da como resultado el ensamblador, que es un lenguaje de muy bajo nivel basado en mnemónicos y que es específico para cada microprocesador. De esta forma, son llamados lenguajes de bajo nivel, a aquellos constituidos por instrucciones en lenguaje máquina o próximos a él. Tales lenguajes permiten crear programas muy rápidos y eficientes, pero en contrapartida, estos lenguajes suelen ser difíciles de aprender, programar y depurar. Un hecho importante es, que los programas escritos en un bajo nivel, son prácticamente específicos para cada procesador, lo que implica, que si se quiere ejecutar el programa en otra máquina de arquitectura diferente, es necesario volver a escribir el programa desde el principio. 2.- Lenguajes de alto nivel Al pensar en una computadora, normalmente se concibe como una máquina que realiza tareas de procesamiento de texto y cálculos. Esta es una percepción bastante sintética y esquemática de entender la computadora. Existe un alto nivel de abstracción entre lo que se pide a la computadora y lo que realmente comprende. De un modo paralelo se presenta una relación compleja entre los lenguajes de alto nivel y el código máquina. Un programa escrito en un lenguaje de alto nivel, debe ser compilado o interpretado para traducir su código, en otro de bajo nivel (lenguaje máquina). Como ejemplo de lenguajes de alto nivel se tienen Pascal, BASIC, FORTRAN, COBOL, Java, C y C++. En los lenguajes de alto nivel las instrucciones son independientes de la máquina, son más fáciles de aprender porque están formados por elementos de lenguajes naturales (del inglés). En BASIC, comandos como "IF CONTADOR = 10 THEN STOP" son usados para ordenar a la computadora, que pare si CONTADOR es igual a 10. Pero aunque las computadoras parecieran comprender el lenguaje natural, lo hacen de una manera bastante rígida y sistemática, lo cual podría parecer un poco frustrante e inspira la búsqueda de lenguajes más cercanos aún al natural. Compiladores e Intérpretes Se ha señalado que la computadora sólo puede ejecutar instrucciones en código de máquina, por lo cual, todos los programas escritos en cualquiera de los lenguajes de programación deben ser convertidos o traducidos. Este proceso es llevado a cabo por unos programas especiales, los compiladores y los intérpretes. Para darse una idea de cómo funcionan, es útil comparar su actuación con la de un profesional humano encargado de traducir. Un compilador equivale a que el traductor humano, partiendo de un texto, prepare otro texto nuevo e independiente, traducido a la otra lengua. En contraste, un intérprete equivale a que tal profesional traduzca de forma hablada, cada grupo de palabras o instrucción, a medida que la oye, sin dejarlas por escrito. La traducción del código fuente, escrito en lenguaje ensamblador, a código máquina (o código objeto), no representa un proceso complicado y se lleva a cabo mediante un compilador. De manera similar, la traducción de código fuente de lenguajes de alto nivel puede ser realizada por un compilador, o también mediante un intérprete. Con base en el código fuente suministrado, el compilador crea una lista de instrucciones de código máquina: Proceso de compilación El código objeto. Este código objeto obtenido, es un programa rápido y ya listo para funcionar, pero está expuesto a poseer errores que pueden provocar fallas en la computadora. En el proceso de compilación pueden resultar varios archivos de código objeto, los cuales deben enlazarse para obtener un archivo ejecutable. Esto se logra mediante un programa llamado enlazador. Por otra parte, los intérpretes recorren línea a línea el código fuente en el momento de su ejecución. Esto los hace más lentos, debido a la necesidad de traducir el programa mientras se ejecuta, pero a cambio, son más flexibles como entornos de programación y depuración. Es natural que los lenguajes de programación utilicen sólo uno de estos métodos para producir el código fuente, sin embargo muchos también disponen de versiones interpretadas y compiladas. En cuanto a las generaciones de lenguaje, se tienen cinco diferentes, considerando que cada generación sucesiva se establece con lenguajes más poderosos y fáciles de usar que los de la generación precedente. Los lenguajes calificados como de alto nivel, comienzan a partir de la tercera generación. Generaciones de los lenguajes de programación El lenguaje máquina consiste de códigos binarios • Primera generación: Lenguaje máquina Son los lenguajes más básicos. Los lenguajes de máquina se representan en bytes, los cuales, están compuestos de bits, que son números binarios o que consisten únicamente de ceros (0) o unos (1). Estos valores pueden corresponder a que la electricidad esté encendida o apagada en la máquina, o a la presencia o ausencia de carga magnética en un medio de almacenamiento. A partir de estos dos estados se forman los esquemas de codificación (como el código ASCII) que permiten generar letras, números, signos de puntuación y caracteres especiales. Una computadora sólo es capaz de comprender su lenguaje máquina original, el conjunto de instrucciones para realizar sus operaciones elementales. • Segunda generación: lenguajes ensambladores Están constituidos por nemotécnicos similares a palabras en idioma inglés. En primer lugar, se crea un archivo fuente con las instrucciones que se desea que la computadora ejecute, usando un editor, que es una especie de procesador de palabras. El código fuente es traducido al lenguaje máquina mediante programas traductores (compiladores). Los programadores rara vez escriben programas de tamaño relevante en este tipo de lenguajes, debido a que, a pesar que es mucho más fácil que utilizar código de máquina, siguen siendo altamente detallados (instrucciones muy básicas). Sólo se hace en los casos donde la velocidad es clave (como en la programación de juegos de video) y para afinar partes importantes de los programas que son escritos en lenguajes superiores. • Tercera generación: Lenguajes de alto nivel: Son llamados de alto nivel porque se asemejan más al lenguaje que utilizan los humanos al comunicarse. Fueron desarrollados con la finalidad de facilitar el proceso de programación. Cuentan con comandos que se acercan más a las palabras de uso común en lugar de tener que usar combinaciones binarias del código máquina o los comandos básicos del ensamblador. Esto lenguajes hacen más fácil la lectura, escritura y comprensión de los programas, aunque de manera semejante a los lenguajes ensambladores, deben ser convertidos a lenguaje máquina, para poder ser usados en la computadora. Los programas de la tercera generación son capaces de soportar programación estructurada, es decir, permiten el uso de estructuras de programación específicas para ramificaciones y ciclos en el flujo del programa. Por otro lado, resultan más claros puesto que usan palabras o comandos semejantes al lenguaje normal, lo que permite compartir el desarrollo entre diferentes programadores. Los programadores que conforman un equipo pueden leer el código realizado por los demás y comprender la lógica y el flujo de control del programa. Entre los lenguajes de tercera generación se incluyen: - FORTRAN (Traductor de Fórmulas: Formula translator), diseñado específicamente para programas matemáticos y de ingeniería, motivo por el cual, no fue de amplio uso en computadoras personales. Su uso se dirige especialmente a equipos de cómputo dedicados a la investigación y la educación. La versión más actual (1990) fue denominada FORTRAN-90. - COBOL (Lenguaje simbólico de programación, orientado hacia aplicaciones comerciales y de gestión: Common Business Oriented Languaje) desarrollado en 1960, con el fin de solucionar las incompatibilidades de los fabricantes de computadoras. Ganó amplia aceptación como lenguaje estandarizado llegándose a utilizar ampliamente en los negocios, pero perdió seguidores en la pasada década. Motivado al problema del año 2000 fueron requeridos programadores especializados en este lenguaje para reprogramar las millones de líneas de código escritas en COBOL para que tales programas continuasen funcionando. - BASIC (Código de instrucción simbólica universal para principiantes: Begginners Allpurpose Symbolic Instruction Code) comienza como una herramienta para enseñar sobre programación a estudiantes. Fue desarrollado por Jhon Kemeny y Thomas Kurtz en 1964. Por su simplicidad se volvió ampliamente popular y usado en educación y entre los programadores aficionados, pero no ha llegado a ser un lenguaje viable para aplicaciones comerciales. Esto último se debe a que no posee un amplio repertorio de herramientas como el que ofrecen otros lenguajes. Además, sus compiladores no producen archivos ejecutables tan compactos, rápidos y eficientes como los que producen otros lenguajes. - PASCAL, nombrado en honor del inventor francés Blas Pascal, es introducido por Niklaus Wirth en 1971. El Pascal, buscaba superar las limitaciones de los otros lenguajes de programación y demostrar la manera adecuada de implementar un lenguaje de cómputo. Ha llegado a considerarse un excelente lenguaje de enseñanza. Las personas que se inician en la programación le consideran fácil para implementar algoritmos, su compilador es estricto con el uso de programación estructurada, asegurándose de que los errores sean señalados al principio. - C, desarrollado a principios de los sesenta por Brian Kernighan y Dennis Ritchie, quienes buscaban un mejor lenguaje de integrar con el sistema operativo UNIX, para que los usuarios pudiesen hacer modificaciones y mejoras con facilidad. El código ejecutable obtenido del lenguaje C, es rápido y eficiente. El C es poderoso, puesto que brinda la libertad de conseguir que se realice casi cualquier cosa en una computadora. Esta es una de las razones por la cual se ha vuelto tan popular entre quienes desarrollan software para aplicaciones comerciales profesionalmente. Su dificultad lenguajes. estriba, en que no es tan sencillo de aprender en comparación con otros - C++, Es un lenguaje de principios de los ochenta desarrollado por Bjarne Stroustrup. Es extremadamente poderoso y eficiente igual que el C. Su aprendizaje implica aprender todo acerca de C y además aprender sobre la programación orientada a objetos y su aplicación mediante el C++. Desde su origen ha ido ganando terreno entre quienes desarrollaban en C. - Java (1991) es desarrollado por Sun Microsistema. Cuando Internet comenzó a ganar popularidad como red de comunicaciones a mediados de los noventa, Sun redirige a Java para convertirlo en un ambiente de programación que permitiese crear sistemas interactivos y dinámicos (denominados applets) para las páginas Web. La complejidad de Java es similar a C++, pero ha ido ganando popularidad por la demanda de aplicaciones para páginas Web, incluso se estima que puede llegar a desplazar a C++ como ambiente de programación. • Cuarta generación: Lenguajes de propósito especial: Estos lenguajes de cuarta generación (4GL) son usados en programación, de propósitos específicos, caracterizados por una mayor facilidad de uso comparados con los de la tercera generación, permitiendo la creación de prototipos de una aplicación rápidamente. Los prototipos permiten tener una idea del aspecto y funcionamiento de la aplicación antes que el código sea terminado. Esto implica que quienes estén involucrados en el desarrollo de la aplicación pueden aportar retroalimentación en aspectos como, estructura y diseño desde el principio del proceso. A cambio de esta capacidad para trabajar más velozmente, debe sacrificarse parte de la flexibilidad con la que se disponía con los lenguajes anteriores. Muchos de estos lenguajes tienen capacidad para bases de datos, permitiendo crear programas que sirvan de enlace con las mismas. Los programas incluyen formas y cuadros para introducir datos, así como solicitar reportes de información de las bases de datos. En general, ahorran tiempo puesto que el código requerido para conectar los cuadros de diálogo y las formas se genera de forma automática. Entre los programas de cuarta generación se tienen: - Los programas de ambientes visuales: Existen versiones de programas populares como el Visual BASIC o el Visual C, los cuales, soportan características y métodos orientados a objetos y que permiten crear programas en un ambiente visual. Por ejemplo, si se desea ubicar un cuadro de texto en un formulario para entrada de datos sólo se requiere arrastrarlo desde la barra de herramientas hasta la posición deseada sobre el formulario. Con los programas de tercera generación se requiere escribir el código, indicando el tamaño y ubicación exacta del cuadro de texto. La creación de formularios es más fácil en ambientes visuales. En el ambiente visual, simplemente se ubica el cuadro en el lugar que se requiere y se da el tamaño adecuado arrastrando sus bordes con el ratón, el código se genera automáticamente. - Ambientes de autoría: Conformados por herramientas de programación para propósitos especiales, se usan para crear multimedia, capacitación basada en computadora, páginas Web y otros. Un ambiente de autoría es Macromedia Director el cual se usa para crear títulos multimedia que combinen, cortos de música, texto, animación, gráficos y demás. Son ambientes de desarrollo visuales en el cual gran parte del código se escribe automáticamente, pero la mayoría de ambientes de autoría robustos también incluyen sus propios lenguajes, lenguajes de escritura, que proporcionan un control extra sobre el producto final. • Quinta generación: Lenguajes naturales: Esta generación incluye la inteligencia artificial y sistemas expertos. En lugar de sólo ejecutar un conjunto de órdenes, el objetivo de estos sistemas es pensar y anticipar las necesidades de los usuarios. Estos sistemas se encuentran aún en desarrollo. Aunque los sistemas de inteligencia artificial han demostrado ser más complicados para desarrollar de lo que se anticipaba, los investigadores afirman que pronto serán capaces de tomar como entrada hechos y luego usar un procesamiento de datos que formule una respuesta adecuada, de modo similar a como responden los humanos. Las cinco generaciones de lenguajes de programación Generación Nombre Particularidad Primera De máquina Específico para cada microprocesador, uso de código binario Segunda Ensamblador Uso de nemotécnicos que abstraen del lenguaje máquina. Tercera De procedimientos Lenguajes estructurados con cercanos al lenguaje común. Cuarta Orientados procesos Quinta Natural a Programas específicos. orientados Incluye inteligencia expertos. comandos a artificial problemas y sistemas Nuevas tendencias La disponibilidad de programas de calidad desarrollados más rápidamente, se ve acrecentada con el pasar del tiempo motivada por dos aspectos. Por un lado, la acumulación del conocimiento de cómo hacer las cosas, organizado mediante técnicas y metodologías bien definidas y estructuradas, que plantean alternativas como guías a seguir. Por otro lado, la disponibilidad de lenguajes de programación los cuales proveen mejores medios para que los desarrolladores sean capaces de aplicar su creatividad, ingenio y experiencia. Una tendencia marcada desde hace algunos años, es la dependencia creciente de componentes de software reusable por parte de programadores y equipos de desarrollo. El enfoque de la programación orientada a objetos es muestra de ello, así como su incorporación en los lenguajes de programación. De tal modo, es muy probable que incluso lleguen a existir proveedores de objetos componentes de software, que los ofrezcan a los programadores, como en la actualidad se ofrecen componentes hardware. Entonces el enfoque del trabajo de los desarrolladores de software cambiará, tal vez, dividiéndolos en dos grupos. Por un lado, quienes se encarguen de la integración de los objetos cuando se trata de desarrollar programas específicos, más que de desarrollar a detalle cada componente desde el principio. En tanto que los surtidores de tales componentes se especializan en desarrollar los objetos que les son demandados, que podrán ser componentes estándar o a la medida (con especificaciones únicas). Otra gran influencia en el desarrollo de programas, es resultado de la expansión en el uso de Internet en lo personal y en lo comercial. Es posible que pronto se generalice el uso de programas los cuales se ejecuten en Internet y los desarrolladores produzcan programas que además de enviar y recibir mensajes y archivos, hagan uso de los inmensos recursos mundiales disponibles. Los programadores podrían estar desarrollando programas que se ejecuten en Internet, requiriendo entonces, lenguajes de programación más adaptados a este tipo de empresas.