miércoles, 30 de mayo de 2012

Nos Despedimos Hasta Siempre Si Es Que Tenemos Suerte :D

Con el ultimo tema subido nos despedimos de nuestros lectores, por que ese ultimo punto cierra el trabajo que debiamos exponer en el blog ...


A continuación publicaremos las paginas web que ambos creadores del blog trabajaron como primer proyecto de informatica que ocupo 1º y 2º trimestre .
gracias a los lectores de nuestro blog , hos mandamos un saludo!

Roberto Antolin Rodriguez
Antonio Alba Diaz

5. EJEMPLOS DE LENGUAJES DE ALTO NIVEL


5.1. Fortran

            Fue desarrollado en 1954 por el equipo de John Backus bajo el control de IBM. El objetivo principal era la producción de un lenguaje que pudiera traducirse de forma eficaz a lenguaje máquina.
FORTRAN significa FORmula TRANslator y está considerado como el primer lenguaje de alto nivel. Alcanzó gran popularidad desde su primera versión en 1957. Se estandarizó y mejoró en 1966 y nuevamente en 1977 y en 1990.
Está diseñado para su uso en aplicaciones científicas y técnicas. Se caracteriza por su potencia en los cálculos matemáticos, pero está limitado en todo lo relativo al tratamiento de datos no numéricos. Por esta
razón, no ha sido usado extensamente en el ámbito del microordenador, pero sigue siendo un lenguaje común en aplicaciones de investigación, ingeniería y educación.

            5.2. Cobol

            Su nombre proviene de la frase “Common Business Oriented Language” (lenguaje general para los negocios). Es el lenguaje más utilizado en aplicaciones de gestión y fue creado en 1960 por un comité patrocinado por el departamento de defensa de los Estados Unidos.
Ha experimentado diversas actualizaciones hasta su versión COBOL ANS• 85. Se ganó una amplia aceptación como lenguaje estandarizado, siendo uno de los más populares.
Las características más interesantes de este lenguaje son: se asemeja al lenguaje natural (haciendo uso abundante del inglés sencillo), es autodocumentado y ofrece grandes facilidades en el manejo de ficheros, así como en la edición de informes escritos.
Entre sus inconvenientes están sus rígidas reglas de formato de escritura, la necesidad de escribir todos los elementos al máximo detalle, la extensión excesiva en sus sentencias y la inexistencia de funciones matemáticas.

            5.3. Basic
           
            Se diseñó en 1965 para proporcionar a los principiantes un lenguaje fácil de aprender (Beginner’s
All purpose Symbolic Instruction Code).
El principal objetivo que se pretendía al diseñar BASIC era la facilidad de uso y aprendizaje, incluso a costa de la ineficiencia.
Sus principales aportaciones son las de ser un lenguaje interpretado e interactivo. Esto, unido a la popularización de los microordenadores, ha hecho que este lenguaje se extienda con rapidez e incluso que aparezcan gran diversidad de versiones que extienden y adaptan el lenguaje original, haciéndolo útil para aplicaciones técnicas y de gestión. La versión más moderna, Visual Basic, soporta las características y métodos orientados a objetos.

            5.4. Pascal
            El PASCAL recibe su nombre en honor al filósofo y matemático francés Blaise Pascal, que inventó la primera máquina mecánica para sumar. Este lenguaje fue desarrollado en 1970 por el matemático suizo Nicklaus Wirth. Los motivos fundamentales de su creación son, por un lado, proporcionar un lenguaje adecuado para la enseñanza de los conceptos y técnicas de programación, y por otra parte, desarrollar implementaciones del lenguaje que funcionen de forma fiable y eficiente sobre los ordenadores disponibles. Estos objetivos han sido alcanzados en gran medida y, además, con el tiempo ha llegado a ser un lenguaje muy utilizado en todo tipo de aplicaciones.
Está diseñado para ilustrar conceptos clave de programación, como los tipos de datos, programación estructurada y diseño descendente. Trata de proporcionar un mecanismo para implementar esos conceptos. Se ha convertido en el predecesor de otros lenguajes más modernos, como Modula• 2 y Ada.

            5.5. C

            El lenguaje C fue creado en 1972 por Dennis Ritchie, que junto con Ken Thompson había diseñado anteriormente el sistema operativo Unix, y su intención era conseguir un lenguaje idóneo para la programación de sistemas que fuese independiente de la máquina. Desde entonces, tanto el Unix como el
