Compiladores unidad1

31
UNIDAD COMPONENTES DE UN COMPILADOR COMPILADORES

description

 

Transcript of Compiladores unidad1

Page 1: Compiladores unidad1

UNIDAD

COMPONENTES DE UN COMPILADOR

COMPILADORES

Page 2: Compiladores unidad1

¿Que es un Compilador?

Los compiladores son programas o herramientas encargadas de compilar. Un compilador toma un texto (código fuente) escrito en un lenguaje de alto nivel y lo traduce a un lenguaje comprensible por las computadoras (código objeto).

Un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, generando un programa equivalente que la máquina será capaz de interpretar. El segundo lenguaje es lenguaje de máquina, pero también puede ser simplemente texto. Este proceso de traducción se conoce como compilación. Un compilador es un programa que permite traducir el código fuente de un programa en lenguaje de alto nivel

Page 3: Compiladores unidad1

Tipos de Compiladores

Compiladores cruzados : generan código para un sistema distinto del que están funcionando.

Compiladores optimizadores : realizan cambios en el código para mejorar su eficiencia, pero manteniendo la funcionalidad del programa original.

Compiladores de una sola pasada : generan el código máquina a partir de una única lectura del código fuente.

Compiladores de varias pasadas : necesitan leer el código fuente varias veces antes de poder producir el código máquina.

Compiladores JIT (Just In Time): forman parte de un intérprete y compilan partes del código según se necesitan.

Page 4: Compiladores unidad1

Generalmente un compilador se divide en dos partes:

* Front End: parte que analiza el código fuente, comprueba su validez, genera el árbol de derivación y rellena los valores de la tabla de símbolos. Parte que suele ser independiente de la plataforma o sistema operativo para el que funcionará.

* Back End: parte en donde se genera el código máquina exclusivo para una plataforma a partir de lo analizado en el front end.

Por lo general el resultado del back end no puede ser ejecutado directamente, se necesita pasar por un proceso de enlazado (linker).

Características

Page 5: Compiladores unidad1

