Click here to load reader

Interpretes (compiladores)

  • View
    3.404

  • Download
    12

Embed Size (px)

Text of Interpretes (compiladores)

Intrpretes y Diseo de Lenguajes de Programacin

Jose Emilio Labra Gayo Juan Manuel Cueva Lovelle Ral Izquierdo Castanedo Aquilino Adolfo Juan Fuente M Cndida Luengo Dez Francisco Ortn Soler

Fecha: Abril 2004

-1-

Tabla de Contenidos1. Intrpretes ________________________________________________________________________ 3 1.1. Definicin _____________________________________________________________________ 3 1.2. Estructura de un intrprete ______________________________________________________ 3 1.3. Ventajas de la utilizacin de intrpretes ____________________________________________ 5 1.4. Aplicaciones de los sistemas basados en intrpretes___________________________________ 5 1.5. Tipos de intrpretes ____________________________________________________________ 6 1.6. Ejemplo de intrprete de cdigo intermedio________________________________________ 12 1.7. Ejemplo de intrprete de lenguaje recursivo _______________________________________ 19 2. Diseo de Lenguajes de Programacin ________________________________________________ 24 2.1. Aspectos lingsticos ___________________________________________________________ 24 2.2. Principios de diseo ___________________________________________________________ 24 2.3. Tcnicas de Especificacin semntica _____________________________________________ 25 2.4. Familias de Lenguajes _________________________________________________________ 27 2.5. Lenguajes de Dominio Especfico ________________________________________________ 38 2.6. Mquinas abstractas ___________________________________________________________ 39 Ejercicios Propuestos ________________________________________________________________ 41 Referencias ________________________________________________________________________ 42

-2-

Definicin

1. Intrpretes1.1. DefinicinUn intrprete es un programa que analiza y ejecuta simultneamente un programa escrito en un lenguaje fuente. En la Figura 1 se presenta el esquema general de un intrprete visto como una caja negra. Cualquier intrprete tiene dos entradas: un programa P escrito en un lenguaje fuente LF (en lo sucesivo, se denotar P/LF) junto con los datos de entrada; a partir de dichas entradas, mediante un proceso de interpretacin va produciendo unos resultados.

P/LF Intrprete de LF Datos

ResultadosFigura 1: Esquema general de un intrprete Los compiladores, a diferencia de los intrpretes, transforman el programa a un programa equivalente en un cdigo objeto (fase de compilacin), y en un segundo paso generan los resultados a partir de los datos de entrada (fase de ejecucin).

P/LF

Compilador de LF Compilacin

Datos

P/OBJ Ejecucin ResultadosFigura 2: Esquema general de un compilador

1.2. Estructura de un intrpreteA la hora de construir un intrprete es conveniente utilizar una Representacin Interna (RI) del lenguaje fuente a analizar. De esta forma, la organizacin interna de la mayora de los intrpretes se descompone en los mdulos: Traductor a Representacin Interna: Toma como entrada el cdigo del programa P en Lenguaje Fuente, lo analiza y lo transforma a la representacin interna correspondiente a dicho programa P. Representacin Interna (P/RI): La representacin interna debe ser consistente con el programa original. Entre los tipos de representacin interna, los rboles sintcticos son los ms utilizados y, si las caractersticas del lenguaje lo permiten, pueden utilizarse estructuras de pila para una mayor eficiencia. Tabla de smbolos: Durante el proceso de traduccin, es conveniente ir creando una tabla con informacin relativa a los smbolos que aparecen. La informacin a almacenar en dicha tabla de smbolos depende de la complejidad del lenguaje fuente. Se pueden almacenar etiquetas para instrucciones de salto, informacin sobre identificadores (nombre, tipo, lnea en la que aparecen, etc.) o cualquier otro tipo de informacin que se necesite en la etapa de evaluacin. Evaluador de Representacin Interna: A partir de la Representacin Interna anterior y de los datos de entrada, se llevan a cabo las acciones indicadas para obtener los resultados. Durante el proceso de evaluacin es necesario contemplar la aparicin de errores.

-3-

Estructura de un intrprete Tratamiento de errores: Durante el proceso de evaluacin pueden aparecer diversos errores como desbordamiento de la pila, divisiones por cero, etc. que el intrprete debe contemplar.

Intrprete de LF P/LF Traductor LF a RI P/RI Tabla Smbolos Tratamiento de Errores

Datos

Evaluador RI

Resultados

Errores

Figura 3: Organizacin interna de un intrprete Dependiendo de la complejidad del cdigo a analizar, el intrprete puede contener mdulos similares a los de un compilador tradicional: Anlisis lxico, Sintctico y Semntico. Durante la evaluacin, el intrprete interacta con los recursos del sistema como la memoria, discos, etc. Muchos sistemas interpretados liberan al programador del manejo explcito de memoria mediante tcnicas de recoleccin de basura. A la hora de evaluar la representacin interna, existen dos mtodos fundamentales: la interpretacin iterativa y la interpretacin recursiva.

