domingo, 4 de noviembre de 2012

Compiladores e Interpretres


Existen dos tipos principales de traductores de los lenguajes de programación de alto nivel:

§  Compilador, que analiza el programa fuente y lo traduce a otro equivalente escrito en otro lenguaje (por ejemplo, en el lenguaje de la máquina). Su acción equivale a la de un traductor humano, que toma un libro y produce otro equivalente escrito en otra lengua.

§  Intérprete, que analiza el programa fuente y lo ejecuta directamente, sin generar ningún código equivalente. Su acción equivale a la de un intérprete humano, que traduce las frases que oye sobre la marcha, sin producir ningún escrito permanente.

Intérpretes y compiladores tienen diversas ventajas e inconvenientes que los hacen complementarios:

§  Un intérprete facilita la búsqueda de errores, pues la ejecución de un programa puede interrumpirse en cualquier momento para estudiar el entorno (valores de las variables, etc.). Además, el programa puede modificarse sobre la marcha, sin necesidad de volver a comenzar la ejecución.

§  Un compilador suele generar programas más rápidos y eficientes, ya que el análisis del lenguaje fuente se hace una sola vez, durante la generación del programa equivalente. En cambio, un intérprete se ve obligado generalmente a analizar cada instrucción tantas veces como se ejecute (incluso miles o millones de veces).

§  Un intérprete permite utilizar funciones y operadores más potentes, como por ejemplo ejecutar código contenido en una variable en forma de cadenas de caracteres. Usualmente, este tipo de instrucciones es imposible de tratar por medio de compiladores. Los lenguajes que incluyen este tipo de operadores y que, por tanto, exigen un intérprete, se llaman interpretativos. Los lenguajes compilativos, que permiten el uso de un compilador, prescinden de este tipo de operadores.

Compilador 


¿Qué es un compilador?

Para traducir las instrucciones de un programa escrito en un lenguaje de alto nivel a instrucciones de un lenguaje máquina, hay que utilizar un programa llamado compilador. Así pues, el compilador es un programa que recibe como datos de entrada el código fuente de un programa escrito por un programador, y genera como salida un conjunto de instrucciones escritas en el lenguaje binario de la computadora donde se van a ejecutar.

Características

1. La mayor parte hasta la versión de la fecha de la biblioteca de punto flotante de Ray Filiatreault y tutorial.

2. Una vez completamente nuevo y una biblioteca dedicada fecha escrita por Greg Lyon.

3. La biblioteca MASM32 con más de 200 procedimientos recomendados Para escribir código de propósito general de alto rendimiento.

4. Un nuevo sistema de matriz dinámica para la cadena de longitud variable y los datos binarios que tengan una macro y una interfaz de procedimiento.

5. El incluir los archivos y las bibliotecas se han actualizado para incluir la Vista / Win7 equipara adicional y estructuras.

6. Un conector especializado, compilador de recursos y el ensamblador del conjunto de herramientas Pelle con ejemplos de trabajo.

7. Una amplia gama de código de ejemplo que van desde simples ejemplos de un diseño más complejo código.

8. Scripts creados previamente en el editor para la creación de plantillas de trabajo para los proyectos de ensamblador.

9. Un muy fácil de usar interfaz de consola para el desarrollo de algoritmos, códigos de ensayo y las ideas experimentales en el código.


Tipos de Compiladores

·    Compilador cruzado: 
Es el que genera un código objeto ejecutable en un ordenador distinto de aquél en el que se realiza la compilación.

· Compilación-Montaje-Ejecución: 
    En las aplicaciones grandes es conveniente fragmentar el programa a realizar en módulos que se compilan por separado, y una vez que estos estén compilados unirlos mediante un programa denominado montador para formar el módulo ejecutable. El montador se encarga, a su vez, de incluir las librerías donde están guardadas las funciones predefinidas de uso común.

·Compilación en una o varias pasadas: Se llama pasada a cada lectura que hace el compilador del texto fuente.

·  Compilación incremental:
    Este compilador actúa de la siguiente manera. Compila un programa fuente. Caso de detectar errores al volver a compilar el programa corregido sólo compila las modificaciones que se han hecho respecto al primero.

