Unidad1 2 Lenguajes y automatas

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

Transcript of Unidad1 2 Lenguajes y automatas

Page 1: Unidad1 2  Lenguajes y automatas

Compiladores

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

Page 2: Unidad1 2  Lenguajes y automatas

Contenido

� Introducción a la compilación� Estructura y fases de un compilador� Lenguajes y tipos de traductores� Herramientas para el desarrollo de un

compilador� Clasificación de los compiladores

Page 3: Unidad1 2  Lenguajes y automatas

Introducción a la compilación

� La escritura de compiladores comprende los lenguajes de programación, la arquitectura de computadoras, la teoría de lenguajes, los algoritmos y la ingeniería de software [Aho98].

Page 4: Unidad1 2  Lenguajes y automatas

Int roducción a la compilación (2)

� A grandes rasgos, un compilador es un programa que lee un programa escrito en algún lenguaje (fuente) y lo traduce a un programa equivalente en otro lenguaje (objeto).

� Una parte importante de éste proceso de traducción es presentar los errores del programa fuente.

ProgramaFuente Compilador

ProgramaObjeto

Mensajesde error

Page 5: Unidad1 2  Lenguajes y automatas

Int roducción a la compilación (3)

� Modelo de análisis y síntesis de la compilación� Fase de análisis

� Divide al programa fuente en sus elementos componentes y crea una representación intermedia.

� Fase de síntesis� Construye el programa objeto a partir de la

representación intermedia.

Page 6: Unidad1 2  Lenguajes y automatas

Int roducción a la compilación (4)� Existe una gran variedad de software que realiza algún tipo de análisis

sobre programas fuente, por ejemplo:

� Editores de estructuras

� Analiza el texto del programa fuente imponiéndole una estructura jerárquica apropiada.

� También puede proporcionar:

� Palabras clave de forma automática� Saltos desde un paréntesis, llave, o corchete que abre hasta su correspondiente que

cierra.� Ayuda en la edición de las estructuras propias del lenguaje.

� Visualizadores estéticos

� Imprime 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.� Indentación proporcional a la profundidad del anidamiento.

Page 7: Unidad1 2  Lenguajes y automatas

Int roducción a la compilación (4)� Verificadores estáticos

� Lee el programa fuente y lo analiza para intentar descubrir errores potenciales sin ejecutar el programa. Por ejemplo:

� Partes del programa que nunca se podrán ejecutar.� Si una variable se utiliza antes de ser definida.� Intentar utilizar una variable de tipo real como apuntador.

� Intérpretes

� En lugar de producir un programa objeto como resultado de una traducción, realiza las operaciones que implica el programa fuente.

� En la mayoría de las ocasiones son utilizados para ejecutar órdenes (por ejemplo: el intérprete de comandos).

Page 8: Unidad1 2  Lenguajes y automatas

Int roducción a la compilación (5)

� Tradicionalmente se concibe a uncompilador como un programa que recibeun programa fuente, escrito en algúnlenguaje de alto nivel, y genera códigomáquina.

� Sin embargo, los principios con los que se construyen compiladores también son utilizados en otros lugares:� Formadores de textos (LaTex).� Intérpretes de consultas (SQL).

Page 9: Unidad1 2  Lenguajes y automatas

Int roducción a la compilación (6)� El contexto de un compilador

� Cuando se requiere generar un objeto ejecutable, el compilador requiere de otros programas.

Estructura del programa fuente

Preprocesador

Programa fuente

Compilador

Programa objeto en lenguaje ensamblador

Ensamblador

Código máquina relocalizable

Enlazador y cargador

Código máquina absoluto

Librerías, bibliotecas y Archivos objeto relocalizables

Page 10: Unidad1 2  Lenguajes y automatas

Estructura y fases de un compilador

� En la compilación el análisis consta de tres fases:� Análisis lineal

� La secuencia de caracteres que forma el programa fuente se lee de izquierda a derecha y se agrupa en componentes léxicos, que son secuencias de caracteres que tienen un significado colectivo.

� Análisis jerárquico� Los componentes léxicos se agrupan jerárquicamente en

colecciones anidadas con un significado colectivo.� Análisis semántico

� Se realizan ciertas revisiones para asegurar que los componentes de un programa se ajustan de un modo significativo.

Page 11: Unidad1 2  Lenguajes y automatas

Estructura y fases de un compilador (2)

