traductores de lenguajes de programación

5

Click here to load reader

Upload: danielabrig

Post on 13-Jun-2015

686 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Traductores de lenguajes de programación

Texto extraído de http://traductoresune.blogspot.com

traductores de lenguajes de programación

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.

Existen distintos tipos de traductores, entre ellos destacan:

• Ensambladores

• Preprocesadores

• Intérpretes

• Compiladores

Lenguaje de Programación: Un lenguaje de programación es un lenguaje que puede ser utilizado para controlar el

comportamiento de una máquina, particularmente unacomputadora. Consiste en un conjunto de

reglas sintácticas ysemánticas que definen su estructura y el significado de sus elementos, respectivamente.

Aunque muchas veces se usa lenguaje de programación ylenguaje informático como si fuesen sinónimos, no tiene por qué ser

así, ya que los lenguajes informáticos engloban a los lenguajes de programación y a otros más, como, por ejemplo, el HTML.

Un lenguaje de programación permite a un programadorespecificar de manera precisa: sobre qué datos una computadora debe

operar, cómo deben ser estos almacenados y transmitidos y qué acciones debe tomar bajo una variada gama de circunstancias.

Todo esto, a través de un lenguajeque intenta estar relativamente próximo al lenguaje humano o natural.

Estos pueden ser “a grosso modo” clasificados de la siguiente manera:

• €l engua jes de ba jo n i ve l Los lenguajes de bajo nivel son lenguajes de programación que se acercan al funcionamiento de una computadora. El

lenguaje de más bajo nivel es, por excelencia, el lenguaje máquina. A éste le sigue el lenguaje ensamblador, ya que al

programar en ensamblador se trabajan con los registros dememoria de la computadora de forma directa.

• €l engua jes de med io n i ve l Hay lenguajes de programación que son considerados por algunos expertos como lenguajes de medio nivel (como es el

caso del lenguaje C) al tener ciertas características que los acercan a los lenguajes de bajo nivel pero teniendo, al mismo

tiempo, ciertas cualidades que lo hacen un lenguaje más cercano al humano y, por tanto, de alto nivel.

• €l engua jes de a l t o n i ve l Los lenguajes de alto nivel son normalmente fáciles de aprender porque están formados por elementos de lenguajes

naturales, como el inglés. En BASIC, el lenguaje de alto nivel más conocido, los comandos como "IF CONTADOR = 10 THEN

STOP" pueden utilizarse para pedir a la computadora que pare si CONTADOR es igual a 10. Por desgracia para muchas personas

esta forma de trabajar es un poco frustrante, dado que a pesar de que las computadoras parecen comprender un lenguaje

natural, lo hacen en realidad de una forma rígida y sistemática.

Ensambladores El término ensamblador (del inglés assembler) se refiere a un tipo de programa informático que se encarga de

traducir un fichero fuente escrito en un lenguaje ensamblador, a unfichero objeto que contiene código máquina,

ejecutable directamente por la máquina para la que se ha generado. El propósito para el que se crearon este tipo de aplicaciones

es la de facilitar la escritura de programas, ya que escribir directamente en código binario, que es el único código entendible

por la computadora, es en la práctica imposible. La evolución de los lenguajes de programación a partir del lenguaje

ensamblador originó también la evolución de este programa ensamblador hacia lo que se conoce como programacompilador.

Funcionamiento El programa lee el fichero escrito en lenguaje ensamblador y sustituye cada uno de los códigos mnemotécnicos que aparecen

por su código de operación correspondiente en sistema binario.

Tipos de ensambladores Podemos distinguir entre tres tipos de ensambladores:

• Ensambladores básicos. Son de muy bajo nivel, y su tarea consiste básicamente en ofrecer nombres simbólicos a las

distintas instrucciones, parámetros y cosas tales como los modos de direccionamiento. Además, reconoce una serie

de directivas (o meta instrucciones) que indican ciertos parámetros de funcionamiento del ensamblador.

Page 2: Traductores de lenguajes de programación

Texto extraído de http://traductoresune.blogspot.com

• Ensambladores modulares, o macro ensambladores. Descendientes de los ensambladores básicos, fueron muy

populares en las décadas de los 50 y los 60, antes de la generalización de los lenguajes de alto nivel. Hacen todo

