compiladoresunidad1-130830164211-phpapp02.pptx

download compiladoresunidad1-130830164211-phpapp02.pptx

of 31

Transcript of compiladoresunidad1-130830164211-phpapp02.pptx

UNIVERSIDAD DEL DESARROLLO PROFESIONAL

UNIDAD

COMPONENTES DE UN COMPILADORCOMPILADORES

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

Un programa informtico que traduce un programa escrito en un lenguaje de programacin a otro lenguaje de programacin, generando un programa equivalente que la mquina ser capaz de interpretar. El segundo lenguaje es lenguaje de mquina, pero tambin puede ser simplemente texto. Este proceso de traduccin se conoce como compilacin. Un compilador es un programa que permite traducir el cdigo fuente de un programa en lenguaje de alto nivel

Tipos de CompiladoresCompiladores cruzados : generan cdigo para un sistema distinto del que estn funcionando.

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

Compiladores de una sola pasada : generan el cdigo mquina a partir de una nica lectura del cdigo fuente.

Compiladores de varias pasadas : necesitan leer el cdigo fuente varias veces antes de poder producir el cdigo mquina.

Compiladores JIT (Just In Time): forman parte de un intrprete y compilan partes del cdigo segn se necesitan.

Generalmente un compilador se divide en dos partes:

* Front End: parte que analiza el cdigo fuente, comprueba su validez, genera el rbol de derivacin y rellena los valores de la tabla de smbolos. Parte que suele ser independiente de la plataforma o sistema operativo para el que funcionar.

* Back End: parte en donde se genera el cdigo mquina 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).

Caractersticas

El lenguaje de programacin Java , fue diseado por la compaa Sun Microsystems Inc, con el propsito de crear un lenguaje que pudiera funcionar en redes computacionales heterogneas ( redes de computadoras formadas por ms 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 mquina o plataforma. Compiladores de JAVA

Evitar errores de memoria Imposibilitar acceso al SO Evitar que caiga la mquina sobre la que correAusencia de punteros: Protege frente a imitacin de objetos, violacin de encapsulacin, acceso a reas protegidas de memoria, ya que el programador no podr referenciar posiciones de memoria especficas no reservadas, a diferencia de lo que se puede hacer en C y C++. Caractersticas de compiladores de JAVA

Compiladores de C#Es un lenguaje de programacin orientado a objetos desarrollado y estandarizado por Microsoft como parte de su plataforma .NET . Esta es una interfaz de programacin de aplicaciones ( API ), mientras que C es un lenguaje de programacin independiente diseado para generar programas sobre dicha plataforma

Microsoft.NET framework SDK (siglas en ingls 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 CMicrosoft Visual Studio versin 2002, 2003, 2005, 2008 y 2010 Mono .NET desarrollado por Novell . Como parte de esta implementacin se incluye un compilador de C. Delphi 2006, de Borland Software Corporation. dotGNU Portable.NET , de la Free Software Foundation . Tipos de Compiladores

Caractersticas compiladores C # Un ncleo del lenguaje simple, con funcionalidades aadidas importantes, como funciones matemticas y de manejo de archivos, proporcionadas por bibliotecas .

Es un lenguaje muy flexible que permite programar con mltiples 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 mltiples archivos de cdigo fuente .

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

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

Compiladores vs Interpretes Cualquier lenguaje puede ser ejecutado tanto va intrprete o va compilador, pero algunos lenguajes suelen asociarse ms a una va que a la otra, y por esto son llamados "lenguajes interpretados" o "lenguajes compilados" respectivamente.

Tambin existen intrpretes que incluyen cierta "compilacin" en el medio. Son aquellos que compilan a un cdigo intermedio llamado bytecode, que es ms eficiente de ejecutar que hacerlo directamente desde el cdigo fuente.

En general, la principal desventaja de los intrpretes, es que cuando un programa es interpretado, suele ejecutarse ms lento que si el mismo programa estuviese compilado. Esto se debe a que el intrprete debe analizar cada sentencia en el programa en cada ejecucin (un anlisis en tiempo real). Tambin el acceso a variables es ms lento en un intrprete, porque mapear los identificadores para almacenar las localizaciones debe hacerse repetidas veces en tiempo real.

ANALISIS LEXICOUn analizador lxico o analizador lexicogrfico (en ingls scanner) es la primera fase de un compilador consistente en un programa que recibe como entrada el cdigo fuente de otro programa (secuencia de caracteres) y produce una salida compuesta de tokens (componentes lxicos) o smbolos. Estos tokens sirven para una posterior etapa del proceso de traduccin, siendo la entrada para el analizador sintctico (en ingls parser).

Sin embargo, un analizador lxico tambin es la parte del traductor que maneja la entrada del cdigo fuente, y puesto que esta entrada a menudo involucra un importante gasto de tiempo, el analizador lxico debe funcionar de manera tan eficiente como sea posible.

GRAMTICA LXICA

La especificacin de un lenguaje de programacin a menudo incluye un conjunto de reglas que definen el lxico. Estas reglas consisten comnmente en expresiones regulares que indican el conjunto de posibles secuencias de caracteres que definen un Token o lexema.En algunos lenguajes de programacin es necesario establecer patrones para caracteres especiales (como el espacio en blanco) que la gramtica pueda reconocer sin que constituya un Token en s.

ANLISIS

Esta etapa est basada usualmente en una mquina de estados finitos. Esta mquina contiene la informacin 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 numricos.

ANALISIS SINTACTICOEl anlisis sintctico convierte el texto de entrada en otras estructuras (comnmente rboles), que son ms tiles para el posterior anlisis y capturan la jerarqua implcita de la entrada. Un analizador lxico crea tokens de una secuencia de caracteres de entrada y son estos tokens los que son procesados por el analizador sintctico para construir la estructura de datos, por ejemplo un rbol de anlisis o rboles de sintaxis abstracta.

El anlisis sintctico tambin es un estado inicial del anlisis de frases de lenguaje natural. Los lenguajes habitualmente reconocidos por los analizadores sintcticos son los lenguajes libres de contexto.

Tipos generales de analizadores sintcticos para gramticas:

a) Anlisis sintctico descendente. Construye rboles de anlisis sintctico desde arriba (raz) hacia abajo (hojas). El anlisis se realiza de lo general a lo particular.

b) Anlisis sintctico ascendente. Construyen rboles de anlisis sintctico comenzando en las hojas y suben hacia la raz. El anlisis se realiza de lo particular a lo general.En ambos casos, se examina la entrada al analizador lxico de izquierda a derecha, un smbolo a la vez.