� Análisis lineal� También conocido como: análisis léxico o exploración.� Ejemplo, en la proposición de asignación:

� posicion = inicial + velocidad * 60� Se identifican los siguientes componentes léxicos

� Identificador (posicion)� Símbolo de asignación (=)� Identificador (inicial)� Signo de suma (+)� Identificador (velocidad)� Signo de multiplicación (*)� Número (60)

Page 12: Unidad1 2  Lenguajes y automatas

Estructura y fases de un compilador (3)

� Análisis jerárquico� También llamado análisis sintáctico.� Implica agrupar los componentes léxicos en frases

gramaticales que el compilador utiliza para sintetizar la salida.

� Por lo general, las frases gramaticales se representan mediante un árbol de análisis sintáctico.

� Ejemplo: Proposiciónde asignación

Identificador

posición

= expresión

expresión

identificador

+ expresión

inicial

expresión

identificador

* expresión

velocidad

Número

60

Page 13: Unidad1 2  Lenguajes y automatas

Estructura y fases de un compilador (4)

� La estructura jerárquica de un programa normalmente se expresa utilizando reglas recursivas. Para el ejemplo anterior de la proposición de asignación se tiene:� Cualquier identificador es una expresión� Cualquier número es una expresión� Si expresión1 y expresión2 son expresiones, entonces también lo

son:� expresión1 + expresión2� expresión1 * expresión2� (expresión1)

Proposiciónde asignación

Identificador

posicion

= expresión

expresión

identificador

+ expresión

inicial

expresión

identificador

* expresión

velocidad

Número

60

Page 14: Unidad1 2  Lenguajes y automatas

Estructura y fases de un compilador (5)

� Muchos lenguajes definen recursivamente las proposiciones mediante reglas como:� Si identificador1 es un identificador y expresión2 es un

identificador, entonces:� Identificador1 = expresión2

� Si expresión1 es una expresión y proposición2 es una proposición, entonces:� while ( expresión1 ) do proposición2� if ( expresión1 ) then proposición2

� El análisis lineal (léxico) no es suficientemente poderoso para analizar proposiciones o expresiones recursivas.

� Cuándo una construcción del lenguaje fuente es recursiva, entonces es factible emplear una gramática libre de contexto para formalizar la recursión.

Page 15: Unidad1 2  Lenguajes y automatas

Estructura y fases de un compilador (6)

� Análisis semántico� Revisa el programa e intenta encontrar errores semánticos.� Reúne la información sobre los tipos para la fase posterior de

generación de código.� Un componente importante es la verificación de tipos.

� Se verifica si cada operador tiene los operandos permitidos.� Un real no debe utilizarse como índice de un arreglo.

� Convertir un número entero a real para algunos operadores.

=

posicion +

inicial *

velocidad 60

=

posicion +

inicial *

velocidad ent a real

60

El análisis semántico inserta una conversión de entero a real en el árbol de análisis sintáctico

Page 16: Unidad1 2  Lenguajes y automatas

Estructura y fases de un compilador (7)� Conceptualmente un compilador opera en fases, cada una de las

cuales transforma al programa fuente de una representación a otra.

Analizador léxico

Programa fuente

Analizador sintáctico

Analizador semántico

Generador de código intermedio

Optimizador de código

Generador de código

Programa objeto

Manejadorde errores

Administrador de laTabla de símbolos

Page 17: Unidad1 2  Lenguajes y automatas

Estructura y fases de un compilador (8)

� Administración de la tabla de símbolos� Registra los identificadores e información

referente a ellos.� Se tiene un registro por cada identificador.� Todas las fases hacen uso de esta tabla.

� Detección e información de errores� En cada fase se pueden encontrar errores.� Se debe definir como se deben tratar los

errores en cada una de las fases.� Las fases de análisis

� Cambian la representación interna del programa fuente conforme avanza cada una de ellas.

� Generación de código intermedio� Se puede considerar como código para una

máquina abstracta.� Dicha representación debe ser fácil de

producir y fácil de traducir al código objeto.� Optimización de código

� Trata de mejorar el código intermedio de modo que resulte un código máquina más rápido de ejecutar.

� Generación de código� Por lo general se trata de código máquina

relocalizable o código ensamblador.� Se deben seleccionar posiciones de

memoria para cada una de las variables.

posicion = inicial + velocidad * 60

Analizador léxico

id1 = id2 + id3 * 60

Analizador sintáctico

=

id1 +id2 *

id3 60

Analizador semántico