C han tenido un enorme desarrollo y proliferación, hasta convertirse en un estándar industrial para el desarrollo de software.
            Es un lenguaje moderno de propósito general que combina las características de un lenguaje de alto nivel (programación estructurada, tipos y estructuras de datos, recursividad, etc.) con una serie de características más propias de los lenguajes de más bajo nivel. Esta cualidad del C hace posible que se utilice la programación estructurada para resolver tareas de bajo nivel, obteniendo un código ejecutable veloz y eficiente. Debido a sus especiales características, muchas personas consideran al C como un lenguaje de nivel medio.
Se ha vuelto muy popular y es el lenguaje más utilizado entre los desarrolladores profesionales de software comercial. Además, es un lenguaje pequeño (pocas instrucciones) y conciso (no tiene instrucciones redundantes). El coste de un lenguaje tan potente y útil es que no es particularmente fácil de aprender. La programación segura y fiable en este lenguaje requiere un conocimiento bastante profundo del mismo.

            5.6. C++

            Es el sucesor del lenguaje C, fue desarrollado por Bjarne Stroustup en los laboratorios Bell a principios de la década de los 80.
Introduce la programación orientada a objetos en C. Los objetos proporcionan una forma completamente nueva de ver los programas, una nueva filosofía de programación.
Es un lenguaje muy poderoso y eficiente. Sin embargo, es aún más difícil de aprender que C. Dado que C es un subconjunto de C++, es necesario aprender todo acerca de C y luego asimilar la filosofía de la programación orientada a objetos y el uso que C++ hace de la misma. No obstante, cada vez más programadores de C adoptan C++.

            5.7. Modula- 2

            A finales de los años 70, Nicklaus Wirth dirige el desarrollo del lenguaje MODULA-2, con la intención de incluir las necesidades de la programación de sistemas y dar respuesta a las críticas recibidas con respecto a las carencias de lenguaje Pascal.
Además de incluir las características del lenguaje Pascal, el nuevo lenguaje soluciona las principales carencias del mismo, como son la posibilidad de compilación separada, creación de bibliotecas, programación concurrente, mejora en el manejo de cadenas de caracteres, procedimientos de entrada/salida y de gestión de la memoria, etc. Además posee grandes facilidades para la programación de sistemas.
Este lenguaje también posee cualidades didácticas, por lo cual, ha sido ampliamente aceptado en la comunidad universitaria como herramienta idónea para la enseñanza de la programación.

            5.8. Ada

            Constituye el último intento de obtener un único lenguaje para todo tipo de aplicaciones e incluye los últimos avances en técnicas de programación. Su diseño fue encargado por el departamento de defensa de Estados Unidos y su estandarización fue publicada en 1983. El nombre de ADA se debe a Augusta Ada Byron, condesa de Lovelace, considerada la primera programadora de la historia.
Entre las características del lenguaje se encuentran la compilación separada, la programación concurrente, la programación estructurada, su buena mantenibilidad, características de tiempo real, etc. El principal inconveniente de este lenguaje es su gran extensión, que puede complicar su
uso.

            5.9. Lisp

            Es un lenguaje de programación pequeño y conciso, diseñado en 1959 por John McCarthy en el MIT par el trabajo con inteligencia artificial. Este lenguaje toma su nombre del procesamiento de listas, en inglés LISt Processing.
Está pensado para resolver problemas de manipulación de símbolos, que son los elementos básicos de este lenguaje, y representan objetos arbitrarios del dominio de interés que se esté tratando.
El LISP es un lenguaje funcional, ya que, todo programa se puede ver como una función de alto nivel que se aplica sobre otras funciones de más bajo nivel para obtener determinados resultados. Para realizar operaciones elementales pueden utilizarse funciones de una biblioteca.
Por sus características, este lenguaje no se parece en nada a otros lenguajes de programación. A pesar de ello, es un lenguaje fácil de aprender y es el más común dentro de las aplicaciones en inteligencia artificial.

            Un problema inicial fue que no se podía ejecutar eficientemente en muchos ordenadores, por lo que han aparecido una serie de terminales dedicados al Lisp, con hardware y software de bajo nivel diseñado para soportar este lenguaje de forma eficiente. En la actualidad, existen versiones estándar de Lisp, como Common Lisp y DG Common Lisp.

            5.10. Prolog

            El PROLOG (PROgramming Logic) es un lenguaje basado en la lógica, apropiado para un gran número de aplicaciones en bases de datos e inteligencia artificial. Ha sido el lenguaje más utilizado en Europa para tal propósito.