lo que puede hacer un ensamblador, y además proporcionan una serie de directivas para definir e

invocar macroinstrucciones (o simplemente, macros).

• Ensambladores modulares 32-bits o de alto nivel. Son ensambladores que aparecieron como respuesta a una nueva

arquitectura de procesadores de 32 bits, muchos de ellos teniendo compatibilidad hacia atrás pudiendo trabajar con

programas con estructuras de 16 bits. Además de realizar la misma tarea que los anteriores, permitiendo también el

uso de macros, permiten utilizar estructuras de programación más complejas propias de los lenguajes de alto nivel.

Interpretes Interpretes

Traduce a lenguaje máquina, cada línea del programa fuente y la ejecuta de inmediato.

Traducen en Lenguaje de Alto Nivel a Lenguaje Maquina, se encargan de traducir cada instrucción, una por una(o

cada línea de instrucciones) contenida en un programa escrito en cualquier lenguaje de alto nivel a instrucciones en código

binario, comprensible por las computadoras.

Los intérpretes no producen código objeto, por ello la ejecución de un programa requiere forzosamente del código

fuente. Además, los programas en lenguaje interpretado se ejecutan con más lentitud que aquellos en lenguaje compilado.

Los intérpretes realizan la traducción y ejecución de forma simultanea, es decir, un intérprete lee el código fuente y lo

va ejecutando al mismo tiempo.

Se pueden utilizar como alternativa a los compiladores para traducir lenguajes de alto nivel. En vez de traducir el programa

fuente y grabar en forma permanente el código objeto que se produce durante la corrida de compilación para utilizarlo en una

corrida de producción futura, el programador sólo carga el programa fuente en la computadora junto con los datos que se van a

procesar. A continuación, un programa intérprete,almacenado en el sistema operativo del disco, o incluido de manera

permanente dentro de la máquina, convierte cada proposición del programa fuente en lenguaje de máquina conforme vaya

siendo necesario durante el proceso de los datos. No se graba el código objeto para utilizarlo posteriormente.

La siguiente vez que se utilice una instrucción, se le debe interpretar otra vez y traducir a lenguaje máquina. Por

ejemplo, durante el procesamiento repetitivo de los pasos de un ciclo, cada instrucción del ciclo tendrá que volver a ser

interpretado cada vez que se ejecute el ciclo, lo cual hace que el programa sea más lento en tiempo de ejecución (porque se va

revisando el código en tiempo de ejecución) pero más rápido en tiempo de diseño (porque no se tiene que estar compilando a

cada momento el código completo). El intérprete elimina la necesidad de realizar una corrida de compilación después de cada

modificación del programa cuando se quiere agregar funciones o corregir errores; pero es obvio que un programa objeto

compilado con antelación deberá ejecutarse con mucha mayor rapidez que uno que se debe interpretar a cada paso durante una

corrida de producción.

En general, se puede decir que un lenguaje es interpretado si sus instrucciones se ejecutan secuencialmente a partir

de código fuente. Para ejecutar el código de un lenguaje interpretado, necesitamos un intérprete de ese lenguaje. Elintérprete irá

recibiendo líneas de código que traducirá a lenguaje máquina para que se ejecute. A diferencia de los lenguajes compilados, no

se produce un ejecutable. De este modo, de una plataforma a otra, sólo habrá que cambiar el intérprete, no el código.

La siguiente figura muestra el funcionamiento de un interprete.

Etapas del proceso de interpretación

A la hora de construir un intérprete es conveniente utilizar una Representación Interna (RI) del lenguaje fuente a analizar. De esta forma, la organización interna de la mayoría de los intérpretes se descompone en los módulos:

•€Traductor a Representación Interna: Toma como entrada el código del programa P en Lenguaje Fuente, lo analiza y lo transforma a la representación interna correspondiente a dicho programa P.

Page 3: Traductores de lenguajes de programación

Texto extraído de http://traductoresune.blogspot.com

•€Representación Interna (P/RI): La representación interna debe ser consistente con el programa original. Entre los tipos de representación interna, los árboles sintácticos son los más utilizados y, si las características del lenguaje lo permiten, pueden utilizarse estructuras de pila para una mayor eficiencia.