ANALISIS SINTACTICO DESCENDENTE

Se considera un intento de encontrar una derivacin por la izquierda para una cadena de entrada. Tambin se puede considerar como un intento de construir un rbol de anlisis sintctico para la entrada comenzando desde la raz y creando nodos del rbol en orden previo.

ANALISIS SINTACTICO ASCENDENTE

El anlisis sintctico ascendente intenta construir un rbol para la cadena de entrada que comienza por las hojas (el fondo) y avanza hacia la raz (la cima).ANLISIS SINTCTICO POR PRECEDENCIA DE OPERADORES

Para una pequea clase de gramticas se puede construir con facilidad a mano eficientes analizadores sintcticos ascendentes. Ests gramticas, por precedencia de operadores, tienen la propiedad de que ningn lado derecho de la produccin es ni tiene 2 terminales adyacentes.Una gramtica con esta ltima propiedad de denomina gramtica de operadores.

ANALIZADORES SINTCTICOS IZQUIERDA-DERECHA

Es una tcnica eficiente de anlisis sintctico ascendente que se puede utilizar para analizar una amplia clase de gramticas independientes de contexto, denominada Anlisis sintctico LR(k)

L es por el examen de la entrada de izquierda a derecha (left to right)R por construir una derivacin por la derecha (right most derivation) en orden inverso.K por el nmero de smbolos de entrada de examen por anticipado utilizados para tomar decisiones del anlisis sintctico. Cuando se omite, se asume que k es 1.Este anlisis es atractivo por varias razones: Reconocen prcticamente todas las construcciones de los lenguajes de programacin para los que se pueden escribir gramticas independientes del contexto. Puede detectar un error sintctico tan pronto como sea posible hacerlo en un examen de izquierda a derecha de la entrada.

ANALISIS SEMANTICOQue es la semntica?Se refiere a los aspectos del significado, sentido o interpretacin del significado de un determinado elemento, smbolo, palabra, expresin o representacin formal.

Anlisis semnticoSe 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 vlido.

Que es un rbol semntico?

Es una estructura jerrquica en la cual se registran las operaciones que implica u operan dentro del programa fuente En cada una de las ramas del rbol semntico se registra el valor o significado que este debe tener, y el anlisis semntico se encarga de terminar cual delos valores registrados en las ramas es aplicable.Ejemplo:Suponiendo que tenemos esta lnea de cdigo en C:res=valor1+valor2;

El anlisis semntico se va a encargar que tanto el valor1 como el valor2 tengan datos que son compatibles en comn y que adems se les pueda aplicar dicho operador.

En C el smbolo (+) implica una suma de valores o una unin de las cadenas

Tabla de smbolos

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

El compilador debe desarrollar una serie de funciones relativas a la manipulacin de esta tabla como insertar un nuevo elemento en ella, consultar la informacin relacionada con un smbolo, borrar un elemento, etc. Como se tiene que acceder mucho a la tabla de smbolos los accesos deben ser lo ms rpidos posible para que la compilacin sea eficiente.