=

id1 +id2 *

id3 ent a real

60

Generador de código intermedio

temp1 = entreal(60)temp2 = id3 * temp1

temp3 = id2 +temp2

Id1 = temp3

Optimizador de código

temp1 = id3 * 60.0temp2 = id2 +temp1

Id1 = temp2

Generador de código

MOVF id3, R2MULF #60.0, R2MOVF id2, R1ADDF R2, R1MOV R1, id1

TABLA DE SIMBOLOS

posicion …

inicial …

velocidad …

1

2

3

4

Page 18: Unidad1 2  Lenguajes y automatas

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 inicial

� Comprende aquellas fases que dependen principalmente del código fuente.

� Normalmente incluye el análisis léxico, sintáctico y semántico, la creación de la tabla de símbolos, la generación de código intermedio y cierta optimización de éste.

� También incluye el manejo de errores correspondientes a cada etapa.

� Etapa final� Comprende aquellas partes del compilador

que dependen de la máquina objeto.� En general estas partes dependen del

lenguaje intermedio, más que del lenguaje fuente.

� Comprende aspectos de optimización y generación de código, junto con el manejo de errores necesario y las operaciones con la tabla de símbolos.

CLR Architecture.PNG

Page 19: Unidad1 2  Lenguajes y automatas

Estructura y fases de un compilador (10)� Pasadas

� Consiste en leer un archivo de entrada y escribir uno de salida.� Es común que se apliquen varias fases de la compilación en una

sola pasada� Reducción de pasadas

� Es deseable tener pocas pasadas dado que la lectura y la escritura de archivos intermedios lleva tiempo.

� Sin embargo, en ocasiones resulta muy difícil generar código si no se tiene una representación 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 información esté disponible

Page 20: Unidad1 2  Lenguajes y automatas

Lenguajes y tipos de traductores� Un lenguaje de programación se puede definir como:

� Notación formal para describir algoritmos o funciones que serán ejecutadas por una computadora.

� Lenguaje para comunicar instrucciones a la computadora.� Convención para escribir descripciones que pueden ser evaluadas.

� Dentro de los atributos de un buen lenguaje están:� Claridad y sencillez� Naturalidad para la aplicación� Apoyo para la abstracción� Facilidad para verificar programas� Entorno de programación� Portabilidad de programas� Costo de uso

� Costo de ejecución� Costo de traducción� Costo de creación y prueba� Costo de mantenimiento

Page 21: Unidad1 2  Lenguajes y automatas

Lenguajes y tipos de traductores (2)

� El término general traductor denota cualquier procesador de lenguajes que acepta programas en cierto lenguaje fuentecomo entrada y produce lenguajes funcionalmente equivalentes en otro lenguaje objeto.

� Varios tipos de traductores tienen nombres especializados:� Ensamblador� Compilador� Cargador o editor de vínculos� Preprocesador o macroprocesador� Conversor fuente-fuente� Simulador o intérprete de software� Compresores� Formateadores

Page 22: Unidad1 2  Lenguajes y automatas

Lenguajes y tipos de traductores (3)� Se puede hacer una clara división

entre dos tipos de lenguajes:

� Lenguajes compilados� Ordinariamente se traducen al

lenguaje máquina de la computadora real que los ejecutará.

� El traductor para estos lenguajes es relativamente grande y complejo, además produce código objeto que se ejecutará con tanta eficiencia como sea posible

� Lenguajes interpretados� No producen código para una máquina

real.� Producen una forma intermedia del

programa cuya ejecución es más fácil que la ejecución del programa original.

� Ordinariamente la ejecución en un intérprete de software es más lenta.

� La complejidad de implementación suele cargarse más en el software de simulación

Código en C

Precompilador

Compilador

Código objeto

Enlazador

Código máquina

Hardware

Archivosde Cabecera

Archivosde Librería

Tie

mpo d

e c

om

pilació

n(T

raducció

n)

Código en Java

CompiladorJava

Bytecode Java

Bibliotecaso

Paquetes

Tie

mpo d

e e

jecució

n

Red

Cargador de clases

Verificador deBytecode

Intérprete Generadorde

Código

JVM Runtime

Hardware

Máquin

a v

irtual Ja

va

Procesamiento de unprograma en lenguaje C

Procesamiento de unprograma en lenguaje Java

Page 23: Unidad1 2  Lenguajes y automatas

Herramientas para la construcción de compiladores

