28
 Compiladores Unidad 1. Introducción al proceso de compilación.

Introduccion a compiladores

Embed Size (px)

DESCRIPTION

Compiladores

Citation preview

  • CompiladoresUnidad 1. Introduccin al proceso de compilacin.

  • ContenidoIntroduccin a la compilacinEstructura y fases de un compiladorLenguajes y tipos de traductoresHerramientas para el desarrollo de un compiladorClasificacin de los compiladores

  • Introduccin a la compilacinLa escritura de compiladores comprende los lenguajes de programacin, la arquitectura de computadoras, la teora de lenguajes, los algoritmos y la ingeniera de software [Aho98].

  • Introduccin a la compilacin (2)A grandes rasgos, un compilador es un programa que lee un programa escrito en algn lenguaje (fuente) y lo traduce a un programa equivalente en otro lenguaje (objeto).Una parte importante de ste proceso de traduccin es presentar los errores del programa fuente.

  • Introduccin a la compilacin (3)Modelo de anlisis y sntesis de la compilacinFase de anlisisDivide al programa fuente en sus elementos componentes y crea una representacin intermedia.Fase de sntesisConstruye el programa objeto a partir de la representacin intermedia.

  • Introduccin a la compilacin (4)Existe una gran variedad de software que realiza algn tipo de anlisis sobre programas fuente, por ejemplo:Editores de estructurasAnaliza el texto del programa fuente imponindole una estructura jerrquica apropiada.Tambin puede proporcionar:Palabras clave de forma automticaSaltos desde un parntesis, llave, o corchete que abre hasta su correspondiente que cierra.Ayuda en la edicin de las estructuras propias del lenguaje.Visualizadores estticosImprime el programa fuente de tal forma que visiblemente claro. Por ejemplo:Los comentarios pueden aparecer con un tipo de letra especial, al igual que las palabras clave.Indentacin proporcional a la profundidad del anidamiento.Verificadores estticosLee el programa fuente y lo analiza para intentar descubrir errores potenciales sin ejecutar el programa. Por ejemplo:Partes del programa que nunca se podrn ejecutar.Si una variable se utiliza antes de ser definida.Intentar utilizar una variable de tipo real como apuntador.IntrpretesEn lugar de producir un programa objeto como resultado de una traduccin, realiza las operaciones que implica el programa fuente.En la mayora de las ocasiones son utilizados para ejecutar rdenes (por ejemplo: el intrprete de comandos).

  • Introduccin a la compilacin (5)Tradicionalmente se concibe a un compilador como un programa que recibe un programa fuente, escrito en algn lenguaje de alto nivel, y genera cdigo mquina.Sin embargo, los principios con los que se construyen compiladores tambin son utilizados en otros lugares:Formadores de textos (LaTex).Intrpretes de consultas (SQL).

  • Introduccin a la compilacin (6)El contexto de un compiladorCuando se requiere generar un objeto ejecutable, el compilador requiere de otros programas.

  • Estructura y fases de un compiladorEn la compilacin el anlisis consta de tres fases:Anlisis linealLa secuencia de caracteres que forma el programa fuente se lee de izquierda a derecha y se agrupa en componentes lxicos, que son secuencias de caracteres que tienen un significado colectivo.Anlisis jerrquicoLos componentes lxicos se agrupan jerrquicamente en colecciones anidadas con un significado colectivo.Anlisis semnticoSe realizan ciertas revisiones para asegurar que los componentes de un programa se ajustan de un modo significativo.

  • Estructura y fases de un compilador (2)Anlisis linealTambin conocido como: anlisis lxico o exploracin.Ejemplo, en la proposicin de asignacin:posicion = inicial + velocidad * 60Se identifican los siguientes componentes lxicosIdentificador (posicion)Smbolo de asignacin (=)Identificador (inicial)Signo de suma (+)Identificador (velocidad)Signo de multiplicacin (*)Nmero (60)

  • Estructura y fases de un compilador (3)Anlisis jerrquicoTambin llamado anlisis sintctico.Implica agrupar los componentes lxicos en frases gramaticales que el compilador utiliza para sintetizar la salida.Por lo general, las frases gramaticales se representan mediante un rbol de anlisis sintctico.Ejemplo:

  • Estructura y fases de un compilador (4)La estructura jerrquica de un programa normalmente se expresa utilizando reglas recursivas. Para el ejemplo anterior de la proposicin de asignacin se tiene:Cualquier identificador es una expresinCualquier nmero es una expresinSi expresin1 y expresin2 son expresiones, entonces tambin lo son: expresin1 + expresin2 expresin1 * expresin2 (expresin1)

  • Estructura y fases de un compilador (5)Muchos lenguajes definen recursivamente las proposiciones mediante reglas como:Si identificador1 es un identificador y expresin2 es un identificador, entonces:Identificador1 = expresin2Si expresin1 es una expresin y proposicin2 es una proposicin, entonces:while ( expresin1 ) do proposicin2if ( expresin1 ) then proposicin2 El anlisis lineal (lxico) no es suficientemente poderoso para analizar proposiciones o expresiones recursivas.Cundo una construccin del lenguaje fuente es recursiva, entonces es factible emplear una gramtica libre de contexto para formalizar la recursin.

  • Estructura y fases de un compilador (6)Anlisis semnticoRevisa el programa e intenta encontrar errores semnticos.Rene la informacin sobre los tipos para la fase posterior de generacin de cdigo.Un componente importante es la verificacin de tipos.Se verifica si cada operador tiene los operandos permitidos.Un real no debe utilizarse como ndice de un arreglo.Convertir un nmero entero a real para algunos operadores.

  • Estructura y fases de un compilador (7)Conceptualmente un compilador opera en fases, cada una de las cuales transforma al programa fuente de una representacin a otra.

  • Estructura y fases de un compilador (8)Administracin de la tabla de smbolosRegistra los identificadores e informacin referente a ellos.Se tiene un registro por cada identificador.Todas las fases hacen uso de esta tabla.Deteccin e informacin de erroresEn cada fase se pueden encontrar errores.Se debe definir como se deben tratar los errores en cada una de las fases.Las fases de anlisisCambian la representacin interna del programa fuente conforme avanza cada una de ellas.Generacin de cdigo intermedioSe puede considerar como cdigo para una mquina abstracta.Dicha representacin debe ser fcil de producir y fcil de traducir al cdigo objeto.Optimizacin de cdigoTrata de mejorar el cdigo intermedio de modo que resulte un cdigo mquina ms rpido de ejecutar.Generacin de cdigoPor lo general se trata de cdigo mquina relocalizable o cdigo ensamblador.Se deben seleccionar posiciones de memoria para cada una de las variables.

  • Estructura y fases de un compilador (9)Con frecuencia las fases de un compilador se agrupan en una etapa inicial y una etapa final:Etapa inicialComprende aquellas fases que dependen principalmente del cdigo fuente.Normalmente incluye el anlisis lxico, sintctico y semntico, la creacin de la tabla de smbolos, la generacin de cdigo intermedio y cierta optimizacin de ste.Tambin incluye el manejo de errores correspondientes a cada etapa.Etapa finalComprende aquellas partes del compilador que dependen de la mquina objeto.En general estas partes dependen del lenguaje intermedio, ms que del lenguaje fuente.Comprende aspectos de optimizacin y generacin de cdigo, junto con el manejo de errores necesario y las operaciones con la tabla de smbolos.CLR Architecture.PNG

  • Estructura y fases de un compilador (10)PasadasConsiste en leer un archivo de entrada y escribir uno de salida.Es comn que se apliquen varias fases de la compilacin en una sola pasadaReduccin de pasadasEs deseable tener pocas pasadas dado que la lectura y la escritura de archivos intermedios lleva tiempo.Sin embargo, en ocasiones resulta muy difcil generar cdigo si no se tiene una representacin intermedia completa. Por ejemplo:Las instrucciones de tipo goto que saltan hacia delante. En este caso es posible dejar un espacio en blanco y rellenar cuando la informacin est disponible

  • Lenguajes y tipos de traductoresUn lenguaje de programacin se puede definir como:Notacin formal para describir algoritmos o funciones que sern ejecutadas por una computadora.Lenguaje para comunicar instrucciones a la computadora.Convencin para escribir descripciones que pueden ser evaluadas.Dentro de los atributos de un buen lenguaje estn:Claridad y sencillezNaturalidad para la aplicacinApoyo para la abstraccinFacilidad para verificar programasEntorno de programacinPortabilidad de programasCosto de usoCosto de ejecucinCosto de traduccinCosto de creacin y pruebaCosto de mantenimiento

  • Lenguajes y tipos de traductores (2)El trmino general traductor denota cualquier procesador de lenguajes que acepta programas en cierto lenguaje fuente como entrada y produce lenguajes funcionalmente equivalentes en otro lenguaje objeto.Varios tipos de traductores tienen nombres especializados:EnsambladorCompiladorCargador o editor de vnculosPreprocesador o macroprocesadorConversor fuente-fuenteSimulador o intrprete de softwareCompresoresFormateadores

  • Lenguajes y tipos de traductores (3)Se puede hacer una clara divisin entre dos tipos de lenguajes:Lenguajes compiladosOrdinariamente se traducen al lenguaje mquina de la computadora real que los ejecutar.El traductor para estos lenguajes es relativamente grande y complejo, adems produce cdigo objeto que se ejecutar con tanta eficiencia como sea posibleLenguajes interpretadosNo producen cdigo para una mquina real.Producen una forma intermedia del programa cuya ejecucin es ms fcil que la ejecucin del programa original.Ordinariamente la ejecucin en un intrprete de software es ms lenta.La complejidad de implementacin suele cargarse ms en el software de simulacin

  • Herramientas para la construccin de compiladoresExisten herramientas especializadas para implementar las diferentes fases de un compilador.Los sistemas de ayuda para construir compiladores se conocen como:Compiladores de compiladoresGeneradores de compiladoresSistemas generadores de compiladores

  • Herramientas para la construccin de compiladores (2)Algunas herramientas tiles para la construccin de compiladoresGeneradores de analizadores lxicosPor lo general, trabajan a partir de una especificacin basada en expresiones regulares.La organizacin bsica del analizador lxico resultante es un autmata finito.Generadores de analizadores sintcticosTrabajan a partir de una gramtica independiente del contexto.El generador hace de esta fase una de las ms fciles de aplicar.Se utilizan poderosos y complejos algoritmos para realizar el anlisis.Dispositivos de traduccin dirigida por la sintaxisProducen grupos de rutinas que recorren el rbol de anlisis sintctico generando cdigo intermedio.Generadores automticos de cdigoToman un conjunto de reglas que definen la traduccin de cada operacin del lenguaje intermedio al lenguaje de mquina objeto.La tcnica fundamental es la concordancia de plantillas.

  • Herramientas para la construccin de compiladores (3)Un compilador es muy complejo como para programarlo en ensamblador.En el entorno de programacin UNIX, los compiladores se escriben generalmente en C. Se deben utilizar las ventajas del lenguaje para compilarse a s mismo (los compiladores de C se escriben en C).Sin embargo, un compilador slo es un programa. El entorno en el que se desarrolle este programa puede afectar la velocidad y la fiabilidad de la implantacin del compilador.La mayora de las personas que escriben compiladores eligen un lenguaje orientado a sistemas como C.

  • Herramientas para la construccin de compiladores (3)La escritura de compiladores, y en general de cualquier herramienta, tendr un usuario final. Dicho usuario es quien hace realmente til al software. Es necesario aplicar tcnicas de ingeniera de software en la construccin de compiladores para evitar

  • Clasificacin de los compiladoresUna caracterstica que identifica a los compiladores es el hecho de que traducen completamente el lenguaje fuente de entrada previo a la ejecucin del lenguaje objeto a ejecutar.Los compiladores se pueden clasificar por el nmero de pasadas en:Compilador de una pasadaExaminan solo una vez el cdigo fuente para generar el cdigo objetoCompiladores de mltiples pasadasRequiere de pasos intermedios (cdigo intermedio) antes de generar el cdigo objeto final.Entre menos pasadas menor tiempo de compilacin, sin embargo ms pasadas pueden generar cdigo objeto ms eficiente.

  • Clasificacin de los compiladores (2)Por el cdigo objeto generado se pueden clasificar en:MetacompiladorEs un programa que acepta como entrada la descripcin de un lenguaje y produce el compilador de dicho lenguaje.Por lo regular hay dos tipos de metacompiladores, los que trabajan con expresiones regulares y aquellos que lo hacen con gramticas libres de contexto.Ejemplos clsicos son Lex (generador de analizadores lxicos) y Yacc (generador de analizadores sintcticos).DescompiladorRealiza una tarea de traduccin inversa, es decir, va del cdigo mquina al lenguaje de alto nivel.Es relativamente sencillo cuando se trata de ir a cdigo ensamblador o macro ensamblador, pero no cuando se quiere llegar a un lenguaje de alto nivel.

  • Clasificacin de los compiladores (3)Compiladores-intrpretesRealizan dos fases: la fase de compilacin y la fase de interpretacinLa fase de compilacin traduce la entrada en una representacin intermedia por una nica vez.La fase de interpretacin parte de la representacin generada por la primera fase para la ejecucin del programa.Compiladores cruzadosSurgen como solucin al problema de desarrollar un primer compilador para una nueva arquitectura.Dado que el desarrollo de compiladores es una tarea compleja, resulta ms fcil construirlos sobre una mquina que ya disponga de herramientas de software.Se denomina compilador cruzado a un compilador que se ejecuta en una mquina pero el cdigo objeto es para otra mquina.