•€Tabla de símbolos: Durante el proceso de traducción, es conveniente ir creando una tabla con información relativa a los símbolos que aparecen. La información a almacenar en dicha tabla de símbolos depende de la complejidad del lenguaje fuente. Se pueden almacenar etiquetas para instrucciones de salto, información sobre identificadores (nombre, tipo, línea en la que aparecen, etc.) o cualquier otro tipo de información que se necesite en la etapa de evaluación.

•€Evaluador de Representación Interna: A partir dela Representación Interna anterior y de los datos de entrada, se llevan a cabo las acciones indicadas para obtener los resultados. Durante el proceso de evaluación es necesario contemplar la aparición de errores

•€Tratamiento de errores: Durante el proceso de evaluación pueden aparecer diversos errores como desbordamiento de la pila, divisiones por cero, etc. que el intérprete debe contemplar.

Ventajas de la utilización de intérpretes

En general, la utilización de compiladores permite construir programas más eficientes que los correspondientes interpretados. Esto es debido a que durante la ejecución de código compilado no es necesario realizar complejos análisis (ya se hicieron en tiempo de compilación), además, un buen compilador es capaz de detectar errores y optimizar el código generado.

Los intérpretes, por definición, realizan la fase de análisis y ejecución a la vez, lo cual imposibilita tales optimizaciones. Por esta razón, los sistemas interpretados suelen ser menos eficientes que los compilados. No obstante, los nuevos avances informáticos aumentan la velocidad de procesamiento y capacidad de memoria de los ordenadores. Actualmente, la eficiencia es un problema menos grave y muchas veces se prefieren sistemas que permitan un desarrollo rápido de aplicaciones que cumplan fielmente la tarea encomendada.

Tipos de intérpretes

• Intérpretes puros

Son los que analizan y ejecutan sentencia a sentencia todo el programa fuente. Siguen el modelo de interpretación iterativa y, por tanto, se utilizan principalmente para lenguajes sencillos.

Los intérpretes puros se han venido utilizando desde la primera generación de ordenadores al permitir la ejecución de largos programas en ordenadores de memoria reducida, ya que sólo debían contener en memoria el intérprete y la sentencia a analizar y ejecutar en cada momento. El principal problema de este tipo de intérpretes es que si a mitad del programa fuente se producen errores, se debe de volver a comenzar el proceso.

• Intérpretes avanzados

Incorporan un paso previo de análisis de todo el programa fuente. Generando posteriormente un lenguaje intermedio que es ejecutado por ellos mismos.

De esta forma en caso de errores sintácticos no pasan de la fase de análisis. Se utilizan para lenguajes más avanzados que los intérpretes puros, ya que permiten realizar un análisis más detallado del programa fuente (comprobación de tipos, optimización de instrucciones, etc.)

• Intérpretes incrementales

Existen ciertos lenguajes que, por sus características, no se pueden compilar directamente. La razón es que pueden manejar objetos o funciones que no son conocidos en tiempo de compilación, ya que se crean dinámicamente en tiempo en ejecución. Entre estos lenguajes, pueden considerarse

Smalltalk, Lisp o Prolog. Con el propósito de obtener una mayor eficiencia que en la interpretación simple, se diseñancompiladores incrementales. La idea es compilar aquellas partes estáticas del programa en lenguaje fuente, marcando como dinámicas las que no puedan compilarse. Posteriormente,

Page 4: Traductores de lenguajes de programación

Texto extraído de http://traductoresune.blogspot.com

en tiempo de ejecución, el sistema podrá compilar algunas partes dinámicas o recompilar partes dinámicas que hayan sido modificadas. Estos sistemas no producen un código objeto independiente, sino que acompañan el sistema que permite compilar módulos en tiempo de ejecución (run time system) al código objeto generado.

Normalmente, los compiladores incrementales se utilizan en sistemas interactivos donde conviven módulos compilados con módulos modificables.

• Evaluadores Parciales

La utilización de evaluadores parciales o especializadores surge al considerar que muchos programas contienen dos tipos de datos de entrada. Existen una serie de datos de entrada que son diferentes en cada ejecución mientras que otros datos no varían de una ejecución a otra. El primer conjunto, se conoce como datos de entrada dinámicos (se denotará comoDin), mientras que el segundo conjunto, serían los datos de entrada estáticos (Est). Dado un programa P, el proceso de evaluación parcial consiste en construir otro programa especializado PEst para los datos estáticos de P. El programaPEst suele estar escrito en el mismo lenguaje fuente que P y se debe garantizar que cuando se le presenten los datos dinámicos produzca los mismos resultados que si se hubiesen presentado todos los datos al programa P original.

