Lenguajes de programación

Informática. Programación. Compilador. Intérprete. Códigos. Linkado. Módulos objetos. Programas

  • Enviado por: El remitente no desea revelar su nombre
  • Idioma: castellano
  • País: México México
  • 4 páginas
publicidad
publicidad

Lenguajes de Programación

Al desarrollarse las primeras computadoras electrónicas, se vio la necesidad de programarlas, es decir, de almacenar en memoria la información sobre la tarea que iban a ejecutar. Las primeras se usaban como calculadoras simples; se les indicaban los pasos de cálculo, uno por uno.

Lenguajes De Programación Tipos

Compilador:

Es un programa que traduce los programas escritos en lenguajes de alto nivel a lenguaje máquina. Los programas escritos en lenguajes de alto nivel se llaman programas fuente y El programa traducido se llama programa objeto. El compilador traduce sentencia a sentencia el programa fuente.

Algunos lenguajes compiladores típicos son: C C++ Pascal FORTRAN COBOL

Un intérprete es un traductor que toma un programa fuente, lo traduce y a continuación lo ejecuta. Los programas interpretes clásicos son: BASIC QBASIC QUICKBASIC VISUALBASIC SMALLTALK JAVA

Un compilador acepta programas escritos en un lenguaje de alto nivel y los traduce a otro lenguaje, generando un programa equivalente independiente, que puede ejecutarse tantas veces como se quiera. En un compilador hay que distinguir tres lenguajes diferentes: • el de los programas de partida (LA) • el de los programas equivalentes traducidos (LB), normalmente el lenguaje de máquina • el lenguaje en que está escrito el propio compilador (LC), que puede ser igual o diferente a uno de los otros dos.

Los programas interpretados suelen ser más lentos que los compilados, pero los intérpretes son más flexibles como entornos de programación y depuración. Comparando su actuación con la de un ser humano, un compilador equivale a un traductor profesional que, a partir de un texto, prepara otro independiente traducido a otra lengua, mientras que un intérprete corresponde al intérprete humano, que traduce de viva voz las palabras que oye, sin dejar constancia por escrito. ¿Qué es un compilador? Un traductor es cualquier programa que toma como entrada un texto escrito en un lenguaje, llamado fuente y da como salida otro texto en un lenguaje, denominado objeto.

Compilador En el caso de que el lenguaje fuente sea un lenguaje de programación de alto nivel y el objeto sea un lenguaje de bajo nivel (ensamblador o código de máquina), a dicho traductor se le denomina compilador. Un ensamblador es un compilador cuyo lenguaje fuente es el lenguaje ensamblador. Un intérprete no genera un programa equivalente, sino que toma una sentencia del programa fuente en un lenguaje de alto nivel y la traduce al código equivalente y al mismo tiempo lo ejecuta. Históricamente, con la escasez de memoria de los primeros ordenadores, se puso de moda el uso de intérpretes frente a los compiladores, pues el programa fuente sin traducir y el intérprete juntos daban una ocupación de memoria menor que la resultante de los compiladores. Por ello los primeros ordenadores personales iban siempre acompañados de un intérprete de BASIC (Spectrum, Commodore VIC-20, PC XT de IBM, etc.). La mejor información sobre los errores por parte del compilador así como una mayor velocidad de ejecución del código resultante hizo que poco a poco se impusieran los compiladores. Hoy en día, y con el problema de la memoria prácticamente resuelto, se puede hablar de un gran predominio de los compiladores frente a los intérpretes, aunque intérpretes como los incluidos en los navegadores de Internet para interpretar el código JVM de Java son la gran excepción. Ventajas de compilar frente a interpretar: Se compila una vez, se ejecuta n veces. En bucles, la compilación genera código equivalente al bucle, pero interpretándolo se traduce tantas veces una línea como veces se repite el bucle. El compilador tiene una visión global del programa, por lo que la información de mensajes de error es mas detallada. Ventajas del intérprete frente al compilador: Un intérprete necesita menos memoria que un compilador. En principio eran más abundantes dado que los ordenadores tenían poca memoria. Permiten una mayor interactividad con el código en tiempo de desarrollo. Un compilador no es un programa que funciona de manera aislada, sino que necesita de otros programas para conseguir su objetivo: obtener un programa ejecutable a partir de un programa fuente en un lenguaje de alto nivel. Algunos de esos programas son el preprocesador, el linker, el depurador y el ensamblador. El preprocesador se ocupa (dependiendo del lenguaje) de incluir ficheros, expandir macros, eliminar comentarios, y otras tareas similares. El linker se encarga de construir el fichero ejecutable añadiendo al fichero objeto generado por el compilador las cabeceras necesarias y las funciones de librería utilizadas por el programa fuente. El depurador permite, si el compilador ha generado adecuadamente el programa objeto, seguir paso a paso la ejecución de un programa. Finalmente, muchos compiladores, en vez de generar código objeto, generan un programa en lenguaje ensamblador que debe después convertirse en un ejecutable mediante un programa ensamblador.