� Existen herramientas especializadas para implementar las diferentes fases de un compilador.

� Los sistemas de ayuda para construir compiladores se conocen como:� Compiladores de compiladores� Generadores de compiladores� Sistemas generadores de compiladores

Page 24: Unidad1 2  Lenguajes y automatas

Herramientas para la construcción de compiladores (2)

� Algunas herramientas útiles para la construcción de compiladores

� Generadores de analizadores léxicos

� Por lo general, trabajan a partir de una especificación basada en expresiones regulares.

� La organización básica del analizador léxico resultante es un autómata finito.

� Generadores de analizadores sintácticos

� Trabajan a partir de una gramática independiente del contexto.

� El generador hace de esta fase una de las más fáciles de aplicar.

� Se utilizan poderosos y complejos algoritmos para realizar el análisis.

Page 25: Unidad1 2  Lenguajes y automatas

Herramientas para la construcción de compiladores (2)

� Dispositivos de traducción dirigida por la sintaxis

� Producen grupos de rutinas que recorren el árbol de análisis sintáctico generando código intermedio.

� Generadores automáticos de código

� Toman un conjunto de reglas que definen la traducción de cada operación del lenguaje intermedio al lenguaje de máquina objeto.

� La técnica fundamental es la concordancia de plantillas.

Page 26: Unidad1 2  Lenguajes y automatas

Herramientas para la construcción de compiladores (3)

� Un compilador es muy complejo como para programarlo enensamblador.

� Se deben utilizar las ventajas del lenguaje para compilarse a sí mismo(los compiladores de C se escriben en C).

� Sin embargo, un compilador sólo es un programa. El entorno en el quese desarrolle este programa puede afectar la velocidad y la fiabilidadde la implantación del compilador.

Page 27: Unidad1 2  Lenguajes y automatas

Herramientas para la construcción 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 técnicas de ingeniería de software en la construcción de compiladores para evitar …

Page 28: Unidad1 2  Lenguajes y automatas

Clasificación de los compiladores

� Una característica que identifica a los compiladores es el hecho de que traducen completamente el lenguaje fuente de entrada previo a la ejecución del lenguaje objeto a ejecutar.

� Los compiladores se pueden clasificar por el número de pasadas en:� Compilador de una pasada

� Examinan solo una vez el código fuente para generar el código objeto

� Compiladores de múltiples pasadas

� Requiere de pasos intermedios (código intermedio) antes de generar el código objeto final.

� Entre menos pasadas menor tiempo de compilación, sin embargo más pasadas pueden generar código objeto más eficiente.

Page 29: Unidad1 2  Lenguajes y automatas

Clasificación de los compiladores (2)

� Por el código objeto generado se pueden clasificar en:

� Metacompilador� Es un programa que acepta como entrada la descripción 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 hacencon gramáticas libres de contexto.

� Ejemplos clásicos son Lex (generador de analizadoresléxicos) y Yacc (generador de analizadores sintácticos).

� Descompilador� Realiza una tarea de traducción inversa, es decir, va del

código máquina al lenguaje de alto nivel.� Es relativamente sencillo cuando se trata de ir a código

ensamblador o macro ensamblador, pero no cuando sequiere llegar a un lenguaje de alto nivel.

Page 30: Unidad1 2  Lenguajes y automatas

Clasificación de los compiladores (3)

� Compiladores-intérpretes� Realizan dos fases: la fase de compilación y

la fase de interpretación� La fase de compilación traduce la entrada en

una representación intermedia por una única vez.

� La fase de interpretación parte de la representación generada por la primera fase para la ejecución del programa.

� Compiladores cruzados� Surgen como solución al problema de

desarrollar un primer compilador para una nueva arquitectura.

� Dado que el desarrollo de compiladores es una tarea compleja, resulta más fácil construirlos sobre una máquina que ya disponga de herramientas de software.

� Se denomina compilador cruzado a un compilador que se ejecuta en una máquina pero el código objeto es para otra máquina.

Page 31: Unidad1 2  Lenguajes y automatas

Actividad 3

� Con base en la información anterior, tratar de determinar que emplean (compiladores o traductores) al menos 5 lenguajes diferentes

� Genere una tabla con la información obtenida

Page 32: Unidad1 2  Lenguajes y automatas

Actividad 4

� Identificar alfabetos y lenguajes en un Lenguaje de programación que tu decidas.

� Presentar al grupo tu trabajo y justificar el mismo