·   Autocompilador: 
     Es aquél que está escrito en el mismo lenguaje que se pretende compilar. Supongamos, por ejemplo, que queremos desarrollar la versión 2.0 de un compilador Pascal. Dicho compilador generará un código mucho más rápido y eficiente que el que generaba la versión anterior 1.0. Sin embargo, son ya muchas las máquinas (IBM 370, Serie 1, PDP 11,...) que disponen del antiguo compilador, o que al menos tienen otro compilador Pascal. La mejor opción consiste en escribir el nuevo compilador en Pascal, ya que así podrá (el compilador) ser compilado en las distintas máquinas por los compiladores Pascal ya existentes.

·         Metacompilador: 
    Es un traductor que tiene como entrada la definición de un lenguaje y como salida el compilador para dicho lenguaje2.

·  Decompilador
    Es el que traduce código máquina a lenguaje de alto nivel. Los decompiladores más usuales son los desensambladores, que traducen un programa en lenguaje máquina a otro en ensamblador. 

· Bootstrapping: 
     Es una técnica muy usada actualmente para el desarrollo de compiladores de lenguajes de alto nivel, en especial si se quiere obtener un auto compilador, o sea, un compilador que se compile a sí mismo.


Las fases de un compilador 
Análisis Léxico:
 Esta fase se encarga de verificar si todas las cadenas pertenecen o no al lenguaje. Es decir realiza un análisis símbolo por símbolo indicando el token por cada uno de los elementos reconocidos o el error en caso de no reconocer. Este análisis no logra detectar muchos errores por su característica.
Ejemplo:
Total=valor*5
Luego del análisis léxico:

id = id * num



Análisis Sintáctico:
En esta fase se analiza la estructura de las expresiones en base a gramáticas. Aquí ya se puede determinar si una estructura por ejemplo una expresión matemática mal formada. El análisis que se realiza es jerárquico es decir en base a árboles de derivación que se obtienen de las mismas gramáticas. Ejemplo: position:=initial + rate*60

Análisis Semántico:
 Este análisis es más difícil de formalizar, determina el tipo de los resultados intermedios, comprobar que los argumentos que tienen un operador pertenecen al conjunto de operadores posible, y si son compatibles entre sí.


Generación de Código Intermedio:
 El código intermedio es una representación en base a elementos de 3 y 4 direcciones. Lo que nos permite llegar a la fase de optimización de código.
a=b+c
1: + b c T1
2: = a  T1
Optimización de Código:
Consiste en realizar uuna mejora en el código intermedio, para reducir el número de líneas y hacer que la ejecución sea más rápida
a=b+c
1: + b c a
Generación de Código: 
Llegamos a la generación de código ensamblador o código máquina del procesador que nos interese por ejemplo:
a:=b+c
LOAD B
ADD CSTORE A


 Interpretes 

¿Qué es un intérprete?

El funcionamiento de un intérprete se caracteriza por traducir y ejecutar, de una en una, las instrucciones del código fuente de un programa, pero, sin generar como salida código objeto. El proceso que realiza un intérprete es el siguiente: lee la primera instrucción del código fuente, la traduce a código objeto y la ejecuta; a continuación, hace lo mismo con la segunda instrucción; y así sucesivamente, hasta llegar a la última instrucción del programa, siempre y cuando, no se produzca ningún error que detenga el proceso.
Un intérprete traduce un código fuente en lenguaje máquina también. El intérprete difiere del compilador en que ejecuta cada orden una vez que se traduce. Este proceso puede hacer más lenta la ejecución del programa, así que los intérpretes se utilizan menos que los compiladores. Un intérprete es otra manera de implementar un lenguaje de programación. La interpretación comparte muchos aspectos con el compilador. Los análisis léxico, sintáctico y verificación de tipos son exactamente los mismos que en un compilador.

Pero en lugar de generar código del árbol sintáctico, el árbol sintáctico se procesa directamente para evaluar expresiones y ejecutar sentencias, y así hasta terminar. Un intérprete puede necesitar evaluar la misma parte del árbol sintáctico varias veces (por ejemplo cuando se hacen ciclos), por eso la interpretación puede ser más lenta que la ejecución de un programa compilado. Pero escribir un intérprete es más fácil de mover a una máquina diferente, así que para aplicaciones donde la velocidad no importa, lo mejor es utilizar un intérprete.