Clasificación de Compiladores El programa compilador traduce las instrucciones en un lenguaje de alto nivel a instrucciones que la computadora puede interpretar y ejecutar. Para cada lenguaje de programación se requiere un compilador separado. El compilador traduce todo el programa antes de ejecutarlo. Los compiladores son, pues, programas de traducción insertados en la memoria por el sistema operativo para convertir programas de cómputo en pulsaciones electrónicas ejecutables (lenguaje de máquina). Los compiladores pueden ser de: • una sola pasada: examina el código fuente una vez, generando el código o programa objeto. • pasadas múltiples: requieren pasos intermedios para producir un código en otro lenguaje, y una pasada final para producir y optimizar el código producido durante los pasos anteriores. • Optimación: lee un código fuente, lo analiza y descubre errores potenciales sin ejecutar el programa. • Compiladores incrementales: generan un código objeto instrucción por instrucción (en vez de hacerlo para todo el programa) cuando el usuario teclea cada orden individual. El otro tipo de compiladores requiere que todos los enunciados o instrucciones se compilen conjuntamente. • Ensamblador: el lenguaje fuente es lenguaje ensamblador y posee una estructura sencilla. • Compilador cruzado: se genera código en lenguaje objeto para una máquina diferente de la que se está utilizando para compilar. Es perfectamente normal construir un compilador de Pascal que genere código para MS-DOS y que el compilador funcione en Linux y se haya escrito en C++. • Compilador con montador: compilador que compila distintos módulos de forma independiente y después es capaz de enlazarlos. • Autocompilador: compilador que está escrito en el mismo lenguaje que va a compilar. Evidentemente, no se puede ejecutar la primera vez. Sirve para hacer ampliaciones al lenguaje, mejorar el código generado, etc. • Metacompilador: es sinónimo de compilador de compiladores y se refiere a un programa que recibe como entrada las especificaciones del lenguaje para el que se desea obtener un compilador y genera como salida el compilador para ese lenguaje. El desarrollo de los metacompiladores se encuentra con la dificultad de unir la generación de código con la parte de análisis. Lo que sí se han desarrollado son generadores de analizadores léxicos y sintácticos. Por ejemplo, los conocidos: generador de analizadores léxicos LEX:

generador de YACC: analizadores sintácticos desarrollados para UNIX. Los inconvenientes que tienen son que los analizadores que generan no son muy eficientes. • Descompilador: es un programa que acepta como entrada código máquina y lo traduce a un lenguaje de alto nivel, realizando el proceso inverso a la compilación. Funciones de un compilador A grandes rasgos un compilador es un programa que lee un programa escrito es un lenguaje, el lenguaje fuente, y lo traduce a un programa equivalente en otro lenguaje, el lenguaje objeto. Como parte importante de este proceso de traducción, el compilador informa a su usuario de la presencia de errores en el programa fuente. A primera vista, la diversidad de compiladores puede parecer abrumadora. Hay miles de lenguajes fuente, desde los lenguajes de programación tradicionales, como FORTRAN o Pascal, hasta los lenguajes especializados que han surgido virtualmente en todas las áreas de aplicación de la informática. Los lenguajes objeto son igualmente variados; un lenguaje objeto puede ser otro lenguaje de programación o el lenguaje de máquina de cualquier computador entre un microprocesador y un supercomputador. A pesar de existir una aparente complejidad por la clasificación de los compiladores, como se vio en el tema anterior, las tareas básicas que debe realizar cualquier compilador son esencialmente las mismas. Al comprender tales tareas, se pueden construir compiladores para una gran diversidad de lenguajes fuente y máquinas objeto utilizando las mismas técnicas básicas. Nuestro conocimiento sobre cómo organizar y escribir compiladores ha aumentado mucho desde que comenzaron a aparecer los primeros compiladores a principios de los años cincuenta. Es difícil dar una fecha exacta de la aparición del primer compilador, porque en un principio gran parte del trabajo de experimentación y aplicación se realizó de manera independiente por varios grupos. Gran parte de los primeros trabajos de compilación estaba relacionada con la traducción de fórmulas aritméticas a código de máquina. En la década de 1950, se consideró a los compiladores como programas notablemente difíciles de escribir. EL primer compilador de FORTRAN, por ejemplo, necesitó para su implantación de 18 años de trabajo en grupo (Backus y otros [1975]). Desde entonces, se han descubierto técnicas sistemáticas para manejar muchas de las importantes tareas que surgen en la compilación. También se han desarrollado buenos lenguajes de implantación, entornos de programación y herramientas de software. Con estos avances, puede hacerse un compilador real incluso como proyecto de estudio en un curso de un semestre sobre diseño sobre de compiladores.

Una clasificación muy importante de los lenguajes es la de hacer dos grupos en base a su funcionamiento, esto es considerarlos como intérpretes y compiladores, según se describe seguidamente. Un lenguaje se dice que es un intérprete, por ejemplo los BASIC, cuando para ejecutar un programa el lenguaje ha de leer y traducir al lenguaje de la máquina las instrucciones una por una. Como es lógico el proceso se enlentece, por ejemplo si una operación está dentro de la estructura conocida como ciclo y este se repite 100 veces, el lenguaje tiene que traducirlo 100 veces al código de la máquina. No todo son desventajas, pues la parte buena de este tipo de lenguajes es que los errores se pueden corregir al momento y seguir facilmente la ejecución del programa, por lo cual son idóneos para aprender a programar, proceso en el que da lo mismo la lentitud.

Por contra un lenguaje se dice que es compilado, cuando el programa entero se traduce mediante el compilador de dicho lenguaje al lenguaje máquina correspondiente y el resultado se almacena de manera permanente en un archivo. De esta forma el programa se ejecutará de forma mucho más rápida que con un intérprete, sobre todo si hay estructuras que se repiten, caso de los ciclos. La principal desventaja es cuando se produce un error, que muchas veces se detecta en el momento de la ejecución , y la corrección no se puede hacer de inmediato, sino que hay que realizar todo el proceso de compilado desde el principio. Un ejemplo típico de lenguaje de este tipo el C ++, ampliamente usado en el desarrollo de programas.

Hay un lenguaje difundido en el ámbito de la enseñanza, es el Turbo Pascal?, cuya ventaja es que aunque se trata de un compilador tiene un entorno de trabajo como si fuera un intérprete y cualquier error se puede corregir al momento, reanudándose la ejecución del programa de inmediato.

Un ejemplo en la vida real que visualiza la diferencia entre un intérprete y un compilador es el siguiente, supongamos que tenemos un libro escrito en una lengua distinta al castellano, hay dos procesos de acceder a su contenido cuando se necesite su uso, una es traducir en el momento de su empleo la parte del libro que se necesite, pero sin transcribirla a papel, sino simplemente mediante lectura traduciendo, esto sería el proceso de interpretado, mientras que la otra opción sería traducir el libro entero al castellano y dejar dicha versión escrita sobre papel, esto sería equivalente al compilado.

El proceso de compilado no es tan inmediato como parece, se describe seguidamente de forma muy esquematizada: 1. Se escribe el programa (conocido como programa fuente) mediante un editor de textos y se almacena en un fichero.