El lenguaje de programación Java , fue diseñado por la compañía Sun Microsystems Inc, con el propósito de crear un lenguaje que pudiera funcionar en redes computacionales heterogéneas ( redes de computadoras formadas por más de un tipo de computadora, ya sean PC, MAC's, estaciones de trabajo , etc.),y que fuera independiente de la plataforma en la que se vaya a ejecutar. Esto significa que un programa de Java puede ejecutarse en cualquier máquina o plataforma.

Compiladores de JAVA

Page 6: Compiladores unidad1

Evitar errores de memoria Imposibilitar acceso al SO Evitar que caiga la máquina sobre la que correAusencia de punteros: Protege frente a imitación de objetos, violación de encapsulación, acceso a áreas protegidas de memoria, ya que el programador no podrá referenciar posiciones de memoria específicas no reservadas, a diferencia de lo que se puede hacer en C y C++.

Características de compiladores de JAVA

Page 7: Compiladores unidad1

Compiladores de C#

Es un lenguaje de programación orientado a objetos desarrollado y estandarizado por Microsoft como parte de su plataforma .NET . Esta es una interfaz de programación de aplicaciones ( API ), mientras que C ♯ es un lenguaje de programación independiente diseñado para generar programas sobre dicha plataforma

Page 8: Compiladores unidad1

Microsoft.NET framework SDK (siglas en inglés de software development kit) es generalmente un conjunto de herramientas de desarrollo de software que le permite al programador crear aplicaciones para un sistema concreto, por ejemplo ciertos paquetes de software, frameworks, plataformas de hardware, computadoras, videoconsolas, sistemas operativos, etc. incluye un compilador de C♯Microsoft Visual Studio versión 2002, 2003, 2005, 2008 y 2010 Mono .NET desarrollado por Novell . Como parte de esta implementación se incluye un compilador de C♯. Delphi 2006, de Borland Software Corporation. dotGNU Portable.NET , de la Free Software Foundation .

Tipos de Compiladores

Page 9: Compiladores unidad1

Características compiladores C #

Un núcleo del lenguaje simple, con funcionalidades añadidas importantes, como funciones matemáticas y de manejo de archivos, proporcionadas por bibliotecas .

Es un lenguaje muy flexible que permite programar con múltiples estilos.

Un sistema de tipos que impide operaciones sin sentido.

Usa un lenguaje de pre procesado , el preprocesador de C , para tareas como definir macros e incluir múltiples archivos de código fuente .

Acceso a memoria de bajo nivel mediante el uso de punteros .

Interrupciones al procesador con uniones . Un conjunto reducido de palabras clave

Page 10: Compiladores unidad1

Compiladores vs Interpretes

Cualquier lenguaje puede ser ejecutado tanto vía intérprete o vía compilador, pero algunos lenguajes suelen asociarse más a una vía que a la otra, y por esto son llamados "lenguajes interpretados" o "lenguajes compilados" respectivamente.

También existen intérpretes que incluyen cierta "compilación" en el medio. Son aquellos que compilan a un código intermedio llamado bytecode, que es más eficiente de ejecutar que hacerlo directamente desde el código fuente.

En general, la principal desventaja de los intérpretes, es que cuando un programa es interpretado, suele ejecutarse más lento que si el mismo programa estuviese compilado. Esto se debe a que el intérprete debe analizar cada sentencia en el programa en cada ejecución (un análisis en tiempo real). También el acceso a variables es más lento en un intérprete, porque mapear los identificadores para almacenar las localizaciones debe hacerse repetidas veces en tiempo real.

Page 11: Compiladores unidad1

ANALISIS LEXICO

Un analizador léxico o analizador lexicográfico (en inglés scanner) es la primera fase de un compilador consistente en un programa que recibe como entrada el código fuente de otro programa (secuencia de caracteres) y produce una salida compuesta de tokens (componentes léxicos) o símbolos. Estos tokens sirven para una posterior etapa del proceso de traducción, siendo la entrada para el analizador sintáctico (en inglés parser).

Sin embargo, un analizador léxico también es la parte del traductor que maneja la entrada del código fuente, y puesto que esta entrada a menudo involucra un importante gasto de tiempo, el analizador léxico debe funcionar de manera tan eficiente como sea posible.

Page 12: Compiladores unidad1

GRAMÁTICA LÉXICA

La especificación de un lenguaje de programación a menudo incluye un conjunto de reglas que definen el léxico. Estas reglas consisten comúnmente en expresiones regulares que indican el conjunto de posibles secuencias de caracteres que definen un Token o lexema.En algunos lenguajes de programación es necesario establecer patrones para caracteres especiales (como el espacio en blanco) que la gramática pueda reconocer sin que constituya un Token en sí.

ANÁLISIS

Esta etapa está basada usualmente en una máquina de estados finitos. Esta máquina contiene la información de las posibles secuencias de caracteres que puede conformar cualquier Token que sea parte del lenguaje (las instancias individuales de estas secuencias de caracteres son denominados lexemas). Por ejemplo, un Token de naturaleza entero puede contener cualquier secuencia de caracteres numéricos.

Page 13: Compiladores unidad1

ANALISIS SINTACTICO

El análisis sintáctico convierte el texto de entrada en otras estructuras (comúnmente árboles), que son más útiles para el posterior análisis y capturan la jerarquía implícita de la entrada. Un analizador léxico crea tokens de una secuencia de caracteres de entrada y son estos tokens los que son procesados por el analizador sintáctico para construir la estructura de datos, por ejemplo un árbol de análisis o árboles de sintaxis abstracta.

El análisis sintáctico también es un estado inicial del análisis de frases de lenguaje natural. Los lenguajes habitualmente reconocidos por los analizadores sintácticos son los lenguajes libres de contexto.

Page 14: Compiladores unidad1

Tipos generales de analizadores sintácticos para gramáticas:

a) Análisis sintáctico descendente. Construye árboles de análisis sintáctico desde arriba (raíz) hacia abajo (hojas). El análisis se realiza de lo general a lo particular.

b) Análisis sintáctico ascendente. Construyen árboles de análisis sintáctico comenzando en las hojas y suben hacia la raíz. El análisis se realiza de lo particular a lo general.En ambos casos, se examina la entrada al analizador léxico de izquierda a derecha, un símbolo a la vez.

Page 15: Compiladores unidad1

ANALISIS SINTACTICO DESCENDENTE

Se considera un intento de encontrar una derivación por la izquierda para una cadena de entrada. También se puede considerar como un intento de construir un árbol de análisis sintáctico para la entrada comenzando desde la raíz y creando nodos del árbol en orden previo.