GENERACION DE CODIGO INTERMEDIO

OPTIMIZACION DE CODIGOGeneracin de cdigo

Se realiza mientras se analiza el programa

Libre del contexto

Optimizacin

Se realiza despus de la generacin de cdigo de todo el programa o de un elemento ejecutable del programa (funcin, procedimiento, etc).

Dependiente del contexto

22

Se ejecuta todojunto. Mientrasse analiza segenera cdigoGeneracin de Cdigo y Optimizacin

Optimizacin

Objetivo Obtener cdigo que se ejecuta ms eficientemente segn los criterios

Tiempo de ejecucin (optimizacin temporal) Espacio de memoria utilizado (optimizacin espacial) Funcionamiento

Revisa el cdigo generado a varios niveles de abstraccin yrealiza las optimizaciones aplicables al nivel de abstraccin Representaciones de cdigo intermedio de ms a menosAbstractas

rbol sintctico abstracto: optimizar subexpresionesredundantes, reduccin de frecuencia, etc. Ensamblador/Cdigo mquina: convertir saltos a saltos cortos,reordenar instrucciones

Optimizacin

Funcionamiento (continuacin) Representaciones de cdigo para extraer informacin. Condiciones que se han de cumplir El cdigo optimizado se ha de comportar igual que el cdigode partida excepto por ser ms rpido o ocupar menosespacio.

Hay que buscar transformaciones que no modifiquen elcomportamiento del cdigo segn el comportamientodefinido para el lenguaje de programacin. Ejemplo Si no se ha definido el orden de evaluacin de los operandos la siguiente optimizacin es vlidaB=2*A+(A=c*d);Pasar aA=c*d;B=A*2;

25

BLOQUE BSICO

Un bloque bsico es un fragmento de cdigo que tiene unanica entrada y salida, y cuyas instrucciones se ejecutansecuencialmente. Implicaciones:

Si se ejecuta una instruccin del bloque se ejecutan todas en un orden conocido en tiempo de compilacin.

La idea del bloque bsico es encontrar partes del programacuyo anlisis necesario para la optimizacin sea lo mssimple posible.

MANEJO DE ERRORESEl compilador tiene que:

Reportar clara y exactamente la presencia de erroresRecuperarse de cada error lo suficientemente rpido para poder detectar errores subsiguientesTratar de evitar mensajes falsos de errorTipos de Errores

LxicosSintcticosSemnticosLgicos

Errores Lxicos

Un error que produce un token errneoErrores lxicos posiblesUn identificador, palabra reservada u operador mal escrito (typo) Errores Sintcticos

Un error de sintaxis se detecta cuando el analizador sintctico espera un smbolo que no corresponde al que se acaba de leer. Los analizadores sintcticos tienen la ventaja de que pueden detectar errores sintcticos lo ms pronto posible, es decir, se genera un mensaje de error en cuanto el smbolo analizado no sigue la secuencia de los smbolos analizados hasta ese momento.Expresin aritmtica con parntesis no balanceadosUn punto y coma faltante

Errores Semnticos

Un error que necesita informacin sensitiva al contexto para ser identificadoEjemplosUn operador aplicado a un tipo incompatible de operandoAccesar una variable no declaradaErrores Lgicos

Errores en el modelo de ejecucinEjemplosRecursin infinitaAccesar un arreglo fuera de los lmitesDiferenciar un null

MANEJO DE SIMBOLOS O TABLA DE SIMBOLOSUna tabla de smbolos es una estructura de datos que usa el proceso de traduccin de un lenguaje de programacin, por un compilador o un intrprete, donde cada smbolo en el cdigo fuente de un programa est asociado con informacin tal como la ubicacin, el tipo de datos y el mbito de cada variable, constante o procedimiento.

Puede tratarse como una estructura transitoria o voltil, que sea utilizada nicamente en el proceso de traduccin de un lenguaje de programacin, para luego ser descartada, o integrada en la salida del proceso de compilacin para una explotacin posterior, como puede ser por ejemplo, durante una sesin de depuracin, o como recurso para obtener un informe de diagnstico durante o despus la ejecucin de un programa.

Los smbolos en la tabla de smbolos pueden referirse a constantes, a funciones o a tipos de datos en el cdigo fuente de un programa.

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 implementacin de un compilador particular.

Nombre del identificador. Direccin en tiempo de ejecucin a partir del cual se almacenara el identificador si es una variable. Tipo del identificador. Si es una funcin el tipo que devuelve la funcin. Nmero de dimensiones del array (arreglo), o nmero de miembros de una estructura o clase, o nmeros de parmetros si se trata de una funcin. Tamao mximo o rango de cada una de las dimensiones de los array, si tiene dimensin esttica. Etc.