Top Banner
Programas de Sistemas relacionados con un compilador Inga. Viviana Mérida Compiladores
26

Compiladores

Dec 24, 2015

Download

Documents

Gary Wilson

Compiladores
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Compiladores

Programas de Sistemas relacionados con un compilador

Inga. Viviana MéridaCompiladores

Page 2: Compiladores

Programas de Sistemas relacionados con un Compilador

Como se vio en la figura la entrada para un compilador puede producirse por Uno o varios preprocesadores y puede necesitarse otro procesamiento de la salida Que produce el compilador ante de obtener un código de maquina ejecutable.

Preprocesadores:Los preprocesadores producen la entrada para un compilador, y pueden realizar las

Funciones siguientes:1. Procesamiento de macros: un preprocesador puede permitir a un usuario definir macros, que son abreviaturas de

construcciones mas grandes.2. Inclusión de archivos: un preprocesador puede insertar archivos de encabezamiento en el texto del programa. Por ejemplo, el preprocesador de C hace que el contenido del archivo <global.h> reemplace a la proposición #include <global.h> cuando procesa un archivo que contenga a esa proposición.

3. Preprocesadores “racionales”, estos preprocesadores enriquecen los lenguajes antiguos con recursos mas modernos de flujo de control y de estructuras de datos. Por ejemplo, un preprocesador de este tipo podría proporcionar al usuario macros incorporados para construcciones, como proposiciones hile o if en lenguaje de programación que no las tenga.

Page 3: Compiladores

4. Extensiones a lenguajes. Estos procesadores tratan de crear posibilidades al lenguaje que equivalen a macros incorporadas.

Por ejemplo el lenguaje. Equel es un lenguaje de consulta de base de datos integrando en C. el preprocesador considera las proposiciones que empiezan con ## como proposiciones de acceso a la base de datos, sin relación con C, y se traducen a las llamadas de procedimiento a rutinas que realizan el acceso al base de datos.

Los procesadores de macros tratan dos clases de proposiciones: definición de macros y uso de macros. Las definiciones normalmente se indican con algún carácter exclusivo o palabra clave, como define o macro. Constan de un nombre para la macro que se esta definiendo y de un cuerpo,, que constituye su definición esto es, símbolos que se remplazaran por valores( esto es una cadena de caracteres). El uso de macro consiste en dar nombre a la macro y proporcionar parámetros reales, es decir valores para sus parámetros formales. El procesador de macros sustituye los parámetro reales por los parámetros formales. Del cuerpo de la macro; después el cuerpo transformado reemplaza el uso de la propia macro.

Page 4: Compiladores

El agrupamiento de las fases

• Las actividades de compilación se agrupan normalmente en dos o mas fases.

• Etapa inicial: Recoge aquellas que dependen principalmente del lenguaje fuente.

• análisis léxico y sintáctico, creación de tabla de símbolos, análisis semántico y la generación de código intermedio, con su respectivo manejo de errores.

• Etapa final: Incluye las partes que dependen de la máquina objeto y del lenguaje intermedio.

• Fase de optimación de código, la generación de código, el manejo de errores y las operaciones que involucran la tabla de símbolos.

• Pasadas: Se acostumbra aplicar varias fases de un compilador en una sola pasada.

• Una pasada es la lectura de un archivo de entrada y en la escritura de un archivo de salida.

• Es mejor agrupar los proceso de compilación por pasadas y no por fases.

• El análisis léxico, el análisis sintáctico, el análisis semántico y la generación de código intermedio pueden agruparse en una pasada

• Reducción del número de pasadas: Es recomendable tener pocas pasadas.

• La lectura y escritura de archivos toma tiempo e implica la carga de todo el programa en memoria.

Page 5: Compiladores

FASES DE UN COMPILADOR

• La fase de análisis tiene como entrada, el PF. En base a este programa fuente, la fase de análisis construye una representación intermedia.

¿de quién?...

• Del PF, precisamente. En la fase de síntesis se toma de entrada a esta representación intermedia, para la generación del código que constituye al PO.

Page 6: Compiladores

• El análisis que toma al PF como entrada, consiste a su vez de tres fases:

FASES DEL ANALISIS

Page 7: Compiladores

Herramientas para la construcción

• Existen herramientas ya definidas que se pueden usar para el desarrollo de un compilador. • Las mejores herramientas son las que ocultan los detalles del algoritmo de generación y

producen componentes que se pueden integrar fácilmente al resto del compilador. – Generadores de analizadores sintácticos: Producen analizadores sintácticos a partir de

