martes, 31 de mayo de 2016

Clasificación de los Interpretes

¿Que es un Interprete?

  •  En lugar de producir un programa objeto como resultado de una traducción, un intérprete realiza las operaciones que implica el programa fuente. 
  •  Un intérprete no genera un programa equivalente, sino que toma una sentencia del programa fuente en un lenguaje de alto nivel, la traduce al código equivalente y al mismo tiempo la ejecuta.
  • Un intérprete es un programa que analiza y ejecuta simultáneamente el programa fuente, es decir no producen un código objeto, siendo su ejecución simultánea a la del programa fuente.
Comportamiento de un Interprete

  • Un intérprete es como un compilador, solo que la salida es una ejecución. El programa de entrada se reconoce y ejecuta a la vez. No se produce un resultado físico (código máquina) sino lógico (una ejecución).
  • Además de que la traducción optimiza el programa acercándolo a la máquina, los lenguajes interpretados tienen la característica de que permiten construir programas que se pueden modificar a sí mismos.

Resultado del Interprete




Ventajas de los Interpretes
  •  Su principal ventaja es que permiten una fácil depuración. Permiten una mayor interactividad con el código en tiempo de desarrollo. 
  •  En algunos lenguajes (Smalltalk, Prolog, LISP) está permitido y es frecuente añadir código según se ejecuta otro código, y esta característica solamente es posible implementarla en un intérprete. 
  •  Puede ser interrumpido con facilidad. 
  •  Puede ser rápidamente modificado y ejecutado nuevamente.
  • Un Intérprete necesita menos memoria que un compilador. 
  • Facilita la búsqueda de errores. 
  • En algunos lenguajes está permitido añadir código según se ejecuta otro código. 
  • Menor consumo de memoria.

Desventajas de los Interpretes
  •  Lentitud de ejecución, ya que al ejecutar a la vez que se traduce no puede aplicarse un alto grado de optimización. Cada instrucción debe ser traducida a código máquina tantas veces como sea ejecutada
  • Durante la ejecución, el intérprete debe residir en memoria ya que no genera código objeto.
  • Tamaño del programa objeto, que exige añadir el intérprete al programa propiamente dicho.

Clasificación de Intérpretes
• Intérpretes Puros
• Interpretes Avanzados
• Interpretes Incrementales


Intérpretes Puros
  •  Los intérpretes puros son los que analizan una sentencia y la ejecutan, y así sucesivamente todo el programa fuente. Fueron los intérpretes desarrollados en la primera generación de ordenadores, pues permitían la ejecución de largos programas con ordenadores de memoria muy reducida, ya que sólo debían contener en memoria el intérprete y la sentencia a analizar y ejecutar. 
  • El principal problema de este tipo de intérpretes es que si a mitad del programa fuente se producen errores, se debe de reiniciar el proceso.

Funcionamiento del Intérprete Puro


Explicación del Interprete Puro
  • En la figura se representa el esquema general de un intérprete puro, donde se puede observar que el lenguaje fuente se traduce a una representación interna (texto o binaria) que puede ser almacenada en memoria o en disco. 
  •  Esta representación interna tiene todas las instrucciones numeradas o colocadas consecutivamente en estructuras de tamaño fijo (por ejemplo un array o posiciones consecutivas de memoria, o un fichero binario de estructuras de tamaño fijo)
  •  Mientras se realiza este paso se puede construir la tabla de etiquetas, que es una tablas que contiene una estructura donde están todas las etiquetas y su posición en el programa fuente (las etiquetas se utilizan tanto en las instrucciones de salto como en las llamadas a procedimientos y funciones). 
  •  Una vez que este proceso ha finalizado, comienza la ejecución por la primera instrucción del código, que se envía al evaluador de instrucciones, éste la ejecuta (recibiendo datos si es necesario o enviando un mensaje de error).
  • El evaluador de instrucciones también determina la instrucción siguiente a ejecutar, en algunos casos previa consulta a la tabla de etiquetas. En el caso de que no haya saltos (GOTO) o llamadas a procedimientos o funciones se ejecuta la siguiente instrucción a la instrucción en curso. 
  •  El evaluador de instrucciones puede utilizar dos métodos de evaluación. El método clásico es la evaluación voraz o ansiosa, donde se evalúan las expresiones completamente. Otro método es la evaluación perezosa, evaluándose sólo la parte necesaria de la expresión (el resto no se evalúa).


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

Funcionamiento del Intérprete Avanzado



Explicación del Interprete Avanzado

  • Un ejemplo de intérprete avanzado es el que utiliza el lenguaje Java. Así un programa en lenguaje java (con la extensión .java) se compila y produce uno o varios ficheros con la extensión .class, estos ficheros están en un formato binario denominado bytecode independiente de plataforma, que se interpreta posteriormente.
  • Esto permite que el bytecode se ejecute en cualquier sistema operativo que disponga de un intérprete de bytecode. Dado que la mayor parte de los navegadores de Internet llevan inmerso un intérprete de bytecode, esto ha permitido al lenguaje Java ser uno de los más utilizados en aplicaciones que usen Internet.