Es muy útil sabe cómo se hace un intérprete o un compilador, porque esto permite a los programadores tener una idea de lo que hacen los programas de alto nivel, lo que a su vez, ayudará a los programadores para crear código más eficiente. Otras razones. Los errores que devuelven los compiladores proporcionan una manera fácil de entender el código fuente; además, se conoce la diferencia entre errores léxicos, sintácticos, errores de tipos, y así.

Características

·         Sencillos de implementar
·         Flexibilidad
·         Permiten modificar y ampliar las características del Lenguaje fuente
·         No es necesario contener en memoria todo el Código fuente
·         Permite su utilización en sistemas de poca memoria o entornos de red (se obtiene el código según se necesita)
·         Facilitan la meta-programación
·         Un programa puede modificar su propio código fuente a Medida que se ejecuta, definir nuevos tipos.
·         Portabilidad del Lenguaje fuente
·         Facilitan el desarrollo rápido de prototipos
·         Facilitan la tarea de depuración
·         Desarrollo de sistemas interactivos
  • -Código menos eficiente
  • -No puede realizarse el proceso de optimización


Tipos de intérpretes

Intérpretes puros: 
Los 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:
Los intérpretes avanzados o normales 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ñan compiladores incrementales. La idea es compilar aquellas partes estáticas del programa en lenguaje fuente, marcando como dinámicas las que no puedan compilarse. Posteriormente, 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á como Din), 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 programa PEst 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.

Análisis:

un Compilador es el que se encarga de analizar un programa fuente para traducir a otro equivalente escrito de otro lenguaje de programación y Su acción equivale a la de un traductor humano la cual suele generar  una serie de programas más rápidos y eficientes, para ello es  el análisis del lenguaje fuente el cual solo se efectúa una sola vez, durante la generación de un programa equivalente y a diferencia un intérprete es que se ve obligado generalmente a analizar una a una de las instrucciones tantas veces como se ejecute incluso miles o millones de veces; en un pequeño resumen el compilador  sirve Para traducir las instrucciones de un programa escrito de un lenguaje de programación  de alto nivel a instrucciones especificas de un lenguaje máquina, Así pues, el compilador es un programa que recibe datos de entrada del código fuente de cualquier diseño de un programa escrito realizado por un programador según sus gustos, y genera como salida un conjunto de instrucciones escritas en el lenguaje binario para la computadora donde se van a ejecutar, lo cual ayuda mucho al cambiar de un lenguaje a otro a un programa deseado; en cambio el Intérprete es el que se encarga de analizar el programa fuente y lo ejecuta directamente, sin generar ningún código equivalente, según las acción que realiza equivalen a la de un intérprete humano el cual se encarga de traducir las frases que oye sobre la marcha, sin producir ningún escrito permanente de esa manera similar actúa un interprete sin dejar registro alguno pero en cambio el intérprete facilita cualquier búsqueda de errores, ya que gracias a la ejecución de un programa puede interrumpirse en cualquier momento para estudiar el entorno que se desee según los valores de las variables, entre otros y  Además  gracias al interprete, el programa puede modificarse sin problema cuando este sobre la marcha, sin necesidad de volver a comenzar la ejecución y ademas Un intérprete permite utilizar funciones y operadores más potentes que el mismo compilador Usualmente, este tipo de instrucciones es imposible de tratar por medio de compiladores y cuyos  lenguajes que incluyen este tipo de operadores los cuales exigen un intérprete, se les   llaman interpretativos y Los lenguajes compilativos los cuales nos permiten el uso de un compilador,que prescinden de este  el tipo de operadores, gracias a estos elementos se puede manejar de una manera mucho mas sencilla cualquier lenguaje de programación existente para las personas en el desenvolvimiento informático.


Fuentes Consultadas: 

http://www.todo-programacion.com.ar/archives/2005/04/interpretes_y_c.html

http://www.emagister.com/curso-informatica-ordenador-cientifico-desarrollo/compiladores-interpretes-programas

http://www.lcc.uma.es/~pastrana/EP/trabajos/48.pdf

No hay comentarios:

Publicar un comentario