Permite al programador expresar una serie de tareas basándose en la descripción de los objetos que intervienen en la misma (hechos y reglas) y las relaciones lógicas que existen entre ellos (predicados), en lugar de hacerlo mediante un algoritmo. Lleva incorporada la programación de operaciones y todo el esfuerzo de programación consiste en especificar adecuadamente los hechos y las reglas para después establecer las preguntas que podrán ser inferidas de forma automática.
Frente al resto de los lenguajes empleados en sistemas expertos, permite desarrollarlos sin demasiados conocimientos de programación, ya que no requiere programar ningún algoritmo. Puede utilizarse en educación, para enseñar lógica y técnicas de resolución de problemas.

4. CLASIFICACIÓN DE LOS LENGUAJES DE PROGRAMACIÓN


Los lenguajes de programación se pueden clasificar de acuerdo con diversos criterios. El criterio más simple que se puede considerar hace referencia a la proximidad del lenguaje con la máquina o con el lenguaje natural. De acuerdo con este criterio, existen tres niveles:

            • Lenguajes de bajo nivel: Lenguajes máquina.

            • Lenguajes de nivel medio: Lenguajes ensambladores y macroensambladores.

            • Lenguajes de alto nivel: El resto de los lenguajes, a los que ya hemos hecho referencia.
Dado que los lenguajes de programación, en cierto modo, han tenido un desarrollo paralelo a la evolución de los ordenadores, se pueden clasificar atendiendo a su desarrollo histórico. Esta clasificación distingue cinco generaciones de lenguajes:

            • Primera generación: Lenguajes máquina.

            • Segunda generación: Ayudas a la programación, como los ensambladores.
           
            • Tercera generación: Lenguajes de alto nivel imperativos, que siguen vigentes en la actualidad, como Pascal, Modula• 2, Fortran, Cobol, C y Ada.

            • Cuarta generación: Lenguajes o entornos de programación orientados básicamente a aplicaciones de gestión y bases de datos, como SQL, Natural, etc.

            • Quinta generación: Lenguajes orientados a aplicaciones en Inteligencia Artificial, como Lisp y Prolog.

            4.1. Clasificaciones de los lenguajes de alto nivel

            De forma muy general, los lenguajes de alto nivel se pueden dividir en lenguajes de propósito general, que pueden ser empleados en cualquier tipo de aplicación y lenguajes de propósito especial.

            Desde el punto de vista del campo de aplicación al que pertenece el lenguaje podemos considerar la siguiente clasificación:
Aplicaciones científicas: En las que predominan las operaciones numéricas o matriciales propias de algoritmos matemáticos. Lenguajes adecuados para estas aplicaciones son Fortran y Pascal.
Aplicaciones de procesamiento de datos: Donde son frecuentes las operaciones de creación, mantenimiento y consulta sobre ficheros y bases de datos. Dentro de este campo estarían aplicaciones de gestión empresarial, como programas de nóminas, contabilidad, facturación, control de inventario, etc. Lenguajes aptos para este tipo de aplicaciones son Cobol y SQL.
Aplicaciones de tratamiento de textos: Asociadas al manejo de textos en lenguaje natural. Lenguajes adecuados para ello son el Snobol y el C.
Aplicaciones en inteligencia artificial: Realización de programas que emulan el comportamiento inteligente: algoritmos de juegos, programas de comprensión del lenguaje natural, visión artificial, robótica y sistemas expertos. Los lenguajes que se suelen utilizar en estos casos son el Lisp y el Prolog.

            Aplicaciones de programación de sistemas: Programación de módulos de sistemas operativos, compiladores, ensambladores, intérpretes y, en general, aquellos de interfaz entre el hardware y los usuarios. Tradicionalmente se utilizaba el lenguaje ensamblador, pero en la actualidad se muestran muy adecuados los lenguajes Ada, C y Modula• 2.
Otra forma de clasificar los lenguajes de alto nivel tiene en cuenta el estilo de programación que fomentan, es decir, la filosofía de construcción de programas:
           
            Lenguajes imperativos o procedurales. Estos lenguajes se fundamentan en el uso de variables para almacenar valores y el uso de instrucciones que indican las operaciones a realizar sobre los datos. La mayoría de los lenguajes de alto nivel son de este tipo.

            Lenguajes declarativos. En este caso, el proceso por el cual se ejecuta el programa no aparece de forma explícita. Los programas se construyen mediante la definición de funciones (lenguajes funcionales como Lisp) o expresiones lógicas que indican las relaciones entre determinadas estructuras de datos (lenguajes de programación lógica como Prolog).

            Lenguajes orientados a objetos. El diseño de los programas se centra más en los datos y su estructura. Los programas consisten en descripciones de unidades denominadas objetos que encapsulan los datos y las operaciones que actúan sobre ellos. Uno de los lenguajes más usados en esta filosofía es el C++.

            Lenguajes orientados al problema. Este tipo de lenguajes están diseñados para problemas específicos, principalmente de gestión. Los programas están formados por sentencias que indican qué se quiere hacer. Generalmente, suelen ser generadores de aplicaciones que permiten cierta automatización de la tarea de desarrollo de software de gestión.