2. Este programa fuente es invocado por la primera etapa del compilador, que efectúa un análisis léxico, se puede considerar como una interpretación del programa fuente preparándolo para un tratamiento posterior con detalle. En esta etapa se ejecutan los tres procesos indicados seguidamente: Adaptar el código fuente a un formato independiente de la forma en que se haya introducido en el sistema Eliminación de información redundante como espacios y comentarios Tratar las palabras clave y los símbolos para su paso a símbolos clave, conocido como “tokens” 3. Análisis sintáctico es el paso siguiente, el compilador determina la estructura, y de alguna forma el significado del programa fuente. El conjunto del programa se analiza en bloques, que se descomponen en instrucciones y se procede a identificar los elementos individuales. Como la sintaxis está expresada mediante un conjunto de reglas, cada una indica como se construye una estructura del programa a partir de otras estructuras de menor entidad. El proceso mediante el cual el compilador aplica estas reglas es conocido como “parsing”. Durante la compilación se genera gran cantidad de información, que se almacena en una estructura de datos conocida como diccionario o tabla de símbolos, en algún momento del proceso se necesitará la información guardada previamente. La mayor parte es información sobre variables, por ejemplo para X en el programa anterior, se tendría en el diccionario,

4. El paso siguiente es la generación de código, conocido como objeto Para ello se recorre el código intermedio generado y se busca cada uno de los “tokens” en el diccionario, lo que permite insertar las direcciones en el código máquina que se está generando.

5. El proceso siguiente es la optimización de código objeto generado, con lo que se consigue un programa más eficiente. Generalmente donde se consiguen los mejores resultados es en los bucles, cuyo objetivo es reducir al máximo el número de operaciones que se ejecutan en él.

6. Normalmente hay una etapa posterior conocida como “linkado “ en la que el o los módulos objetos generados previamente se unen entre sí y/o con otros módulos disponibles en librerías, para formar un fichero que contiene un programa ejecutable directamente desde el sistema operativo, sin necesidad de disponer del compilador correspondiente. Incluso se pueden unir programas escritos en lenguajes distintos si los módulos objeto creado se han estructurado de forma adecuada. En cualquier fase del proceso pueden detectarse errores que se podrán de manifiesto, implicando el volver hasta el programa fuente, efectuar las correcciones pertinentes y repetir todo el proceso, lo cual suele ser algo laborioso.

En el contexto de los lenguajes de programación, un intérprete es un programa que toma un programa fuente escrito en un lenguaje de alto nivel, lo analiza y lo ejecuta instrucción a instrucción bajo su control. En este caso, no se genera un programa equivalente en otro lenguaje de menor nivel, como ocurre con un compilador por lo que, si se desea repetir la ejecución del programa es preciso volver a traducirlo. Así, un intérprete realizaría el siguiente ciclo repetir leer instrucción ejecutar instrucción hasta el fin En un intérprete sólo hay que distinguir dos lenguajes diferentes, el de los programas de partida (LA), y el lenguaje en que está escrito el intérprete (LC). Comparando su actuación con la de un ser humano, un compilador equivale a un traductor profesional que, a partir de un texto, prepara otro independiente traducido a otra lengua, mientras que un intérprete corresponde al intérprete humano, que traduce de viva voz las palabras que oye, sin dejar constancia por escrito. Así, mientras un intérprete toma las instrucciones del programa fuente y las traduce y ejecuta a lenguaje máquina una a una, un compilador realiza la traducción completa del programa fuente a codigo máquina, sin ejecutarlo, siendo posteriormente cuando se ejecute el programa una vez compilado. Ventajas del intérprete frente al compilador: • El programa se puede ejecutar de inmediato, sin esperar a ser compilado. • Puede ser interrumpido con facilidad. • puede ser rápidamente modificado y ejecutado nuevamente. • Resultan muy apropiados durante la fase de desarrollo de un programa, ya que la compilación no permite la ejecución paso a paso del programa y con ello impide la edición seguimiento y depuración del programa. Desventajas del intérprete frente al compilador: • La ejecución es más lenta, pues cada intrucción debe ser traducida a código máquina tantas veces como sea ejecutada. • No son adecuados en la fase de explotación del programa ya que el proceso de interpretación se ha de repetir cada vez que se ejecuta el programa, mientras que con la compilación, una vez obtenido el programa en leguaje máquina éste puede ser ejecutado sin necesidad de compilarlo de nuevo.