Está en la página 1de 8

BREVE INTRODUCCION

En este trabajo veremos una


breve Introducción a los
compiladores
Básicament e en est e t ema nos
enfocaremos en lo que es un
compilador.
¿Compilador? Es un traduct or
que convierte un text o escrit o
en un lenguaje fuente y lo
COMPILADORES t raduce a un programa objet o
en código máquina.

E INTERPRETES Angel Bueno 07-EIS6-1-059


Tarea de Investigación

Sección : 1113

Fecha: 22-Septiembre-2015

Profesora: Benito Vinicio


Rubio
TEM A I: INTRODUCCIÓN A LA COM PILACIÓN
Introducción a los compiladores

Básicam ent e en est e tema nos enfocarem os en lo que es un compilador.

¿Compilador? Es un traductor que conviert e un t exto escrito en un lenguaje fuent e y lo


traduce a un programa objeto en código máquina.

1.2. Análisis del programa fuente.

Análisis: Se trata de la comprobación de la corrección del programa fuent e e incluye las fases
correspondient es al Análisis Léxico (que consiste en la descomposición del programa fuente en
componentes léxicos), Análisis Sintáctico (agrupación de los componentes léxicos en frases
gramaticales) y Análisis Semánt ico (comprobación de la validez semántica de las sent encias
aceptadas en la fase de Análisis Sintáctico).

1.3. Las fases de un compilador:

Las fases de un compilador son:

Análisis Léxico: Esta fase se encarga de verificar si todas las cadenas pert enecen o no al
lenguaje. Es decir realiza un análisis símbolo por símbolo indicando el token por cada uno d e
los elem ent os reconocidos o el error en caso de no reconocer. Este análisis no logra detectar
muchos errores por su característica.

Ejemplo:

Total = valor* 5

Luego del análisis léxico:

id = id * num

Análisis Sintáctico: En esta fase se analiza la estructura de las expresiones en base a


gramáticas. Aquí ya se puede det erminar si una estructura por ejemplo una expresión
mat emát ica mal formada. El análisis que se realiza es jerárquico es decir en base a árboles de
derivación que se obtienen de las mismas gramáticas. Ejemplo: position:= initial + rate* 60

Análisis Semántico: Est e análisis es más difícil de formalizar, determina el tipo de los
resultados intermedios, comprobar que los argument os que tienen un operador pert enecen al
conjunto de operadores posible, y si son compatibles entre sí.

Generación de Código Intermedio: El código intermedio es una representación en base a


elem ent os de 3 y 4 direcciones. Lo que nos permite llegar a la fase de optimización de código.

A=b+c

1: + b c T1

2: = a T1
Opt imización de Código: Consist e en realizar una mejora en el código intermedio, para reducir
el número de líneas y hacer que la ejecución sea más rápida

A=b+c

1: + b c a

Generación de Código: Llegamos a la generación de código ensamblador o código máquina del


procesador que nos interese por ejemplo:

a: = b + c

LOAD B

ADD C

STORE A

1.4. Programas de sistemas relacionados con un compilador:

Preprocesador: Un programa fuent e puede estar dividido en módulos almacenados en


ficheros diferent es. La tarea de recopilar el código fuente almacenado en est os ficheros pued e
ser encomendada a un preprocesador. Asimismo, un preprocesador puede expandir las
macros

Convirtiéndolas en instrucciones ejecutables.

Ensamblador: Para poder obt ener un programa ejecutable es preciso ensamblar est e
programa final con un ensamblador convencional.

Enlazador. Esta herramienta t oma código máquina relocalizables de los diferent es objetos
compilados y de librería, modifica las direcciones relocalizables para situarlas a los valores
absolut os adecuados, y crea el programa ejecutable.

1.5. Agrupamient o de las fases de un compilador

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 t ener pocas pasadas dado que la lectura y la escritura de archivos intermedios
llevan tiempo.

Sin embargo, en ocasiones resulta muy difícil generar código si no se tiene una represent ación
intermedia completa. Por ejemplo:

Las instrucciones de tipo got o que saltan hacia delante. En est e caso es posible dejar un
espacio en blanco y rellenar cuando la información est é disponible.
1.6. Herramientas para la construcción de compiladores,

Existen herramientas especializadas para implem entar 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