ANALISIS SINTACTICO ASCENDENTE

El análisis sintáctico ascendente intenta construir un árbol para la cadena de entrada que comienza por las hojas (el fondo) y avanza hacia la raíz (la cima).ANÁLISIS SINTÁCTICO POR PRECEDENCIA DE OPERADORES

Para una pequeña clase de gramáticas se puede construir con facilidad a mano eficientes analizadores sintácticos ascendentes. Estás gramáticas, por precedencia de operadores, tienen la propiedad de que ningún lado derecho de la producción es є ni tiene 2 terminales adyacentes.Una gramática con esta última propiedad de denomina gramática de operadores.

Page 16: Compiladores unidad1

ANALIZADORES SINTÁCTICOS IZQUIERDA-DERECHA

Es una técnica eficiente de análisis sintáctico ascendente que se puede utilizar para analizar una amplia clase de gramáticas independientes de contexto, denominada Análisis sintáctico LR(k)

L es por el examen de la entrada de izquierda a derecha (left to right)R por construir una derivación por la derecha (right most derivation) en orden inverso.K por el número de símbolos de entrada de examen por anticipado utilizados para tomar decisiones del análisis sintáctico. Cuando se omite, se asume que k es 1.Este análisis es atractivo por varias razones:• Reconocen prácticamente todas las construcciones de los lenguajes de programación para los que se pueden escribir gramáticas independientes del contexto.• Puede detectar un error sintáctico tan pronto como sea posible hacerlo en un examen de izquierda a derecha de la entrada.

Page 17: Compiladores unidad1

ANALISIS SEMANTICO

Que es la semántica?Se refiere a los aspectos del significado, sentido o interpretación del significado de un determinado elemento, símbolo, palabra, expresión o representación formal.

Análisis semánticoSe trata de determinar el tipo de los resultados intermedios, comprobar que los argumentos que tiene un operador pertenecen al conjunto de los operadores posibles, y si son compatibles entre sí, etc. En definitiva, comprobará que el significado de lo que se va leyendo es válido.

Page 18: Compiladores unidad1

Que es un árbol semántico?

Es una estructura jerárquica en la cual se registran las operaciones que implica u operan dentro del programa fuente En cada una de las ramas del árbol semántico se registra el valor o significado que este debe tener, y el análisis semántico se encarga de terminar cual delos valores registrados en las ramas es aplicable.

Ejemplo:Suponiendo que tenemos esta línea de código en C:res=valor1+valor2;

El análisis semántico se va a encargar que tanto el valor1 como el valor2 tengan datos que son compatibles en común y que además se les pueda aplicar dicho operador.

En C el símbolo (+) implica una suma de valores o una unión de las cadenas

Page 19: Compiladores unidad1

Tabla de símbolos

Un compilador necesita guardar y usar la información de los objetos que se va encontrando en el texto fuente, como variables, etiquetas, declaraciones de tipos, etc.Esta información se almacena en una estructura de datos interna conocida como tabla de símbolos.

El compilador debe desarrollar una serie de funciones relativas a la manipulación de esta tabla como insertar un nuevo elemento en ella, consultar la información relacionada con un símbolo, borrar un elemento, etc. Como se tiene que acceder mucho a la tabla de símbolos los accesos deben ser lo más rápidos posible para que la compilación sea eficiente.

Page 20: Compiladores unidad1

GENERACION DE CODIGO INTERMEDIO

Page 21: Compiladores unidad1
Page 22: Compiladores unidad1

OPTIMIZACION DE CODIGO

Generación de código

– Se realiza mientras se analiza el programa

– “Libre del contexto”

Optimización

– Se realiza después de la generación de código de todo el programa o de un elemento ejecutable del programa (función, procedimiento, etc).

– “Dependiente del contexto”

Page 23: Compiladores unidad1

Se ejecuta todojunto. Mientrasse analiza segenera código

Generación de Código y Optimización

Page 24: Compiladores unidad1

Optimización

• Objetivo– Obtener código que se ejecuta más eficientemente según los criterios

• Tiempo de ejecución (optimización temporal)• Espacio de memoria utilizado (optimización espacial)• Funcionamiento