una entrada fundamental en una gramática independiente del contexto. – Generadores de analizadores léxicos: Generan automáticamente analizadores léxicos a

partir de una especificación basada en expresiones regulares. La organización del analizador léxico es en esencia un autómata finito.

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

– Dispositivos para análisis de flujo de datos: Consiste en la recolección de información sobre la forma en que se transmiten valores de una parte del programa a cada una de las otras partes.

Page 8: Compiladores

SintaxisDefinición y generalidades

• La sintaxis de un lenguaje de programación es una definición de lo que constituye un programa gramaticalmente válido en dicho lenguaje.

• La sintaxis queda especificada por un conjunto de reglas.• Una definición de la sintaxis clara, concisa y formal es

especialmente importante en los lenguajes de programación.

Page 9: Compiladores

SintaxisProcesamiento de lenguajes y métodos formales

Un Metalenguaje es un lenguaje usado para definir otros lenguajes. Backus-Naur Form o BNF es uno de ellos. BNF desarrollado por Noam Chomsky, es altamente usada en la definición de

lenguajes de programación. Es útil para describir de forma precisa las cadenas que son programas

legítimos y aislar todas las demás (las que tienen errores sintácticos de varios tipos)

Las expresiones regulares también es un Metalenguaje

Page 10: Compiladores

SintaxisBNF y el análisis léxico

una sintaxis BNF sencilla es mostrada en la figura.

Page 11: Compiladores

El papel del analizador léxico

•Es la primera fase del programa traductor

•Es el único que gestiona el fichero de entrada

•Es el que lee los caracteres del programa fuente y construye símbolos intermedios, los cuales serán la entrada del analizador sintáctico

¿Por qué separar el análisis léxico del sintáctico?

•El diseño de las partes posteriores dedicadas al análisis queda simplificada

•Con fases separadas se pueden aplicar técnicas específicas y diferenciadas para cada fase

•Se facilita la portabilidad

Los componentes léxicos se especifican mediante expresiones regulares que generan lenguajes regulares más fáciles de reconocer que los LLC

ANALISIS LEXICO

Page 12: Compiladores

Lee los caracteres del programa fuente de izquierda a derecha, y los agrupa en tokens.

ANALISIS LEXICO

Page 13: Compiladores

ANALISIS LEXICOTAREA PRINCIPAL

El PF es la entrada al analizador lexico y generalmente es un archivo de texto (los interpretes reciben una o varias cadenas como entrada, desde el teclado).

Este monitoreo de la entrada (PF) lo efectua el analizador lexico con el fin de identificar tokens, los cuales son cadenas o secuencias de caracteres que tienen un cierto significado.

La salida de un analizador lexico es un conjunto de tokens

Page 14: Compiladores

• En la compilación el análisis consta de tres fases• Análisis léxico: También llamado Análisis lineal. En

este se lee la cadena de caracteres que constituye el programa de izquierda a derecha, y se agrupa en componentes léxicos, que son secuencias de caracteres con significado colectivo.

• En esta etapa el compilador revisa que los tokens contengan los símbolos adecuados del lenguaje.

• Requiere por parte del diseñador del lenguaje, una adecuada clasificación de componentes léxicos (tokens).

• Dentro de las categorías léxicas se tienen: identificadores, números, separadores, operadores, comentarios, espacios en blanco.

Para la expresión de pascal vf := vi + v * 60se agruparían los componentes léxicos así:•el identificador vf •el símbolo de asignación := •el identificador vi •el signo de suma +•el identificador v •el signo de multiplicación *•el número 60 Los espacios en blanco se eliminan durante el análisis léxico.

Page 15: Compiladores

Tokens y lexemas

• Token: • Elemento básico del lenguaje• Unida léxica indivisible• Identifica una entidad lógica dentro del lenguaje• Incluyen: palabras Reservadas, constantes, Operadores, Signos de

puntuación e identificadores.

• Lexema: • la cadena original que se identifica como token• No hay correspondencia 1 – 1 entre token – lexema.• Es cada secuencia de caracteres concreta que encaja con un patron.• P.ej: “8", “23" y “50" son algunos lexemas que encajan con el patrón (‘0'|’1'|’2'| ... |’9') . El

número de lexemas que puede encajar con un patrón puede ser finito o infinito, p.ej. en el patrón ‘W’‘H’‘I’‘L’‘E’ sólo encaja el lexema “WHILE”.

Page 16: Compiladores

Ejemplos de Tokens y Lexemas:

Page 17: Compiladores

Otro EJEMPLO: TOKEN, PATRON LEXEMA

Page 18: Compiladores

SintaxisEl Análisis Léxico y el proceso de compilación

Las etapas de análisis semántico y de optimización analizan la consistencia semántica (comprobando, por ejemplo, la utilización consistente de operadores y tipos de datos) y transforman el texto de forma que pueda utilizar de forma eficiente la arquitectura en la que se ejecutará el programa.

Para terminar, la etapa de generación de código utiliza la representación abstracta resultante como base para la generación de código máquina ejecutable.

• Todos los programas deben ser analizados para comprobar su corrección sintáctica antes de ser interpretados o traducidos a código máquina.

• Al nivel más elemental, el proceso de análisis léxico separa los caracteres individuales del programa en una cadena de tokens que se analiza sintácticamente, de uno en uno, hasta un nivel de análisis superior.

Page 19: Compiladores

SintaxisLas expresiones regulares y el análisis léxico

Las Expresiones regulares son una herramienta muy utilizada en el diseño de lenguajes para especificar formalmente cada clase de token.

Estas permiten conceptos como «una o más apariciones de un dígito». Es más, se puede crear de forma similar una expresión regular para definir el significado de un ldentificador: [a-zA-Z] [a-zA-Z0-9]*

lo que significa «una letra seguida por una o más apariciones de una letra o un dígito».

Las expresiones regulares se han convertido en una herramienta muy popular del diseño de lenguajes, porque admiten la generación automática de analizadores léxicos sin problemas.

Dos generadores bastante utilizados son el «Lex» (que genera código de C) y el «JLex» (que genera código de Java).

Page 20: Compiladores

Análisis Léxico

Errores Léxicos

El analizador léxico típicamente detecta los siguientes errores:

•El utilizar caracteres que no pertenecen al alfabeto del lenguaje

•Encontrar una cadena que no coincide con ninguno de los patrones de los tokens posibles

Posibles acciones que el analizador léxico puede llevar a cabo para recuperarse de los errores

•Ignorar los caracteres no válidos hasta formar un token según los patrones dados

•Borrar los caracteres extraños

•Insertar un caracter que pudiera faltar

•Reemplazar un caracter presuntamente incorrecto por uno correcto

•Conmutar las posiciones de dos caracteres adyacentes

Page 21: Compiladores

Análisis Léxico

Funcionamiento del analizador léxico

Su principal función es procesar la cadena de caracteres y devolver pares (token, lexema). Generalmente debe funcionar como una subrutina del analizador sintáctico.

Analizador sintáctico

Analizador léxico

Tabla de símbolos

Programa fuente

token

Operaciones que realiza el analizador léxico

•Procesador léxico del programa fuente e identificación de tokens y de sus lexemas

•Manejo del fichero del programa fuente

•Ignorar comentarios y en los lenguajes de formato libre, ignorar los separadores

Page 22: Compiladores

PROCESADORESLos procesadores producen la entrada para un compilador y realizan las funciones siguientes.

1)Procesamiento de macros. Permite a un usuario definir macros que son abreviaturas de construcciones grandes.

2)Inclusión de archivos. Inserta archivos de encabezamiento del programa,

3)Procesadores racionales. Este enriquece los lenguajes antiguos con recursos modernos de flujo de control. Por ejemplo While o if, en un lenguaje donde no las tengan.

4) Extensión de Lenguaje. Trata de crear posibilidades de lenguaje que equivalen a macros integradas.

Page 23: Compiladores

ENSAMBLADORESAlgunos compiladores producen código ensamblador, es decir un código que se puede ensamblar para su procesamiento.

Un código ensamblador usa nombres en lugar de códigos binarios para operaciones.

Page 24: Compiladores

ENSAMBLADO DE DOS PASADASUn ensamblador hace dos pasadas sobre la entrada, en la primera pasada lee una vez un archivo de entrada.

En la segunda pasada el ensamblador examina el archivo y luego la traduce a bits, el resultado de la segunda pasada es un lenguaje de máquina.

Page 25: Compiladores

CARGADORES Y EDITORES DE ENLACE

Un programa llamado cargador realiza dos funciones de carga y edición de enlaces. El proceso de carga consiste en tomar el código de máquina y relocalizables, modificar las direcciones y ubicar las instrucciones y los datos modificados en las proposiciones ubicadas en la memoria

Page 26: Compiladores

MUCHAS GRACIAS POR SU ATENCIÓN!