UNIVERSIDAD TECNOLÓGICA DE PANAMÁ FACULTAD DE INGENIERÍA DE SISTEMAS COMPUTACIONALES Departamento de Computación y Simulación de Sistemas Licenciatura en Ingeniería en Sistemas y Computación Investigación #1 “Lenguajes de Programación” CURSO Desarrollo de Software ESTUDIANTES Alba Muñoz 8-865-518 Amelia González 8-855-1945 Katherine Benitez 8-848-2113 Oscar Gómez 8-848-911 Héctor Pérez 8-839-2020 Anthony Vargas 8-826-1082 Giancarlo Remón 8-849-367 FACILITADORA: Dra. Addys C. de Lam PANAMÁ, 2010 INTRODUCCION Todos conocemos el efecto X en las computadoras: NO PUEDEN ENTENDER POR SI SOLAS. Para que la computadora entienda nuestras instrucciones debe usarse un lenguaje específico conocido como código máquina. Este lenguaje es muy fácil para el entendimiento de la computadora, pero para las personas, puede ser un extremo dolor de cabeza. De hecho sólo consiste en cadenas extensas de números 0 y 1. Para facilitar el trabajo, los primeros operadores de computadoras decidieron reemplazar los 1 y 0 por palabras o letras del inglés; a esto se le llamó lenguaje ensamblador. Por ejemplo, para sumar se usa la letra A de la palabra inglesa add (sumar). En realidad escribir en lenguaje ensamblador es básicamente igual que hacerlo en lenguaje máquina, pero las letras y palabras son más fáciles de recordar y entender que los números. No es obvio? Pero vamos a darle el crédito a la primera programadora, que para sorpresa de muchos, fue una mujer: Ada Lovelace, hija de Anabella Milbanke Byron y Lord Byron. Anabella introdujo en las matemáticas a Ada quien, después de conocer a Charles Babbage, tradujo y amplió una descripción de su máquina analítica. Incluso aunque Babbage nunca completó la construcción de cualquiera de sus máquinas, el trabajo que Ada realizó con éstas le hizo ganarse el título de primera programadora de computadoras del mundo. El nombre del lenguaje de programación Ada fue escogido como homenaje a esta programadora. A medida que se hacían mas difíciles los trabajo de la computadora, se hizo necesario un mejor método o forma de programarlas. Entonces, se crearon los lenguajes de alto nivel, como lo fue el BASIC en las versiones introducidas en los microordenadores de la década de 1980. Mientras que una tarea tan sencilla como sumar dos números puede necesitar varias instrucciones en lenguaje ensamblador, en un lenguaje de alto nivel bastará con solo una. En este trabajo desarrollaremos el tema que se dio como resultado de esta interesante historia: LOS LENGUAJES DE PROGRAMACION. Discutiremos sobre conceptos, ideas, principales componentes y sus diferentes tipos, ya que Los lenguajes de programación se han modificado mucho hasta ser la base computacional en el siglo XXI OBJETIVOS DEL TRABAJO Como estudiantes de la Ingeniería en Sistemas, es nuestro deber nutrirnos de conocimiento referente a las computadoras, ya que lógicamente es un campo en el cual trabajaremos con mucha frecuencia. Los objetivos de este trabajo, primordialmente, tienen que ver con todo lo referente a los Lenguajes de Programación: Conocer los conceptos básicos de los lenguajes de programación. Entender el funcionamiento de los lenguajes de programación. Conocer las modificaciones y el desarrollo de los diferentes lenguajes. Identificar los diferentes tipos de lenguajes de programación. comparar todas las características de los diferentes tipos de lenguajes de programación. ¿Qué son los lenguajes de programación? Los lenguajes de programación son herramientas que nos permiten crear programas y software. En particular se conocen como código de máquinas o lenguaje de máquinas. Es un lenguaje artificial que puede ser usado para controlar el comportamiento de una máquina, especialmente una computadora. Estos se componen de un conjunto de reglas sintácticas y semánticas que permiten expresar instrucciones que luego serán interpretadas. También se le puede llamar lenguaje de programación a una serie de comandos que nos permiten codificar instrucciones de manera que sean entendidas y ejecutadas por una computadora. Para que estos programas funcionen para diferentes computadoras hay que realizar una versión para cada una de ellas, lo que implica el aumento del costo de desarrollo. Los lenguajes de programación facilitan la tarea de programación, ya que representan en forma simbólica y en manera de un texto los códigos que podrán ser leídos y escritas por personas, a su vez resultan independientes del modelo de computador a utilizar. Por otra parte, los lenguajes de programación en código de máquina son verdaderamente difíciles de entender para una persona, ya que están compuestos de códigos numéricos sin sentido nemotécnico. Tipos de Lenguajes de Programación Absoluto: En control numérico existen dos formas posibles de especificar, los valores de los vocablos dimensionales. La diferencia entre estas dos, formas es la referencia utilizada en la especificación: Función g90. En el caso de coordenadas especificadas en forma absoluta se utiliza la función G90. Las coordenadas especificadas respecto de este sistema deberán ser siempre referidas al sistema coordenado activo en ese momento. Ejemplo: G90 GOO X30 Y60 Función g91. En este caso, la posición a la que ha de desplazarse la herramienta de corte se programa mediante los, vocablos expresados respecto al punto anterior definido. Ejemplo: G91 G00 X20 Y30 Simbólico: Cada instrucción de la máquina se transforma en una única instrucción en código simbólico. Pero además, para mejorar la legibilidad del programa, el código simbólico introduce instrucciones adicionales, que no corresponden a ninguna instrucción de la máquina y que proporcionan información. Se llaman "seudoinstrucciones". El código simbólico puede parecer de difícil acceso, pero es más fácil de recordar e interpretar binario o el hexadecimal. Para utilizarlos, hay que conocer a fondo el microprocesador, los registros de trabajo de que dispone, que el la estructura de la memoria, y código simbólico microprocesador para que sea Además, el muchas está cosas demasiado ligado más. al posible escribir programas independientes de la máquina en que van a ejecutarse. Para ello, hubo que esperar a la siguiente generación de lenguajes. Bajo Nivel: depende totalmente de la máquina, es decir que el programa que se realiza con este tipo de lenguajes no se pueden migrar o utilizar en otras maquinas, en este caso de la computadora u ordenador, esos solos entienden el lenguaje binario o el código máquina, que consiste en ceros y unos. Es decir, que para realizar cualquier acción, solo utilizan este tipo de lenguaje de programación. Los lenguajes de programación más cercanos a la arquitectura del hardware pertenecen al tipo de lenguajes de programación de bajo nivel. Al estar prácticamente diseñados a medida del hardware, aprovechan al máximo las características del mismo. Dentro de este grupo se encuentran: - El lenguaje maquina: este lenguaje ordena a la máquina las operaciones fundamentales para su funcionamiento. Consiste en la combinación de 0's y 1's para formar las ordenes entendibles por el hardware de la maquina. Este lenguaje es mucho más rápido que los lenguajes de alto nivel. La desventaja es que son bastantes difíciles de manejar y usar, además de tener códigos fuente enormes donde encontrar un fallo es casi imposible. - El lenguaje ensamblador es un derivado del lenguaje maquina y está formado por abreviaturas de letras y números llamadas mnemotécnicos. Con la aparición de este lenguaje se crearon los programas traductores para poder pasar los programas escritos en lenguaje ensamblador a lenguaje máquina. Como ventaja con respecto al código máquina es que los códigos fuentes eran más cortos y los programas creados ocupaban menos memoria. Las desventajas de este lenguaje siguen siendo prácticamente las mismas que las del lenguaje ensamblador, añadiendo la dificultad de tener que aprender un nuevo lenguaje difícil de probar y mantener. Alto Nivel: Todos aquellos lenguajes de programación que son más afines al lenguje natural que al lenguaje máquina. Estos lenguajes de programación son completamente independientede de la arquitectura del hardware de la computadora u ordenador. Por lo que en general, un programa escrito con un lenguaje de programación de alto nivel lo podemos utilizar en cualquier otra computadora. Estos lenguajes de programación de lato nivel solo necesitan un tractor que entienda el código fuente y las características de la máquina para poder funcionar correctamente. Los leguajes de programación que se encuentran más próximos a los ususarios y programadores pertenecen al tipo de lenguajes de programación de alto nivel. Lenguaje de programación aplicada a los diferentes campos Informatica aplicada al comercio Vigilancia: es el monitoreo del comportamiento. Vigilancia por sistema es el proceso de monitoreo de personas, objetos o procesos dentro de sistemas para la conformidad de normas esperadas o deseadas en sistemas confiables para control de seguridad o social. Vigilancia clínica se refiere al monitoreo de enfermedades o indicadores públicos relacionados con la salud (por ejemplo, síntomas indicando actos de bio-terrorismo) por epistemólogos y profesionales de la salud. A pesar de que en francés la palabra vigilancia significa literalmente "mirar por encima", el término es usualmente utilizado para toda forma de observación o monitoreo, no sólo la observación visual. Sin embargo, el "ojo en el cielo" que todo lo ve, es aún el ícono de la vigilancia. Para la vigilancia en muchas ciudades modernas y edificios se suelen emplear circuitos cerrados de televisión. Si bien la vigilancia puede ser una herramienta útil para las fuerzas y empresas de seguridad, mucha gente se muestra preocupada por el tema de la pérdida de privacidad. La palabra vigilancia es usualmente usada para describir observación desde una distancia por medio de equipo electrónico u otros medios tecnológicos. Por ejemplo: escuchas secretas o eavesdropping escuchas telefónicas micrófonos direccionales aparatos de escucha encubiertos microcámaras circuitos cerrados de televisión Informatica aplicada a la ciencia En la ciencia, el computador es de gran ayuda para analizar los datos, almacenar y recuperar información, simplificar expresiones, controlar experimentos, identificar moléculas, medir áreas de figuras especificas, llevar información estadística de procesos, etc. Las siguientes aplicaciones son ejemplos de mucha importancia que resaltan el trabajo de las computadoras en el ámbito científico: La nanotecnología: es la manipulación de materiales a una escala molecular. Muchos científicos utilizan hebras artificiales de ADN para lograrlo. Esta tecnología no podría darse ampliamente sin el uso de las computadoras. Technology Review publica que investigadores de la Universidad de Dortmund han descubierto la forma de hacer que ADN pegue y separe nanopartículas de oro a medida. Se podría aplicar este método a sensores que detectan sustancias y actividades biológicas en el laboratorio y en el cuerpo humano. También se podría aplicar a materiales programables cuyas propiedades se pueden cambiar al añadir un trozo de ADN. Cirugía Virtual : Estudiantes y profesores de biología o medicina, o simplemente curiosos a los que les interesa seguir de cerca avances en la medicina y la enseñanza, disponen de una nueva herramienta, gratis, para practicar la cirugía virtual sobre la rodilla de un paciente virtual. Solo se requiere un ordenador, conexión a Internet y buenos conocimientos de inglés. Este gran avance en la enseñanza virtual ha sido iniciativa de Edheads, cuya misión es: ".... crear experiencias educacionales únicas en Internet, diseñadas para hacer comprensible conceptos que son difíciles de comprender, a través de la fuerza y interactividad de Internet. Fijaremos nuevos niveles de excelencia a través de una oferta de contenidos detallados con estilos frescos y emocionantes que permitan al usuario aprender de forma intuitiva en un entorno en línea". La pluma mágica de Microsoft: El Centro de Investigación de Microsoft en Asia ha desarrollado una nueva versión de pluma electrónica - un avance tecnológico que permite alternar entre el papel y la pantalla sin tener que soltar su pluma. Con esta "pluma universal", se puede escribir sobre papel, y ver simultáneamente como sus comentarios aparecen en la pantalla de su ordenador. A diferencia de los lápices electrónicos ya conocidos, que permiten escribir sobre la pantalla de un ordenador o sobre papel electrónico, este nuevo invento utiliza tinta normal, escribe sobre papel normal, y permite que sus usuarios combinen textos escritos a mano con gráficos e imágenes. Informatica aplicada a la educación Desde el punto de vista educativo, la programación de computadores compromete a los estudiantes en la consideración de varios aspectos importantes para la solución de problemas: decidir sobre la naturaleza del problema, seleccionar una representación que ayude a resolverlo y, monitorear sus propios pensamientos (metacognición) y estrategias de solución. Este último aspecto debe desarrollarse desde edades tempranas. No debemos olvidar que solucionar problemas con ayuda del computador puede convertirse en un excelente ejercicio para adquirir la costumbre de enfrentar problemas predefinidos de manera rigurosa y sistemática; aunque no siempre sea necesario utilizar un computador para solucionarlos. Dada la urgencia actual para que los estudiantes desarrollen habilidades del Siglo XXI, se debe empezar a trabajar en el aula, con ese propósito, desde edades tempranas; y la posibilidad de contacto directo y divertido con diferentes entornos de programación, puede acercarlos a alcanzar dicho objetivo. En consecuencia con estos razonamientos, en la Educación Básica Primaria es altamente recomendable, introducir la programación de computadores mediante ambientes de programación basados en el lenguaje Logo, fáciles de usar y que permiten realizar procedimientos que contienen estructuras básicas (secuencial, decisión y repetición); teniendo siempre en mente que conduzcan a desarrollar habilidades del Siglo XXI. Posteriormente, en básica Secundaria, se podrían trabajar entornos de programación visuales y amigables, más demandantes y retadores, como Alice. Con estos, los estudiantes pueden realizar construcciones más complejas que los preparen para usar lenguajes profesionales orientados a objetos. Por ejemplo, en Colombia, se han hecho ajustes buscando la mejor forma tanto de secuenciar los contenidos como de abordar la solución de problemas, en este caso, trabajando con el área de Matemáticas. Resultado de esta experiencia, es la evidencia de que cuando los estudiantes “programadores” resuelven problemas matemáticos retadores en un ambiente como Logo, ponen a prueba la comprensión real que tienen respecto a los conceptos matemáticos involucrados en las soluciones de los problemas. Esto implicó, durante el desarrollo del proyecto, asegurar que los estudiantes de primaria desarrollaran previamente competencias en comprensión lectora y en los temas básicos de matemáticas con los que iban a trabajar. Inicialmente, sólo se trabajó con estudiantes de grado 5° y con el entorno de programación MicroMundos. Posteriormente, se extendió el curso de Algoritmos y Programación a grado 4° y se integró a la propuesta el entorno Scratch. MicroMundos EX es una poderosa herramienta multimedia basada en Logo, dirigida a niños de 6 a 12 años, que permite crear proyectos incorporando películas, fotos, sonidos, gráficos, textos y animación. Esta herramienta, creada por la compañía canadiense LCSI, es de pago. Scratch es un entorno de programación gratuito desarrollado por un grupo de investigadores del Lifelong Kindergarten Group del Laboratorio de Medios del MIT, bajo la dirección del Dr. Mitchel Resnick. Este entorno aprovecha los avances en diseño de interfaces para hacer que la programación sea más atractiva y accesible para todo aquel que se enfrente por primera vez a aprender a programar. Según sus creadores, fue diseñado como medio de expresión para ayudar a niños y jóvenes a expresar sus ideas de forma creativa, al tiempo que desarrollan habilidades de pensamiento lógico y de aprendizaje del Siglo XXI, a medida que sus maestros superan modelos de educación tradicional con la utilización de las TIC. Edubuntu es una derivación oficial de la distribución Linux Ubuntu, destinada para su uso en ambientes escolares. Su lista de paquetes está más orientada a tal fin, incorporando el servidor de Terminal, y aplicaciones educativas como GCompris y la KDE Edutainment Suite.[1] Edubuntu ha sido desarrollado en colaboración con docentes y tecnólogos de múltiples países. Edubuntu se construyó sobre Ubuntu e incorpora una arquitectura de cliente de LTSP, así como de usos educativos específicos, con un objetivo a la población entre los 6 y los 18 años. Al igual que Ubuntu, cuenta con un servicio ShipIt[2] para encargar CDs gratis. Informatica aplicada a otros campos Programación neurolingüística ¿Qué es? La PNL (Programación Neurolingüística) constituye un modelo, formal y dinámico de cómo funciona la mente y la percepción humana, cómo procesa la información y la experiencia y las diversas implicaciones que esto tiene para el éxito personal. Con base en este conocimiento es posible identificar las estrategias internas que utilizan las personas de éxito, aprenderlas y enseñarlas a otros (modelar); para facilitar un cambio evolutivo y positivo. La Programación Neurolingüística, por analogía con el ordenador, utiliza los patrones universales de comunicación y percepción que tenemos para reconocer e intervenir en procesos diversos (aprendizaje, terapia, afrontamiento del estrés, negociación, gestión de conflictos, superación de fobias, etc...). El campo de trabajo es tan amplio como lo es el de las relaciones interpersonales. Tuvo su origen en las investigaciones de Richard Bandler y John Grinder, auténticos padres de la PNL, que trataban de averiguar por qué determinados tratamientos de tres terapeutas en Estados Unidos ( Satir, Erickson y Perls) conseguían mayor éxito que el resto de sus colegas. La PNL es el estudio de lo que percibimos a través de nuestros sentidos (vista, oído, olfato, gusto y tacto), cómo organizamos el mundo tal como lo percibimos y cómo revisamos y filtramos el mundo exterior mediante nuestros sentidos. Además, la PNL investiga los procesos que hacen que transmitamos nuestra representación del mundo a través del lenguaje. Es por tanto una aplicación práctica que nos permite, mediante técnicas y herramientas precisas, reconocer y desarrollar habilidades para el crecimiento personal y la mejora de las relaciones interpersonales. Pero sobre todo, nos permite conocer de manera objetiva la percepción de los demás y la de nosotros mismos. Es como si tuvieramos incorporado una "Máquina de la verdad" que podemos manejar de manera infalible en un 99% de los casos. ¿Para qué? La PNL se puede utilizar para desarrollar de manera rápida y eficaz un proceso de aprendizaje y así superar una situación de estrés, de conflicto, negociar con mayor ventaja frente a nuestros adversarios, etc. En realidad nos permite conocer la percepción de las otras personas a quienes tenemos enfrente o a nosotros mismos. Es un complemento en el desarrollo de la Inteligencia emocional. Entre otras cosas, la PNL Aumenta de manera notable y rápida la autoconfianza. Mejora las relaciones interpersonales. Desarrolla el crecimiento personal y profesional hacia el éxito. Nos permite convertirnos en quien deseamos y queremos ser. Sirve para reducir el estrés. Negociar y solucionar confllictos de manera positiva. ¿Quiénes? Comenzó a utilizarse por pedagogos y psicólogos, los primeros para mejorar los procesos enseñanza-aprendizaje, los segundos como una forma de terapia eficaz y rápida. De este modo, la PNL se extendió al ámbito empresarial y al autodesarrollo de la mano de directivos y otros profesionales. Así, profesionales de otras disciplinas (economía, recusos humanos, comunicación...) la utilizan como herramienta eficaz y de demostrada utilidad en entrevistas personales, comunicación, negociación, etc. La ventaja principal es la capacidad que tenemos para reprogramarnos y superar o afrontar situaciones que en otras condiciones no podríamos: esa es la gran ventaja de la PNL. Otra de las posibilidades hay que buscarlas en la capacidad de automotivación. No es fácil encerrar tanto potencial de la PNL, pues en realidad abarca todos los campos humanos. A modo de guía exponemos los ámbitos de aplicación más usuales: Salud: En aquellas patologías relacionadas con el estrés, en las somatatizaciones, alergias, como coadyuvante de terapia tradicional, disfunciones en las que se requiera de un especial autocontrol. Psicoterapia: Son más que conocidas sus técnicas para la cura de fobias, estrés postraumático, conflictos internos, desórdenes de personalidad, esquizofrenia, depresión, compulsiones, control emocional, desórdenes sexuales y manejo de adicciones a sustancias. Deportes: Por un lado para deportista, donde permite mejorar el rendimiento deportivo de manera espectacular. También en escuela deportiva para el aprendizaje de diversos deportes como tenis, golf, tiro, ciclismo y atletismo; entre otros. Empresas: Es el más reciente de los ámbitos de aplicación y el más llamativo. Qué duda cabe de las aportaciones en trabajo en equipo, solución de conflictos, administración de personal, liderazgo, motivación, comunicación, creatividad, planificación estratégica, toma de decisiones, adaptación al cambio, selección de personas, evaluación de desempeño y ventas, entre muchos otros. Desarrollo y mejora personal: Es este otro de los campos donde la PNL se mueve con soltura, así en ámbitos específicos como autoestima, asertividad, relaciones de pareja, relaciones interpersonales, conflictos, manejo de crisis personales y orientación hacia el éxito, son sólo una muestra de las posibilidades de aplicación. Educación: Hay varias áreas dentro de la educación: por un lado en la relación enseñanza-aprendizaje en un contexto práctico y dirigido a resultados y a solucionar problemas de aprendizaje, aumento de la creatividad, aprendizaje de las matemáticas, aprendizaje de la física y la química, etc.. Por otro lado en la mejora de las relaciones en el aula: solución de conflictos en el aula y mejora de la eficacia docente; entre otros. Traductores Compiladores Es un programa que traduce un lenguaje de alto nivel al lenguaje máquina. Un programa compilado indica que ha sido traducido y está listo para ser ejecutado. La ejecución de los programas compilados es más rápida que la de los interpretados, ya que el interprete debe traducir mientras está en la fase de ejecución (saca todos los errores). Un compilador es un programa que traduce el programa fuente (conjunto de instrucciones de un lenguaje de alto nivel, por ejemplo Basic o Pascal) a programa objeto (instrucciones en lenguaje máquina que la computadora puede interpretar y ejecutar). Se requiere un compilador para cada lenguaje de programación. Un compilador efectúa la traducción, no ejecuta el programa. Una vez compilado el programa, el resultado en forma de programa objeto será directamente ejecutable. Presentan la ventaja considerable frente a los intérpretes de la velocidad de ejecución, por lo que su uso será mejor en aquellos programas probados en los que no se esperan cambios y que deban ejecutarse muchas veces. En caso de que se opte por un interpretador se debe considerar que el intérprete resida siempre en memoria. Partes de un compilador La construcción de un compilador involucra la división del proceso en una serie de fases que variará con su complejidad. Generalmente estas fases se agrupan en dos tareas: el análisis del programa fuente y la síntesis del programa objeto. Análisis: Se trata de la comprobación de la corrección del programa fuente, e incluye las fases correspondientes al Análisis Léxico (que consiste en la descomposición del programa fuente en componentes léxicos), Análisis Sintáctico (agrupación de los componentes léxicos en frases gramaticales ) y Análisis Semántico (comprobación de la validez semántica de las sentencias aceptadas en la fase de Análisis Sintáctico). Síntesis: Su objetivo es la generación de la salida expresada en el lenguaje objeto y suele estar formado por una o varias combinaciones de fases de Generación de Código (normalmente se trata de código intermedio o de código objeto) y de Optimización de Código (en las que se busca obtener un código lo más eficiente posible). Alternativamente, las fases descritas para las tareas de análisis y síntesis se pueden agrupar en Front-end y Back-end: Front-end: es la parte que analiza el código fuente, comprueba su validez, genera el árbol de derivación y rellena los valores de la tabla de símbolos. Esta parte suele ser independiente de la plataforma o sistema para el cual se vaya a compilar, y está compuesta por las fases comprendidas entre el Análisis Léxico y la Generación de Código Intermedio. Back-end: es la parte que genera el código máquina, específico de una plataforma, a partir de los resultados de la fase de análisis, realizada por el Front End. Esta división permite que el mismo Back End se utilice para generar el código máquina de varios lenguajes de programación distintos y que el mismo Front End que sirve para analizar el código fuente de un lenguaje de programación concreto sirva para generar código máquina en varias plataformas distintas. Suele incluir la generación y optimización del código dependiente de la máquina. El código que genera el Back End normalmente no se puede ejecutar directamente, sino que necesita ser enlazado por un programa enlazador (linker) Tipos de compiladores Esta taxonomía de los tipos de compiladores no es excluyente, por lo que puede haber compiladores que se adscriban a varias categorías: Compiladores cruzados: generan código para un sistema distinto del que están funcionando. Compiladores optimizadores: realizan cambios en el código para mejorar su eficiencia, pero manteniendo la funcionalidad del programa original. Compiladores de una sola pasada: generan el código máquina a partir de una única lectura del código fuente. Compiladores de varias pasadas: necesitan leer el código fuente varias veces antes de poder producir el código máquina. Compiladores JIT (Just In Time): forman parte de un intérprete y compilan partes del código según se necesitan. Pauta de creación de un compilador: En las primeras épocas de la informática, el software de los compiladores era considerado como uno de los más complejos existentes. Los primeros compiladores se realizaron programándolos directamente en lenguaje máquina o en ensamblador. Una vez que se dispone de un compilador, se pueden escribir nuevas versiones del compilador (u otros compiladores distintos) en el lenguaje que compila ese compilador. Actualmente existen herramientas que facilitan la tarea de escribir compiladores ó intérpretes informáticos. Estas herramientas permiten generar el esqueleto del analizador sintáctico a partir de una definición formal del lenguaje de partida, especificada normalmente mediante una gramática formal y barata, dejando únicamente al programador del compilador la tarea de programar las acciones semánticas asociadas. Proceso de compilación Es el proceso por el cual se traducen las instrucciones escritas en un determinado lenguaje de programación a lenguaje máquina. Además de un traductor, se pueden necesitar otros programas para crear un programa objeto ejecutable. Un programa fuente se puede dividir en módulos almacenados en archivos distintos. La tarea de reunir el programa fuente a menudo se confía a un programa distinto, llamado preprocesador. El preprocesador también puede expandir abreviaturas, llamadas a macros, a proposiciones del lenguaje fuente. Normalmente la creación de un programa ejecutable (un típico.exe para Microsoft Windows o DOS) conlleva dos pasos. El primer paso se llama compilación (propiamente dicho) y traduce el código fuente escrito en un lenguaje de programación almacenado en un archivo a código en bajo nivel (normalmente en código objeto, no directamente a lenguaje máquina). El segundo paso se llama enlazado en el cual se enlaza el código de bajo nivel generado de todos los ficheros y subprogramas que se han mandado compilar y se añade el código de las funciones que hay en las bibliotecas del compilador para que el ejecutable pueda comunicarse directamente con el sistema operativo, traduciendo así finalmente el código objeto a código máquina, y generando un módulo ejecutable. Estos dos pasos se pueden hacer por separado, almacenando el resultado de la fase de compilación en archivos objetos (un típico.obj para Microsoft Windows, DOS o para Unix); para enlazarlos en fases posteriores, o crear directamente el ejecutable; con lo que la fase de compilación se almacena sólo temporalmente. Un programa podría tener partes escritas en varios lenguajes (por ejemplo C, C++ y Asm), que se podrían compilar de forma independiente y luego enlazar juntas para formar un único módulo ejecutable. Etapas del proceso El proceso de traducción se compone internamente de varias etapas o fases, que realizan distintas operaciones lógicas. Es útil pensar en estas fases como en piezas separadas dentro del traductor, y pueden en realidad escribirse como operaciones codificadas separadamente aunque en la práctica a menudo se integren juntas. Fase de análisis Análisis léxico El análisis léxico constituye la primera fase, aquí se lee el programa fuente de izquierda a derecha y se agrupa en componentes léxicos (tokens), que son secuencias de caracteres que tienen un significado. Además, todos los espacios en blanco, líneas en blanco, comentarios y demás información innecesaria se elimina del programa fuente. También se comprueba que los símbolos del lenguaje (palabras clave, operadores,...) se han escrito correctamente. Como la tarea que realiza el analizador léxico es un caso especial de coincidencia de patrones, se necesitan los métodos de especificación y reconocimiento de patrones, y éstos métodos son principalmente las expresiones regulares y los autómatas finitos. Sin embargo, un analizador léxico también es la parte del traductor que maneja la entrada del código fuente, y puesto que esta entrada a menudo involucra un importante gasto de tiempo, el analizador léxico debe funcionar de manera tan eficiente como sea posible. Análisis sintáctico En esta fase los caracteres o componentes léxicos se agrupan jerárquicamente en frases gramaticales que el compilador utiliza para sintetizar la salida. Se comprueba si lo obtenido de la fase anterior es sintácticamente correcto (obedece a la gramática del lenguaje). Por lo general, las frases gramaticales del programa fuente se representan mediante un árbol de análisis sintáctico. La estructura jerárquica de un programa normalmente se expresa utilizando reglas recursivas. Por ejemplo, se pueden dar las siguientes reglas como parte de la definición de expresiones: 1. Cualquier identificador es una expresión. 2. Cualquier número es una expresión. 3. Si expresión1 y expresión2 son expresiones, entonces también lo son: o expresión1 + expresión2 o expresión1 * expresión2 o ( expresión1 ) Las reglas 1 y 2 son reglas básicas (no recursivas), en tanto que la regla 3 define expresiones en función de operadores aplicados a otras expresiones. La división entre análisis léxico y análisis sintáctico es algo arbitraria. Un factor para determinar la división es si una construcción del lenguaje fuente es inherentemente recursiva o no. Las construcciones léxicas no requieren recursión, mientras que las construcciones sintácticas suelen requerirla. No se requiere recursión para reconocer los identificadores, que suelen ser cadenas de letras y dígitos que comienzan con una letra. Normalmente, se reconocen los identificadores por el simple examen del flujo de entrada, esperando hasta encontrar un carácter que no sea ni letra ni dígito, y agrupando después todas las letras y dígitos encontrados hasta ese punto en un componente léxico llamado identificador. Por otra parte, esta clase de análisis no es suficientemente poderoso para analizar expresiones o proposiciones. Por ejemplo, no podemos emparejar de manera apropiada los paréntesis de las expresiones, o las palabras begin y end en proposiciones sin imponer alguna clase de estructura jerárquica o de anidamiento a la entrada. Análisis semántico La fase de análisis semántico revisa el programa fuente para tratar de encontrar errores semánticos y reúne la información sobre los tipos para la fase posterior de generación de código. En ella se utiliza la estructura jerárquica determinada por la fase de análisis sintáctico para identificar los operadores y operandos de expresiones y proposiciones. Un componente importante del análisis semántico es la verificación de tipos. Aquí, el compilador verifica si cada operador tiene operandos permitidos por la especificación del lenguaje fuente. Por ejemplo, las definiciones de muchos lenguajes de programación requieren que el compilador indique un error cada vez que se use un número real como índice de una matriz. Sin embargo, la especificación del lenguaje puede imponer restricciones a los operandos, por ejemplo, cuando un operador aritmético binario se aplica a un número entero y a un número real. Revisa que los arreglos tengan definido el tamaño correcto. Fase de síntesis Consiste en generar el código objeto equivalente al programa fuente. Sólo se genera código objeto cuando el programa fuente está libre de errores de análisis, lo cual no quiere decir que el programa se ejecute correctamente, ya que un programa puede tener errores de concepto o expresiones mal calculadas. Por lo general el código objeto es código de máquina relocalizable o código ensamblador. Las posiciones de memoria se seleccionan para cada una de las variables usadas por el programa. Después, cada una de las instrucciones intermedias se traduce a una secuencia de instrucciones de máquina que ejecuta la misma tarea. Un aspecto decisivo es la asignación de variables a registros. Generación de código intermedio Después de los análisis sintáctico y semántico, algunos compiladores generan una representación intermedia explícita del programa fuente. Se puede considerar esta representación intermedia como un programa para una máquina abstracta. Esta representación intermedia debe tener dos propiedades importantes; debe ser fácil de producir y fácil de traducir al programa objeto. La representación intermedia puede tener diversas formas. Existe una forma intermedia llamada "código de tres direcciones" que es como el lenguaje ensamblador de una máquina en la que cada posición de memoria puede actuar como un registro. El código de tres direcciones consiste en una secuencia de instrucciones, cada una de las cuales tiene como máximo tres operandos. Esta representación intermedia tiene varias propiedades: Primera.- Cada instrucción de tres direcciones tiene a lo sumo un operador, además de la asignación, por tanto, cuando se generan estas instrucciones, el traductor tiene que decidir el orden en que deben efectuarse las operaciones. Segunda.- El traductor debe generar un nombre temporal para guardar los valores calculados por cada instrucción. Tercera.- Algunas instrucciones de "tres direcciones" tienen menos de tres operandos, por ejemplo, la asignación. Optimización de código La fase de optimización de código consiste en mejorar el código intermedio, de modo que resulte un código máquina más rápido de ejecutar. Esta fase de la etapa de síntesis es posible sobre todo si el traductor es un compilador (difícilmente un interprete puede optimizar el código objeto). Hay mucha variación en la cantidad de optimización de código que ejecutan los distintos compiladores. En los que hacen mucha optimización, llamados "compiladores optimizadores", una parte significativa del tiempo del compilador se ocupa en esta fase. Sin embargo, hay optimizaciones sencillas que mejoran sensiblemente el tiempo de ejecución del programa objeto sin retardar demasiado la compilación. Estructura de datos principales La interacción entre los algoritmos utilizados por las fases del compilador y las estructuras de datos que soportan estas fases es, naturalmente, muy fuerte. El escritor del compilador se esfuerza por implementar estos algoritmos de una manera tan eficaz como sea posible, sin aumentar demasiado la complejidad. De manera ideal, un compilador debería poder compilar un programa en un tiempo proporcional al tamaño del mismo. Componentes léxicos o tokens Cuando un analizador léxico reúne los caracteres en un token, generalmente representa el token de manera simbólica, es decir, como un valor de un tipo de datos enumerado que representa el conjunto de tokens del lenguaje fuente. En ocasiones también es necesario mantener la cadena de caracteres misma u otra información derivada de ella, tal como el nombre asociado con un token identificador o el valor de un token de número. En la mayoría de los lenguajes el analizador léxico sólo necesita generar un token a la vez. En este caso se puede utilizar una variable global simple para mantener la información del token. En otros casos (cuyo ejemplo más notable es FORTRAN), puede ser necesario un arreglo (o vector) de tokens. Árbol sintáctico Si el analizador sintáctico genera un árbol sintáctico, por lo regular se construye como una estructura estándar basada en un puntero que se asigna de manera dinámica a medida que se efectúa el análisis sintáctico. El árbol entero puede entonces conservarse como una variable simple que apunta al nodo raíz. Cada nodo en la estructura es un registro cuyos campos representan la información recolectada tanto por el analizador sintáctico como, posteriormente, por el analizador semántico. Por ejemplo, el tipo de datos de una expresión puede conservarse como un campo en el nodo del árbol sintáctico para la expresión. En ocasiones, para ahorrar espacio, estos campos se asignan de manera dinámica, o se almacenan en otras estructuras de datos, tales como la tabla de símbolos, que permiten una asignación y desasignación selectivas. En realidad, cada nodo del árbol sintáctico por sí mismo puede requerir de atributos diferentes para ser almacenado, de acuerdo con la clase de estructura del lenguaje que represente. En este caso, cada nodo en el árbol sintáctico puede estar representado por un registro variable, con cada clase de nodo conteniendo solamente la información necesaria para ese caso. Tabla de símbolos Esta estructura de datos mantiene la información asociada con los identificadores: funciones, variables, constantes y tipos de datos. La tabla de símbolos interactúa con casi todas las fases del compilador: el analizador léxico, el analizador sintáctico o el analizador semántico pueden introducir identificadores dentro de la tabla; el analizador semántico agregará tipos de datos y otra información; y las fases de optimización y generación de código utilizarán la información proporcionada por la tabla de símbolos para efectuar selecciones apropiadas de código objeto. Puesto que la tabla de símbolos tendrá solicitudes de acceso con tanta frecuencia, las operaciones de inserción, eliminación y acceso necesitan ser eficientes, preferiblemente operaciones de tiempo constante. Una estructura de datos estándar para este propósito es la tabla de dispersión o de cálculo de dirección, aunque también se pueden utilizar diversas estructuras de árbol. En ocasiones se utilizan varias tablas y se mantienen en una lista o pila. Tabla de literales La búsqueda y la inserción rápida son esenciales también para la tabla de literales, la cual almacena constantes y cadenas utilizadas en el programa. Sin embargo, una tabla de literales necesita impedir las eliminaciones porque sus datos se aplican globalmente al programa y una constante o cadena aparecerá sólo una vez en esta tabla. La tabla de literales es importante en la reducción del tamaño de un programa en la memoria al permitir la reutilización de constantes y cadenas. También es necesaria para que el generador de código construya direcciones simbólicas para las literales y para introducir definiciones de datos en el archivo de código objeto. Código intermedio De acuerdo con la clase de código intermedio (por ejemplo, código de tres direcciones o código P) y de las clases de optimizaciones realizadas, este código puede conservarse como un arreglo de cadenas de texto, un archivo de texto temporal o bien una lista de estructuras ligadas. En los compiladores que realizan optimizaciones complejas debe ponerse particular atención a la selección de representaciones que permitan una fácil reorganización. Generación de código intermedio Después de los análisis sintáctico y semántico, algunos compiladores generan una representación intermedia explícita del programa fuente. Se puede considerar esta representación intermedia como un programa para una máquina abstracta. Esta representación intermedia debe tener dos propiedades importantes; debe ser fácil de producir y fácil de traducir al programa objeto. La representación intermedia puede tener diversas formas. Existe una forma intermedia llamada "código de tres direcciones", que es como el lenguaje ensamblador para una máquina en la que cada posición de memoria puede actuar como un registro. El código de tres direcciones consiste en una secuencia de instrucciones, cada una de las cuales tiene como máximo tres operandos. El programa fuente de (1) puede aparecer en código de tres direcciones como temp1 := entarea1(60) temp2 := id3 * temp1 (2) temp3 := id2 + temp2 id1 := temp3 Esta representación intermedia tiene varias propiedades. Primera, cada instrucción de tres direcciones tiene a lo sumo un operador, además de la asignación. Por tanto, cuando se generan esas instrucciones el compilador tiene que decidir el orden en que deben efectuarse, las operaciones; la multiplicación precede a la adición al programa fuente de. Segunda, el compilador debe generar un nombre temporal para guardar los valores calculados por cada instrucción. Tercera, algunas instrucciones de "tres direcciones" tienen menos de tres operadores, por ejemplo la primera y la última instrucciones de. Optimación de Código La fase de optimación de código trata de mejorar el código intermedio de modo que resulte un código de máquina más rápido de ejecutar. Algunas optimaciones son triviales. Por ejemplo, un algoritmo natural genera el código intermedio (2) utilizando una instrucción para cada operador de la representación del árbol después del análisis semántico, aunque hay una forma mejor de realizar los mismos cálculos usando las dos instrucciones Temp1 := id3 * 60.0 (3) Id1 := id2 + temp1 Este sencillo algoritmo no tiene nada de malo, puesto que el problema se puede solucionar en la fase de optimación de código. Esto es, el compilador puede deducir que la conversión de 60 de entero a real se puede hacer de una vez por todas en el momento de la compilación, de modo que la operación entreal se puede eliminar. Además, temp3 se usa sólo una vez, para transmitir su valor a id1. Entonces resulta seguro sustituir a id1 por temp3, a partir de lo cual la última proposición de (2) no se necesita y se obtiene el código de (3). Hay muchas variaciones en la cantidad de optimación de código que ejecutan los distintos compiladores. En lo que hacen mucha optimación llamados "compiladores optimadores", una parte significativa del tiempo del compilador se ocupa en esta fase. Sin embargo hay optimaciones sencillas que mejoran significativamente del tiempo del compilador se ocupa en esta fase. Sin embargo, hay optimaciones sencillas que mejoran sensiblemente el tiempo de ejecución del programa objeto sin retardar demasiado la compilación. Archivos temporales Al principio las computadoras no tenían la suficiente memoria para guardar un programa completo durante la compilación. Este problema se resolvió mediante el uso de archivos temporales para mantener los productos de los pasos intermedios durante la traducción o bien al compilar "al vuelo", es decir, manteniendo sólo la información suficiente de las partes anteriores del programa fuente que permita proceder a la traducción. Intérpretes En ciencias de la computación, intérprete o interpretador es un programa informático capaz de analizar y ejecutar otros programas, escritos en un lenguaje de alto nivel. Los intérpretes se diferencian de los compiladores en que mientras estos traducen un programa desde su descripción en un lenguaje de programación al código de máquina del sistema, los primeros (los intérpretes) sólo realizan la traducción a medida que sea necesaria, típicamente, instrucción por instrucción, y normalmente no guardan el resultado de dicha traducción. Usando un intérprete, un solo archivo fuente puede producir resultados iguales incluso en sistemas sumamente diferentes (ejm. una PC y un PlayStation 3). Usando un compilador, un solo archivo fuente puede producir resultados iguales solo si es compilado a distintos ejecutables específicos a cada sistema. Desventajas: La desventaja principal de los interpretadores es que cuando se interpreta un programa, típicamente corre más lentamente que si hubiera sido compilado. La diferencia en velocidades puede ser minúscula o grande; a menudo un orden de magnitud y a veces más. Generalmente toma más tiempo correr un programa bajo un interpretador que correr el código compilado, pero puede tomar menos tiempo para interpretarlo que el tiempo total requerido para compilarlo y ejecutarlo. Esto es especialmente importante si se está haciendo y probando un código prototipo cuando un ciclo de editar, interpretar y depurar del interpretador, a menudo puede ser mucho más corto que el ciclo de editar, compilar, ejecutar y depurar del compilador. Algunos ejemplos de lenguajes que son normalmente interpretados en vez de compilados son: Perl PHP Java JavaScript Logo ASP (hasta la versión 3) Python C# J# ASP Editores de texto Es un programa que permite crear y modificar archivos digitales compuestos únicamente por texto sin formato, conocidos comúnmente como archivos de texto o texto plano. El programa lee el archivo e interpreta los bytes leídos según el código de caracteres que usa el editor. Hoy en día es comúnmente de 7- ó 8-bits en ASCII o UTF-8, rara vez EBCDIC. Por ejemplo, un editor ASCII de 8 bits que lee el número binario 0110 0001 (decimal 97 ó hexadecimal 61) en el archivo lo representará en la pantalla por la figura a, que el usuario reconoce como la letra "a" y ofrecerá al usuario las funciones necesarias para cambiar el número binario en el archivo. Los editores de texto son incluidos en el sistema operativo o en algún paquete de software instalado y se usan cuando se deben crear o modificar archivos de texto como archivos de configuración, scripts o el código fuente de algún programa. El archivo creado por un editor de texto incluye por convención en DOS y Microsoft Windows la extensión .txt, aunque pueda ser cambiada a cualquier otra con posterioridad. Tanto Unix como Linux dan al usuario total libertad en la denominación de sus archivos. Al trasladar archivos de texto de un sistema operativo a otro se debe considerar que existen al menos dos convenciones diferentes para señalar el término de una línea: Unix y Linux usan sólo retorno de carro en cambio Microsoft Windows usa al término de cada línea retorno de carro y salto de línea. Los editores de textos "planos" se distinguen de los procesadores de textos en que se usan para escribir sólo texto, sin formato y sin imágenes, es decir sin diagramación. Antes que existieran los editores de texto, los datos y el código fuente de los programas debía ser entregado a la máquina por medio de tarjetas perforadas. El programa, un fajo de tarjetas, era leído por un lector de tarjetas perforadas. Cada carácter era representado por una o más perforaciones en una columna de 8 o 10 posibles perforaciones. No más de 80 caracteres podían ser representados en una tarjeta. Con los Teletipos aparecieron también los primeros editores de texto que en un comienzo solo mostraban una línea del texto. Mandatos especiales movían el "cursor" en la cuatro direcciones. El siguiente paso se dio con la aparición del monitor de tubo de rayos catódicos que permitió la edición a "pantalla completa" es decir mostrando varias líneas a la vez. El aumento de productividad fue enorme, por la rapidez y simplicidad del mecanismo. Uno de los primeros editores de texto fue el O26 escrito para la consola del operador de la serie de computadores CDC 6000 a mediados de la década de los 1960'. Otro precursor es el vi, escrito en los 1970' que aún es el estándar para los sistemas operativos Unix y Linux. Tipos de editores de texto Hay una gran variedad de editores de texto. Algunos son de uso general, mientras que otros están diseñados para escribir o programar en un lenguaje. Algunos son muy sencillos, mientras que otros tienen implementadas gran cantidad de funciones. El editor de texto debe ser considerado como una herramienta de trabajo del programador o administrador de la máquina. Como herramienta permite realizar ciertos trabajos, pero también requiere de aprendizaje para que el usuario conozca y obtenga destreza en su uso. La llamada curva de aprendizaje es una representación de la destreza adquirida a lo largo del tiempo de aprendizaje. Un editor puede ofrecer muchas funciones, pero si su curva de aprendizaje es muy larga, puede desanimar el aprendizaje y terminará siendo dejado de lado. Puede que un editor tenga una curva de aprendizaje muy empinada y corta, pero si no ofrece muchas funciones el usuario le reemplazará por otro más productivo. Es decir la elección del editor más apropiado depende de varios factores, alguno de ellos muy subjetivos. Esta coyuntura de intereses ha dado lugar a largas discusiones sobre la respuesta a la pregunta "¿cual es el mejor editor de texto?". Hoy en día muchos editores originalmente salidos de Unix o Linux han sido portados a otros sistemas operativos, lo que permite trabajar en otros sistemas sin tener que aprender el uso de otro editor. Algunos editores son sencillos mientras que otros ofrecen una amplia gama de funciones. Editores para profesionales deben ser capaces de leer archivos de gran extensión, mayor que la capacidad e la memoria RAM de la máquina y también arrancar rápidamente, ya que el tiempo de espera disminuye la concentración y disminuye de por si la productividad.los editore sde texto sirven para muchas cosas pues facilita el trabajo Algunos editores de texto incluyen el uso de lenguajes de programación para automatizar engorrosos o repetidos procedimientos a realizar en el texto. Por ejemplo, Emacs puede ser adaptado a las necesidades del usuario, incluso las combinaciones de teclas para ejecutar funciones pueden ser adaptadas y es programable en Lisp. Muchos editores de texto incluyen coloreado de sintaxis y funciones que ofrecen al usuario completar una palabra iniciada usando para ello la configuración. Enlazadores Es un programa que toma los ficheros de código objeto generado en los primeros pasos del proceso de compilación, la información de todos los recursos necesarios (biblioteca), quita aquellos recursos que no necesita, y enlaza el código objeto con su(s) biblioteca(s) con lo que finalmente produce un fichero ejecutable o una biblioteca. En el caso de los programas enlazados dinámicamente, el enlace entre el programa ejecutable y las bibliotecas se realiza en tiempo de carga o ejecución del programa. Los primeros conceptos de programación similares a las bibliotecas intentaban separar las definiciones de datos de la implementación del programa. El concepto COMPOOL (Communication Pool) fue popularizado por JOVIAL en 1959, aunque tomó la idea prestada del software de los grandes sistemas SAGE. Siguiendo los principios de las ciencias de la computación de "separación de problemas" (aislar problemas pequeños fáciles de abordar) y "ocultación de información", "el propósito del COMPOOL es permitir el intercambio de datos del sistema entre varios programas, proporcionando una descripción centralizada de los mismos" (Wexelblat 1981:369). COBOL incluyó un "primitivo sistema de bibliotecas" en el año 1959 (Wexelblat 1981:274), pero Jean Sammet las describió retrospectivamente como "recursos insuficientes de biblioteca" (Wexelblat 1981:258). Otra de las grandes contribuciones al concepto moderno de biblioteca fue la innovación de subprograma de FORTRAN. Éstos pueden ser compilados con independencia unos de otros, pero el compilador carece de un enlazador, por lo que el chequeo de tipos entre los subprogramas resulta imposible (Wilson et. Al. 1988:126). Por último, se debe hablar de la influencia que Simula 67 tuvo en el concepto de 'biblioteca'. Simula es el primer lenguaje de programación orientado a objetos, y sus clases son casi idénticas que el concepto actual que se utiliza en Java, C++ y C#. El concepto de clase de Simula fue también el origen del "paquete" en Ada y el "módulo" de Modula-2 (Wilson et. Al. 1988:52). A pesar de haber sido desarrollado en 1965, las clases de Simula podían ser incluidas en ficheros de biblioteca y añadidas en tiempo de compilación (Wexelblat 1981:716). Tipos de lenguajes según su estilo de programación Imperativos En ciencias de la computación se llama lenguajes imperativos a aquellos en los cuales se le ordena a la computadora cómo realizar una tarea siguiendo una serie de pasos o instrucciones. Los lenguajes imperativos se basan en comandos u órdenes que se le dan a la computadora para que haga algo, con el fin de organizar o cambiar valores en ciertas partes de la memoria. La ejecución de estos comandos se realiza, en la mayor parte de ellos, secuencialmente, es decir, hasta que un comando no ha sido ejecutado no se lee el siguiente. La implementación de hardware de la mayoría de computadores es imperativa; prácticamente todo el hardware de los computadores está diseñado para ejecutar código de máquina, que es nativo al computador, escrito en una forma imperativa. Esto se debe a que el hardware de los computadores implementa el paradigma de las Máquinas de Turing. Desde esta perspectiva de bajo nivel, el estilo del programa está definido por los contenidos de la memoria, y las sentencias son instrucciones en el lenguaje de máquina nativo del computador (por ejemplo: el lenguaje ensamblador). Los lenguajes imperativos de alto nivel usan variables y sentencias más complejas, pero aún siguen el mismo paradigma. Las recetas y las listas de revisión de procesos, a pesar de no ser programas de computadora, son también conceptos familiares similares en estilo a la programación imperativa; cada paso es una instrucción, y el mundo físico guarda el estado (Zoom). Lenguajes imperativos procedurales En los lenguajes tradicionales o procedurales, es la aplicación quien controla qué porciones de código se ejecuta, y la secuencia en que este se ejecuta. La ejecución de la aplicación se inicia con la primera línea de código, y sigue una ruta predefinida a través de la aplicación, llamando procedimientos según sea necesario. Los lenguajes procedurales están fundamentados en la utilización de variables para almacenar valores y en la realización de operaciones con los datos almacenados. Algunos ejemplos son: FORTRAN, PASCAL, C, ADA, ALGOL,… Algunos lenguajes de programación imperativos que se pueden mencionar son: BASIC C C++ Java C# Declarativos PHP Perl ASP Fortran Pascal 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. 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. 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 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. Desventaja: 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. Ventajas: 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. Algunos lenguajes PROLOG SQL HTML declarativos que se pueden mencionar son: WSDL (Web Services Description Language) XML Stylesheet Language for Transformation CUADRO RESUMEN Cuadros comparativos LENGUAJES DE PROGRAMACIÓN Tipos de lenguajes Absoluto Simbólico Bajo nivel Alto nivel En control numérico existen dos formas posibles de especificar, los valores de los vocablos dimensionales, con estas dos funciones: G90 y la G91. - Cada instrucción de la máquina se transforma en una única instrucción en código simbólico. Introduce instrucciones adicionales y procesan información. - Está demasiado ligado al microprocesador. -Depende totalmente de la máquina. -Solo entienden el lenguaje binario o el código máquina. -Dentro de este grupo se encuentra el lenguaje máquina y el lenguaje ensamblador. -Son más afines al lenguje natural que al lenguaje máquina. -Son completamente independientede de la arquitectura del hardware de la computadora. -Solo necesitan un tractor que entienda el código fuente y las características de la máquina para poder funcionar correctamente. Traductores Compiladores Interpretes Enlazadores Editores -Traduce un lenguaje de alto nivel al lenguaje máquina. -Su ejecución es más rapido que la de los in terpretados. -Efectúa la traducción, no ejecuta el programa. -Analiza y ejecuta otros programas, escritos en lenguaje de alto nivel. -Realizan la traducción a medida que sea necesaria, típicamente, instrucción por instrucción, y normalmente no guardan el resultado de dicha traducción. -En éstos, un solo archivo fuente puede producir resultados iguales incluso en sistemas sumamente diferentes. -Toma los ficheros de código objeto generado en los primeros pasos del proceso de compilación. -Quita aquellos recursos que no necesita, y enlaza el código objeto con su(s) biblioteca(s) con lo que finalmente produce un fichero ejecutable. -El enlace entre el programa ejecutable y las bibliotecas se realiza en tiempo de carga o ejecución del programa. -Es un programa que permite crear y modificar archivos digitales compuestos únicamente por texto sin formato. -El programa lee el archivo e interpreta los bytes leídos según el código de caracteres que usa el editor. -Son incluidos en el sistema operativo o en algún paquete de software instalado y se usan cuando se deben crear o modificar archivos de texto como archivos de configuración, scripts o el código fuente de algún programa. Estilos de programación Imperativos -Se basan en comandos u órdenes que se le dan a la computadora para que haga algo. -La ejecución de estos comandos se realiza, en la mayor parte de ellos, secuencialmente. -Se encuentran los lenguajes imperativos procedurales la cual es la aplicación que controla qué porciones de código se ejecuta, y la secuencia en que este se ejecuta. Declarativos -Desventaja: 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. -Ventajas: 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. MAPA CONCEPTUAL Abosoluto LOS LENGUAJES DE PROGRAMACIÓN Tiene cuatro tipos: Bajo nivel Son: Simbólico Alto nivel Herramientas que nos permiten crear programas y software. Se pueden aplicar a diferentes campos como: Los cuales podemos utlizar y leer con lo que llamamos: Científico Eductivo Comercial Traductores Tienen dos diferentes estilos para programarse: Como por ejemplo los: Compiladores Enlazadores Editores Interpretes Interpretativamente Declarativamente CONCLUSION Entre los objetivos de la informatica, se encuentra, el diseño e implementación de maquinas, como computadoras u ordenadores, diseño e implementación de nuevas funciones o metodos de trabajo a seguir, el diseño e implementación de aplicaciones o sistemas de informatica y /o el mantenimiento de sistemas informaticos en funcionamiento. Hoy en dia la informatica es aplicada en el entorno de las actividades de cada personas, tales como: Medicina, contruccion, industria, controles de proceso, investigaciones cientifica, gestion empresarial, etc. La informatica se aplica para aumentar la productividad en cada area de las anteriormente señaladas, ya que permite un procesamiento de datos rapido y eficaz, por lo que tambien representa como ventaja una reduccion de costes. Por lo tanto, los lenguajes de programación han tomado mucha importancia dentro de lo que es el mundo de la informática. Esto se debe a pueden usarse para crear programas que controlen el comportamiento físico y lógico de una máquina, para expresar algoritmos con precisión, o como modo de comunicación humana. Como hemos aprendido, la programación tiene inumerables campos en los cuales aplicar. Y uno de los campos más relevantes es la ciencia. En éste campo la infomática, ha sabido como abrirse paso entre los deferentes obstáculos que se le presentan a la raza humana. Por lo tanto, la ciencia, ha contribuido enormemente al ser humano. WEB-BLIOGRAFÍA http://www.lenguajes-de-programacion.com/lenguajes-de-programacion.shtml http://www.alegsa.com.ar/Dic/lenguaje%20de%20programacion.php http://www.torrealday.com.ar/articulos/articulo006.htm http://www.larevistainformatica.com/tipo-lenguaje-programacion.htm http://www.desarrolloweb.com/articulos/2358.php http://www.capitalemocional.com/PNL/pnl.htm http://www.monografias.com/trabajos38/tipos-lenguajes-programacion/tipos-lenguajesprogramacion2.shtml http://www.mitecnologico.com/Main/LenguajesInterpretes http://es.wikipedia.org/wiki/Int%C3%A9rprete_(inform%C3%A1tica) http://es.wikipedia.org/wiki/Programaci%C3%B3n_imperativa http://es.wikipedia.org/wiki/Enlazador