– Revisa el código generado a varios niveles de abstracción yrealiza las optimizaciones aplicables al nivel de abstracción• Representaciones de código intermedio de más a menosAbstractas

– Árbol sintáctico abstracto: optimizar subexpresionesredundantes, reducción de frecuencia, etc.– Ensamblador/Código máquina: convertir saltos a saltos cortos,reordenar instrucciones

Page 25: Compiladores unidad1

Optimización

• Funcionamiento (continuación)– Representaciones de código para extraer información.• Condiciones que se han de cumplir– El código optimizado se ha de comportar igual que el códigode partida excepto por ser más rápido o ocupar menosespacio.

– Hay que buscar transformaciones que no modifiquen elcomportamiento del código según el comportamientodefinido para el lenguaje de programación. Ejemplo• Si no se ha definido el orden de evaluación de los operandos la siguiente optimización es válida

B=2*A+(A=c*d);Pasar aA=c*d;B=A*2;

Page 26: Compiladores unidad1

BLOQUE BÁSICO

• Un bloque básico es un fragmento de código que tiene unaúnica entrada y salida, y cuyas instrucciones se ejecutansecuencialmente. Implicaciones:

– Si se ejecuta una instrucción del bloque se ejecutan todas en un orden conocido en tiempo de compilación.

• La idea del bloque básico es encontrar partes del programacuyo análisis necesario para la optimización sea lo mássimple posible.

Page 27: Compiladores unidad1

MANEJO DE ERRORES

El compilador tiene que:

–Reportar clara y exactamente la presencia de errores–Recuperarse de cada error lo suficientemente rápido para poder detectar errores subsiguientes–Tratar de evitar mensajes falsos de error

Tipos de Errores

•Léxicos•Sintácticos•Semánticos•Lógicos

Page 28: Compiladores unidad1

Errores Léxicos

•Un error que produce un token erróneo•Errores léxicos posibles–Un identificador, palabra reservada u operador mal escrito (typo)

Errores Sintácticos

Un error de sintaxis se detecta cuando el analizador sintáctico espera un símbolo que no corresponde al que se acaba de leer. Los analizadores sintácticos tienen la ventaja de que pueden detectar errores sintácticos lo más pronto posible, es decir, se genera un mensaje de error en cuanto el símbolo analizado no sigue la secuencia de los símbolos analizados hasta ese momento.–Expresión aritmética con paréntesis no balanceados–Un punto y coma faltante

Page 29: Compiladores unidad1

Errores Semánticos

•Un error que necesita información sensitiva al contexto para ser identificado•Ejemplos–Un operador aplicado a un tipo incompatible de operando–Accesar una variable no declarada

Errores Lógicos

•Errores en el modelo de ejecución•Ejemplos–Recursión infinita–Accesar un arreglo fuera de los límites–Diferenciar un null

Page 30: Compiladores unidad1

MANEJO DE SIMBOLOS O TABLA DE SIMBOLOS

Una tabla de símbolos es una estructura de datos que usa el proceso de traducción de un lenguaje de programación, por un compilador o un intérprete, donde cada símbolo en el código fuente de un programa está asociado con información tal como la ubicación, el tipo de datos y el ámbito de cada variable, constante o procedimiento.

Puede tratarse como una estructura transitoria o volátil, que sea utilizada únicamente en el proceso de traducción de un lenguaje de programación, para luego ser descartada, o integrada en la salida del proceso de compilación para una explotación posterior, como puede ser por ejemplo, durante una sesión de depuración, o como recurso para obtener un informe de diagnóstico durante o después la ejecución de un programa.

Los símbolos en la tabla de símbolos pueden referirse a constantes, a funciones o a tipos de datos en el código fuente de un programa.

Page 31: Compiladores unidad1

La siguiente representa una serie de atributos que no es necesaria para todos los compiladores, sin embargo cada uno de ellos se puede utilizar en la implementación de un compilador particular.

Nombre del identificador. Dirección en tiempo de ejecución a partir del cual se almacenara el identificador si es una variable. Tipo del identificador. Si es una función el tipo que devuelve la función. Número de dimensiones del array (arreglo), o número de miembros de una estructura o clase, o números de parámetros si se trata de una función. Tamaño máximo o rango de cada una de las dimensiones de los array, si tiene dimensión estática. Etc.