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 [Rober94].
Compiladores “Just in Time”
Con la aparición de Internet surge la necesidad de distribuir programas de una forma
independiente de la máquina permitiendo su ejecución en una amplia variedad de plataformas. Los códigos de bytes de la máquina Virtual de Java permiten la ejecución de programas distribuidos, ya que la mayoría de los visualizadores tienen un mecanismo capaz de interpretarlos. La interpretación de códigos de bytes supone una demora en los tiempos de ejecución.
Para evitar la interpretación, muchos sistemas transforman los códigos de bytes en código nativo
siguiendo el modelo “just in time”. En este modelo, una unidad de compilación o clase se transmite en el formato de códigos de bytes, pero no se realiza la interpretación. En lugar de ello, el código es compilado a código nativo justo en el momento en que lo necesita el programa que se está ejecutando.
Compilación Continua
La compilación continua surge como un intento de mejorar la compilación “Just in Time”. El
sistema mezcla el proceso de compilación a código nativo con el proceso de interpretación. Para
conseguirlo, el sistema dispone de dos módulos: un módulo de intérpretación de los códigos de bytes y otro módulo de compilación de códigos de bytes a código nativo. La idea consiste en que ambos módulos actúen a la vez (lo ideal sería disponer de dos procesadores), de forma que el sistema no se detenga a compilar un módulo, sino que vaya interpretándolo hasta que el compilador haya generado el código nativo.
No hay comentarios:
Publicar un comentario