Algunas herramient as ú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 finit o.

Generadores de analizadores sintácticos

 Trabajan a partir de una gramát ica independient e del contexto.

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

 Se utilizan poderosos y complejos algorit mos para realizar el análisis.

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 aut omáticos de código

 Toman un conjunt o de reglas que definen la traducción de cada operación del lenguaje
intermedio al lenguaje de máquina objet o.

 La técnica fundam ental es la concordancia de plantillas.


TEM A II: UN COM PILADOR SENCILLO DE UNA PASADA:

1. Definición de la sintaxis:

Una definición dirigida por la sintaxis ut iliza una gramática independient e del cont ext o para
especificar la estructura sintáctica de la entrada. A cada símbolo de la gramática le asocia un
conjunto de atributos y a cada producción, un conjunto de reglas semánticas para calcular los
valores de los atributos asociados con los símbolos que aparecen en esa producción. La
gramática y el conjunto de reglas semánticas constit uyen la definición dirigida por sintaxis

Una Traducción es una transformación de una entrada en una salida. La salida para cada
entrada X se especifica de la forma siguiente

Prim ero: Se construye un árbol de análisis sintáctico para x. Supóngase que un nodo n del
árbol de análisis sintáctico está etiquetado con el símbolo X de la gramática. Se escribe X.a
para indicar el valor del atributo de a de X en ese nodo. El valor de X.a en n se calcula por la
regla semántica para el atribut o de a asociado con la producción de X utilizado en el nodo n. Al
árbol de análisis sint áct ico que muestre los valores de los atributos en cada nodo se dice qu e
es un árbol de análisis sint áctico con anotaciones

2. Traducción dirigida por la sintaxis:

El significado de una construcción de un lenguaje está directamente relacionado con su


estructura sint áctica según se representa en su árbol de análisis.

Es decir, el significado de cada construcción gramat ical, representada típicam ent e por un no
terminal, solo debe depender de los elementos que aparecen en la part e derecha de sus reglas
de producción.

La lect ura práctica que debe hacerse de est e principio es que para establecer la semántica de
un lenguaje es suficient e con hacerlo sobre cada una de sus reglas de producción de manera
independient e. Esto a su vez se consigue estableciendo una traducción de los elem entos de la
parte derecha de la regla a una representación con un significado computable específico.

Declaración Tipo:= TYPE ID = ARRAY [N..N]

OF Tipo;

Las traducciones con significado computacional específico a las que ant es hacíamos referencia
se pueden clasificar en 2 grandes grupos dependiendo del momento en que se aplican dentro
del ciclo de compilación.

Tipos de acciones de traducción semántica

Tiempo de compilación (semántica estática)

Las traducciones en tiempo de compilación son acciones que se aplican sobre los art efactos del
compilador y que tienen efecto durante el proceso de compilación.

Tiempo de ejecución (semántica dinámica)


Las traducciones en tiempo de ejecución son acciones dirigidas a generar código ejecutable en
tiempo de compilación para que se apliquen durante la ejecución del programa compilado.

3. Análisis sintáctico

Esta es nuestra segunda etapa para generar nuestro compilador.

El analizador sintáctico obtiene una cadena de component es léxicos del analizador léxico, y
comprueba si la cadena puede ser generada por la gramática del programa fuent e.

El análisis sintáctico para generar gramáticas puede ser de dos maneras:

 Análisis sintáctico descendente.

Se considera un intent o de encontrar una derivación por la izquierda para una cadena de
entrada.

También se puede considerar como un int ent o 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.

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.

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

4. Traductores de expresiones simples,

Sint axis abst racta y concreta: un punto de partida út il para considerar la t raducción de una
cadena de entrada es un árbol de sintaxis abstracta, donde cada nodo representa un operador,
y los hijos de ese nodo, los operandos. Por contraste, un árbol de análisis sintáct ico se
denomina árbol de sintaxis concreta, y la gramática subyacent e, sintaxis concreta del lenguaje.
Los arboles de sintaxis abstract a, o simplement e arboles sintáct icos difieren de los árboles de
análisis sintáctico en que las distinciones superficiales de forma, sin importancia en la
traducción, no aparecen en los arboles sintácticos.

Ejemplo:

El árbol sintáctico para 9-5+2 se muestra a continuación, dado que + y – tiene el mismo nivel
de precedencia, y los operadores con igual nivel de precedencia, se evalúan de izquierda a
derecha, el árbol presenta 9-5 agrupado como una buena expresión.

5. Análisis léxico,

El análisis léxico constituye la primera fase, aquí se lee el programa fuente de izquierda a
derecha y se agrupa en component es léxicos (tokens), que son secuencias de caracteres que
tienen un significado. Además, todos los espacios en blanco, líneas en blanco, comentarios y
demás información innecesaria se elimina del programa fuent e. También se comprueba qu e
los símbolos del lenguaje (palabras clave, operadores, et c.) se han escrito correctam ent e.

Como la tarea que realiza el analizador léxico es un caso especial de coincidencia de pat rones,
se necesitan los métodos de especificación y reconocimiento de patrones, se usan
principalment e los aut ómatas finit os que acept en expresiones regulares. Sin embargo, un
analizador léxico también es la part e del t raductor que maneja la entrada del código fuent e, y
puesto que est a entrada a m enudo involucra un im portant e gast o de tiempo, el analizador
léxico debe funcionar de manera tan eficient e como sea posible.

6. Incorporación de una tabla de símbolos,

La tabla de símbolos es una estructura de datos que nos permit e realizar operaciones de
inserción, búsqueda y eliminación de información en varias construcciones del lenguaje
fuent e, la cual es analizada por el compilador originándose un código objet o.

Las principales operaciones de la tabla de símbolos las definimos así:

Inserción: Almacena información proporcionada por las declaraciones de nombre cuando estas
son procesadas.

Búsqueda: Recupera la información asociada con un nombre cuando est e se utiliza en una
declaración o el código asociado.

7. M áquinas de pila abstractas

Una máquina de pila abstracta se basa en una estruct ura de pila, una memoria independient e
para las instrucciones y los datos y tres conjuntos de inst rucciones: las aritmét icas, las de
manipulación de la pila y las de control de flujo.

Así, para calcular la expresión (2+4)* 5, se ejecutarían las siguient es instrucciones (24+5* ):

1. Lee el valor 2 y lo inserta en la pila

2. Lee el valor 4 y lo inserta en la pila

3. Lee el operador +, extrae los dos prim eros valores de la pila, los suma e inserta el resultado
(6) Tema 1 Lenguajes interpret ados.

1. Intérpret es 2. La máquina de pila abstract a

2. Compiladores 2

3. Lee el valor 5 y lo inserta en la pila

4. Lee el operador * , y extrae los dos prim eros valores de la pila, ejecuta la operación e insert a
el resultado (30).
La máquina abstracta trabaja con núm eros ent eros y soporta las instrucciones aritméticas
habituales; cada uno de estos operadores arit méticos (+, -, * , / ) define una operación que se
ha de aplicar sobre los dos prim eros valores de la cima de la pila. Cuando la máquina lee un
operador, extrae los dos prim eros valores de la pila, aplica la operación e int roduce en
resultado en la pila. El conjunto de instrucciones está formado por 18 elem entos.

En binario se pueden codificar utilizando 5 bits, con lo que se pueden generar 32 elem entos
(25); por tanto, en una codificación de 5 bits, t odavía dispondríamos de 14 posiciones libres
para ampliar el conjunto de instrucciones. Dado que un intérpret e para la máquina de pila
abstracta se podría implem entar para muchas máquinas diferent es, es muy important e que la
especificación recoja aspect os propios del hardw are como el tamaño en bits de los datos o el
tamaño de la memoria.

Es responsabilidad del intérprete compatibilizar estas especificaciones con el hardw are


específico sobre el cual se ejecuta. Por ello los intérpret es para lenguajes de programación
portables en diferent es plat aformas también se llaman máquinas virtuales. Es posible
implementar un intérpret e obviando algunas de estas cuestiones si se programa m ediant e un
lenguaje portable como Java.

Un intérprete programado en Java ya es portable porque el mismo lenguaje asegura un mismo


comportamiento del código sobre distintas plataformas: por ejemplo, un ent ero en Java
siempre t endrá un tamaño de 32 bits, sea cual sea la máquina sobre la cual se ejecut e el
programa.

También podría gustarte