3. EL PROCESO DE COMPILACIÓN


Por ser los compiladores el tipo de traductor más utilizado en la actualidad, desarrollaremos el proceso de compilación, que consiste en la traducción de un programa fuente, escrito en lenguaje de alto nivel, a su correspondiente programa objeto, escrito en lenguaje máquina, dejándolo listo para la ejecución con poca o ninguna preparación adicional.
Antes del proceso de compilación, se crea el programa fuente utilizando cualquier aplicación disponible con capacidades de edición de textos.
            Para llevar a cabo la compilación, el programa debe residir en memoria principal simultáneamente con el compilador. El resultado de la compilación puede dar lugar a la aparición de errores, en cuyo caso no se genera el programa objeto, sino que se realiza un listado de compilación, un informe indicando la naturaleza y situación de los errores detectados por el compilador en el programa fuente. Con el programa editor se corrigen y se comienza de nuevo el proceso.
            Una vez finalizada la compilación y obtenido el programa objeto, se somete a un proceso de montaje donde se enlazan los distintos módulos que lo componen, en caso de tratar con programas que poseen subprogramas (que pueden ser compilados separadamente). Además, se incorporan las denominadas rutinas de biblioteca en caso de solicitarlas el propio programa. Este proceso de montaje es realizado por un programa denominado montador o encuadernador, que también recibe el nombre de editor de enlace o linker.
La compilación es un proceso complejo que consume a veces un tiempo muy superior a la propia ejecución del programa. Este proceso consta, en general, de dos etapas fundamentales: la etapa de análisis del programa fuente y la etapa de síntesis del programa objeto. Cada una de estas etapas conlleva la realización de varias fases.
            El compilador utiliza internamente una tabla de símbolos para introducir determinados datos que necesita. Esta tabla interviene prácticamente en todas las fases del proceso de compilación; así mismo, el compilador posee un módulo de tratamiento de errores que permite determinarlas reacciones que se deben producir ante la aparición de cualquier tipo de error.

            3.1. Análisis del programa fuente

            Durante esta etapa, el programa fuente se divide en sus elementos componentes, creándose una representación intermedia del mismo. Durante este proceso, es posible detectar posibles errores en la escritura del programa.

            3.1.1. Análisis lexicográfico

            Se examina el programa fuente de izquierda a derecha, reconociendo las unidades básicas de información pertenecientes al lenguaje. Estas unidades básicas se denominan unidades léxicas o tokens. Un token es un elemento o cadena (secuencia de caracteres) que tiene un significado propio en el lenguaje.
Además de reconocer cada token, almacena en la tabla de símbolos aquella información del símbolo que pueda ser necesaria para las restantes fases de compilación.

            En el caso de que no existan errores en este primer análisis, se obtiene una representación del programa formada por:

            • La descripción de símbolos en la tabla de símbolos.

            • Una secuencia de símbolos en la que se incluye, junto a cada símbolo, una referencia a la ubicación de dicho símbolo en la tabla de símbolos. Esta secuencia es denominada tira de tokens.
En esta nueva representación, se ha eliminado previamente toda la información superflua, como comentarios, tabulaciones y espacios en blanco no significativos.
Los errores que pueden ser reconocidos se deben a la detección de cadenas de caracteres del programa fuente que no se ajustan al patrón de ningún token, como identificadores de variables incorrectos, números expresados incorrectamente, cadenas de caracteres mal delimitadas, etc.

            3.1.2. Análisis sintáctico

            La sintaxis de un lenguaje de programación especifica cómo deben escribirse los programas basándose en un conjunto de reglas sintácticas que determinan la gramática del lenguaje. Un programa es sintácticamente correcto cuando sus estructuras (expresiones, sentencias, asignaciones, etc.) aparecen dispuestas de forma correcta de acuerdo a la gramática del lenguaje.