Compiladores Es el tipo de traductor más conocido. Se trata de un programa que traduce código fuente escrito en un lenguaje de

alto nivel (Pascal) en código máquina (no siempre). Son más rápidos que los intérpretes pero presentan mayor dificultad a la

hora de detectar errores.

Un compilador es un programa que lee el código escrito en un lenguaje (lenguaje origen), y lo traduce o traduce en un programa equivalente escrito en otro lenguaje (lenguaje objetivo). Como una parte fundamental de este proceso de traducción, el compilador le hace notar al usuario la presencia de errores en el código fuente del programa.

El compilador deriva su nombre de la manera en que trabaja, buscando en todo el código fuente, recolectando y

reorganizando las instrucciones. Un compilador difiere de un intérprete en que el intérprete toma cada línea de código y la

analiza y ejecuta mientras que el compilador mira el código por completo.

Los compiladores requieren de un tiempo antes de poder generar un ejecutable, sin embargo los programas creados

con compiladores se ejecutan mucho más rápido que un mismo programa ejecutado con un intérprete.

Cada lenguaje de programación de alto nivel (excepto los estrictamente imperativos) viene con un compilador.

Dado que los compiladores traducen código fuente a código objeto, el cual es único para cada tipo de maquina,

existen múltiples compiladores para un mismo lenguaje. Por ejemplo lenguaje C tiene un compilador para PC, otro para Apple

Macintosh, además existen muchas casa que desarrollan compiladores para una misma plataforma y un mismo lenguaje, por

ejemplo Microsoft y Borland tienen sus compiladores propios para lenguaje C.

Etapas del proceso de compilación:

1. Edición. Esta fase consiste en escribir el programa empleando algún lenguaje y un editor. Como resultado nos dará el

código fuente de nuestro programa. 2. Compilación. En esta fase se traduce el código fuente obtenido en la fase anterior a código máquina. Si no se

produce ningún error se obtiene el código objeto.

En caso de errores el compilador los mostraría para ayudarnos a corregirlos y se procedería a su compilación de

nuevo, una vez corregidos. 3. Linkado. Esta fase consiste en unir el archivo generado en la fase dos con determinadas rutinas internas del

lenguaje, obteniendo el programa ejecutable.

Existen dos tipos de linkados:

Page 5: Traductores de lenguajes de programación

Texto extraído de http://traductoresune.blogspot.com

o Linkado estático: Los binarios de las librerías se añaden a nuestros binarios compilados generando el

archivo ejecutable.

o Linkado dinámico: no se añaden las librerías a nuestro binario sino que hará que se carguen en memoria

las librerías que en ese momento se necesiten.

Una vez traducido, compilado y linkado el archivo esta listo para su ejecución donde también podrán surgir problemas

y fallos, para los cuales tendríamos que volver a realizar todo el proceso anteriormente citado, de modo que puedan ser

corregidos.

Por este motivo es importante realizar numerosas pruebas en tiempo de ejecución antes de presentar el programa al cliente.

Partes de un compilador Normalmente los compiladores están divididos en dos partes:

• 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.

• 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ónconcreto sirva para la generación de código máquina en varias plataformas distintas.

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 unintérprete y compilan partes del código según se necesitan.

Diferencias entre Compilador e Interprete Los compiladores difieren de los intérpretes en varios aspectos:

• Un programa que ha sido compilado puede correr por si solo, pues en el proceso de compilación se lo transformo en otro lenguaje (lenguaje máquina).

• Un intérprete traduce el programa cuando lo lee, convirtiendo el código del programa directamente en acciones.

• La ventaja del intérprete es que dado cualquier programa se puede interpretarlo en cualquier plataforma (sistema operativo), en cambio el archivo generado por el compilador solo funciona en la plataforma en donde se lo ha creado.

• Pero por otro lado un archivo compilado puede ser distribuido fácilmente conociendo la plataforma, mientras que un archivo interpretado no funciona si no se tiene el intérprete.

• Hablando de la velocidad de ejecución un archivo compilado es de 10 a 20 veces más rápido que un archivo interpretado.