1.2.1. Interpretacin IterativaLa interpretacin iterativa es apropiada para lenguajes sencillos, donde se analiza y ejecuta cada expresin de forma directa, como podran ser los cdigos de mquinas abstractas o lenguajes de sentencias simples. La interpretacin consiste en un ciclo bsico de bsqueda, anlisis y ejecucin de instrucciones. El esquema sera:Inicializar REPETIR Buscar siguiente Instruccin i SI encontrada ENTONCES Analizar i Ejecutar i HASTA (que no haya ms instrucciones)

Figura 4: Interpretacin iterativa Cada instruccin se busca en el almacenamiento (memoria o disco) o, en algunos casos, es introducida directamente por el usuario. Luego la instruccin es analizada en sus componentes y ejecutada. Normalmente, el lenguaje fuente contiene varios tipos de instrucciones, de forma que la ejecucin se descompone en varios casos, uno por cada tipo de instruccin. En la pgina 42, se construye un intrprete iterativo de un sencillo lenguaje intermedio.

1.2.2. Interpretacin RecursivaComnmente, el diseo de nuevos lenguajes de programacin se realiza en dos fases: Una primera fase de especificacin semntica mediante la construccin de un intrprete prototipo que acta como una especificacin ejecutable y una segunda fase de implementacin del compilador de dicho lenguaje. Para la construccin de prototipos suele utilizarse un modelo de interpretacin recursiva donde las sentencias pueden estar compuestas de otras sentencias y la ejecucin de una sentencia puede lanzar la ejecucin de otras sentencias de forma recursiva. Los intrpretes recursivos no son apropiados para aplicaciones prcticas debido a su ineficiencia y se utilizan nicamente como prototipo ejecutable del lenguaje. El problema de especificar un lenguaje mediante un intrprete prototipo es decidir en qu lenguaje se implementa dicho intrprete. Dicho lenguaje debe ser suficientemente expresivo y no ambigo para definir claramente cmo funcionan las diferentes construcciones. En muchos casos se opta por utilizar lenguajes ya implementados pero que carecen de una especificacin semntica clara. La tendencia actual es investigar tcnicas de especificacin semntica formal que permitan generar automticamente este tipo de intrpretes [Espinosa94], [Liang96], [Steele94].

-4-

Ventajas de la utilizacin de intrpretes

1.3. Ventajas de la utilizacin de intrpretesEn general, la utilizacin de compiladores permite construir programas ms eficientes que los correspondientes interpretados. Esto es debido a que durante la ejecucin de cdigo compilado no es necesario realizar complejos anlisis (ya se hicieron en tiempo de compilacin), adems, un buen compilador es capaz de detectar errores y optimizar el cdigo generado. Los intrpretes, por definicin, realizan la fase de anlisis y ejecucin a la vez, lo cual imposibilita tales optimizaciones. Por esta razn, los sistemas interpretados suelen ser menos eficientes que los compilados. No obstante, los nuevos avances informticos 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 rpido de aplicaciones que cumplan fielmente la tarea encomendada. A continuacin se enumeran una serie de ventajas de los sistemas interpretados: Los intrpretes, en general, son ms sencillos de implementar. Lo cual facilita el estudio de la correccin del intrprete y proporciona nuevas lneas de investigacin como la generacin automtica de intrpretes a partir de las especificaciones semnticas del lenguaje. Proporcionan una mayor flexibilidad que permite modificar y ampliar caractersticas del lenguaje fuente. Muchos lenguajes como Lisp, APL, Prolog, etc. surgieron en primer lugar como sistemas interpretados y posteriormente surgieron compiladores. No es necesario contener en memoria todo el cdigo fuente. Esto permite su utilizacin en sistemas de poca memoria o en entornos de red, en los que se puede obtener el cdigo fuente a medida que se necesita [Plezbert 97]. Facilitan la meta-programacin. Un programa puede manipular su propio cdigo fuente a medida que se ejecuta. Esto facilita la implementacin de sistemas de aprendizaje automatizado y reflectividad [At Kaci 91]. Aumentan la portabilidad del lenguaje: Para que el lenguaje interpretado funcione en otra mquina slo es necesario que su intrprete funcione en dicha mquina. Puesto que no existen etapas intermedias de compilacin, los sistemas interpretados facilitan el desarrollo rpido de prototipos, potencian la utilizacin de sistemas interactivos y facilitan las tareas de depuracin.

1.4. Aplicaciones de los sistemas basados en intrpretesLos sistemas interpretados han tenido una gran importancia desde la aparicin de los primeros ordenadores.

Search related