Interpretes Incrementales
  • Algunos lenguajes no se pueden compilar, debido a que entre sus características pueden manejar objetos o funciones que no son conocidos en tiempo de compilación, ya que son creados en ejecución. Para este tipo de lenguajes existen los intérpretes incrementales, que permiten compilar los módulos completamente definidos, y recompilar en tiempo de ejecución los nuevos módulos.
  •  Los intérpretes incrementales tienen gran interés en los lenguajes que permiten no definir los problemas completamente en tiempo de compilación. En estos casos se utilizan evaluadores parciales que toman como entrada el programa fuente junto con algunos datos (pero no todos), realizándose los cálculos que se pueden hacer con dicho subconjunto de datos, y produciendo una salida que contiene un residuo del programa fuente que se ha introducido.

Clase 2.1
Un traductor es un programa que toma como entrada un texto escrito en un lenguaje y da como salida otro texto en un lenguaje diferente.



Forma de el proceso de compilación


Compilador: es un traductor que convierte un texto escrito en un lenguaje de alto nivel a un lenguaje de bajo nivel(código objeto o maquina).

Ensamblador: es un lenguaje de bajo nivel, donde cada sentencia del lenguaje fuente se traduce a una instrucción en código maquina.

Interprete: no genera código objeto, analiza y ejecuta directamente cada proposición del codigo fuente.

Pre-procesador: procesan un texto fuente modificandolo en cierta forma previamente a la compilación.



Como saber si estamos ante un compilador
Cuando el lenguaje fuente esta en un lenguaje de programación de alto nivel y el objeto generado sea de bajo nivel.






Ventajas de los compiladores.
  • Producen un código optimizado.
  • La ejecución del programa objeto es mucho mas rápida que si se interpreta el programa fuente
  • El compilador tiene una visión global del programa, por lo que la información de mensajes de error es más detallada.

Desventajas de los compiladores.
  • Se debe de ejecutar muchas veces el código fuente para ver los cambios en el resultado.
  • Mayor consumo de memoria.
Interprete: 

Es un programa que analiza y ejecuta simultáneamente el programa fuente, es decir no producen un código objeto, siendo su ejecución simultánea a la del programa fuente.

Comportamiento del Interprete:

Un interprete es como un compilador, solo que la salida es una ejecución. El programa de entrada se reconoce y ejecuta a la vez. No se produce un resultado físico (código máquina) sino lógico (una ejecución).

Resultado del interprete




Contexto del compilador.


Etapas de compilación.


Token: es una cadena de caracteres que tiene un significado coherente un lenguaje de programación.

En la etapa de análisis se divide el programa fuente en sus piezas constituyentes y crea una representación intermedia del mismo.

En la etapa de síntesis se construye el programa destino deseado a partir de una descripción en un lenguaje de representación intermedia.


Análisis Léxico.
El analizador léxico o scanner, transforma el texto fuente en una secuencia ordenada de elementos léxicamente válidos (tokens).






Funciones del Análisis Léxico.

El analizador léxico debe reconocer y presentar los caracteres Tokens en una representación más útil para el analizador sintáctico.

Además de:
  • Eliminar espacios.
  • Ignorar comentarios.
  • Tratar con la tabla de símbolos.
  • Reconocer identificadores y palabra reservada.
  • Manejar el fichero fuente.
  • Contabilizar posición de tokens.
  • Procesar macros, constantes, includes..
  • Generar tokens bajo demanda del analizador sintáctico.
  • Estructurar la colección de tokens.
  • Identificar la colección de tokens.
  • Describir el lenguaje como expresiones regulares.
  • Especificar un diagrama de transición.
  • Traducir el diagrama a una tabla de transición.
Analizador Sintáctico.

El analizador sintáctico o parser recibe los tokens y comprueba su ordenación correcta. Genera un árbol sintáctico.


Tipos de Analizadores Sintácticos.


Análisis Semántico
  • El analizador semántico comprueba que el árbol sintáctico es semánticamente válido.
  • Revisa el programa fuente para comprobar que las reglas semánticas se cumplen.
  • Genera un árbol semántico o etiquetado.

Generación de código intermedio.
  • Después de los análisis sintácticos y semánticos, algunos compiladores generan una representación intermedia explicita del programa fuente.
  • Se puede considerar esta representación intermedia como un programa para una maquina abstracta.
  • Esta representación intermedia debe tener dos propiedades importantes, debe ser fácil de producir y fácil de traducir al programa objeto.
Optimización de código.
  • La fase de optimización de código trata de mejorar el código intermedio, de modo que resulte un código de Maquina más rápido de ejecutar.
  • Hay mucha variación en la cantidad de optimización de código que ejecutan los distintos compiladores, una parte significativa del tiempo del compilador se ocupa en esta fase. 
  • La fase Final de un compilador es la generación de código objeto, que por lo general consiste en código máquina relocalizable 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 ejecutan la misma tarea.





No hay comentarios.:

Publicar un comentario