El análisis sintáctico recibe la tira de tokens del analizador lexicográfico e investiga en ella los posibles errores sintácticos que aparezcan, como expresiones estructuradas incorrectamente, falta de algún token dentro de una sentencia, formato incorrecto en una asignación, etc.
En caso de no encontrar errores, se agrupan los componentes léxicos en frases gramaticales que serán utilizadas en la síntesis del programa objeto. Estas frases gramaticales se suelen representar mediante un árbol sintáctico que pone de manifiesto la estructura jerárquica de los componentes de un programa.

            3.1.3. Análisis semántico
                       
            Una construcción de un lenguaje de programación puede ser sintácticamente correcta y carecer de significado. Por tanto, si queremos generar código en lenguaje máquina con el mismo significado que el código fuente, tendremos que determinar la validez semántica de las construcciones del código fuente.
El análisis semántico se encarga de estudiar la coherencia semántica del código fuente a partir de la identificación de las construcciones sintácticas y de la información almacenada en la tabla de símbolos. El análisis semántico debe ser capaz de detectar construcciones sin un significado correcto. Por ejemplo, asignar a una variable de tipo entero un valor de tipo cadena de caracteres, sumar dos valores booleanos, etc.

            3.2. Síntesis del programa objeto

            Construye el programa objeto a partir de la representación obtenida en la etapa de análisis.

            3.2.1. Generación de código intermedio

            Se traduce el resultado de la etapa de análisis (en el caso de ausencia de errores) a un lenguaje intermedio propio del compilador. Esta representación intermedia (código intermedio) debe poseer las siguientes características:

            • Debe ser independiente de la máquina.

            • Debe ser fácil de producir.
           
            • Debe ser fácil de traducir a un lenguaje máquina.
            Esta fase aparece, generalmente, en aquellos compiladores construidos para su implantación en distintas máquinas, ya que su existencia hace que todos los módulos de análisis del compilador sean comunes para todas las máquinas (aumenta la portabilidad del compilador y se abaratan sus costes de construcción).

            3.2.2. Optimización de código
           
            Esta fase se suele introducir para mejorar la eficiencia del código producido por el compilador. Se toma el código intermedio de forma global y se optimiza, adaptándolo a las características del procesador al que va dirigido para mejorar los resultados de su ejecución.
La optimización se realiza en cualquier parte del programa, pero es en los bucles donde se consiguen los mejores resultados; por ejemplo, sacar una sentencia que se repite fuera del bucle, consiguiendo que sólo se ejecute una vez. De esta forma, se consigue un programa igualmente correcto, pero que consume menos tiempo de ejecución.
Un problema de la optimización es que incrementa el tamaño y la complejidad del compilador.

            3.2.3. Generación de código objeto

            Se traduce el código intermedio optimizado a código final, es decir, al lenguaje máquina (en algunos casos a ensamblador) del procesador al que va dirigido el compilador. Para ello, se reserva la memoria necesaria para cada elemento del código intermedio, y cada instrucción en lenguaje intermedio es traducida a varias instrucciones en lenguaje máquina.

            3.3. Detección y tratamiento de errores

            Aunque es en la etapa de análisis donde se detectan la mayoría de los errores, cada etapa del proceso puede encontrar errores. Para tratar adecuadamente un error, interviene el módulo de tratamiento de errores que comprende generalmente la realización de dos acciones:

            • Diagnóstico del error: Trata de buscar su localización exacta y la posible causa del mismo, para ofrecer al programador un mensaje de diagnóstico, que será incluido en el listado de compilación.

            • Recuperación del error: Después de detectado un error, cada fase debe tratarlo de alguna forma para poder continuar con la compilación y permitir la detección de más errores, aunque no se genere código objeto.
Los tipos de errores que puede tener un programa son los siguientes:

            • Errores lexicográficos: Se producen por la aparición de tokens no reconocibles, es decir, cadenas que no se ajustan al patrón de ningún símbolo elemental del lenguaje.

            • Errores sintácticos: Aparecen cuando se violan las reglas de sintaxis del lenguaje.

            • Errores semánticos: Se detectan cuando aparece una secuencia sintácticamente correcta, pero que carece de sentido dentro del contexto del programa fuente.

            • Errores lógicos: Son debidos a la utilización de un algoritmo o expresión incorrecta para el problema que se trata de resolver.

            • Errores de ejecución: Son errores relacionados con desbordamientos, operaciones matemáticamente irresolubles, etc.
En ocasiones, se indican determinados errores que pueden existir pero que no perjudican al resto del proceso de compilación e incluso pueden permitir el funcionamiento del programa final. Estos mensajes de error se denominan advertencias o warnings. Un ejemplo típico puede ser la
declaración de una variable que no se utiliza en ningún bloque del programa.